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


Comment on Inheritance & polymorphism