public class TestFruits { public static void main(String[] args) { Apple a = new Apple(2); System.out.println(Apple.count); System.out.println(); Fruit[] fr = new Fruit[3]; fr[0] = a; fr[1] = new RedDelicious(); fr[2] = new Fruit(4); System.out.println(); System.out.println("Using array fr: "); for(int i = 0; i < fr.length; i++) { fr[i].display(); System.out.println(Apple.count); System.out.println(); } } } class Fruit { public int f; public Fruit(int f) { System.out.println("Fruit"); this.f = f; } public int getF() { return this.f; } public void f1() { System.out.println("FRUIT f1"); } public void f2() { f1(); System.out.println("FRUIT f2"); } public void display() { System.out.println("display method from Fruit invoked"); f2(); } } class Apple extends Fruit { public static int count = 0; public Apple(int a) { super(a); System.out.println("Apple"); count = count + getF(); } public void f1() { System.out.println("Apple f1"); } public void f2() { f1(); System.out.println("Apple f2"); super.f1(); } public void display() { System.out.println("display method from Apple invoked"); f2(); } } class RedDelicious extends Apple { public static int count; public RedDelicious() { super(3); System.out.println("RedDelicious"); count = count + getF(); } public void f1() { System.out.println("RedDelicious f1"); } public void f2() { f1(); System.out.println("RedDelicious f2"); super.f1(); } public void display() { System.out.println("display method from RedDelicious invoked"); f1(); } }