Pet p = new Cat(Color.BLACK);
if(Math.random() < 0.5)
p = new Dog("Clifford", "Big Red");
System.out.println(p.getName()); // line 1 (Pet)
System.out.println(p.getBreed()); // line 2 (error)
System.out.println(p.getColor()); // line 3 (error)
System.out.println(p.toString()); // line 4 (Pet or Dog)
System.out.println(p); // line 5 (same as line 4)
The first rule of polymorphism is: The variable/reference type determines what methods can be run.
The second rule of polymorphism is: The object/instance type determines what method is actually run. The most specific method possible is run.
The variable/reference type of p is Pet.
The object/instance type is either Cat or Dog, depending on the random number generated. The condition evalutes to true with a 50% probability. See Generate random numbers with Math.random().
line 4 is an example of a polymorphic method call. toString can be called because Pet, the variable/reference type, has the method. This check is done at compile time.
The specific method that is actually called depends on the actual object/instance type when the code is run. This determination is made at run time. If the object is of type Cat, line 4 runs the Pet toString method, since Cat doesn’t override toString. If the object is of type Dog, line 4 runs the Dog toString method.
The remaining lines behave the same as in the inheritance exercise. line 2 and line 3 are compile time errors. line 1 runs the Pet getName method since no other class overrides getName.
Back to Inheritance and polymorphism