测试目的
- 验证抽象类及子类实例化顺序;
- 验证抽象类是否可以在子类未实例化时调用子类实现的抽象方法;
- 验证java的多态性
实例
抽象类:
package com.secbro.test.abstractInit; /** * @author zhuzhisheng * @Description * @date on 2016/5/28. */ public abstract class Fruit { protected Fruit(){ System.out.println("实例化父类"); toPlant(); toEat(); } protected abstract void toEat(); protected abstract void toPlant(); }
子类Banana:
package com.secbro.test.abstractInit; /** * @author zhuzhisheng * @Description * @date on 2016/5/28. */ public class Banana extends Fruit{ protected Banana(){ System.out.println("实例化子类 Banana"); } @Override protected void toEat() { System.out.println("Eat a Banana"); } @Override protected void toPlant() { System.out.println("Plant a Banana"); } }
子类Orange:
package com.secbro.test.abstractInit; /** * @author zhuzhisheng * @Description * @date on 2016/5/28. */ public class Orange extends Fruit{ public Orange() { System.out.println("实例化子类 Orange"); } @Override protected void toEat() { System.out.println("Eat a Orange"); } @Override protected void toPlant() { System.out.println("Plant a Orange"); } }
测试类:
package com.secbro.test.abstractInit; /** * @author zhuzhisheng * @Description * @date on 2016/5/28. */ public class TestFruit { public static void main(String[] args) { new Banana(); new Orange(); } }
执行结果打印:
实例化父类 Plant a Banana Eat a Banana 实例化子类 Banana 实例化父类 Plant a Orange Eat a Orange 实例化子类 Orange
结果分析
查看子类、抽象类的构造方法打印结果可知,实例化子类时先实例化父类。
在抽象类的构造方法中调用了自己未实现的抽象方法,那么对应实例化的子类实现了此方法,在抽象类实例化之后,子类未实例化之前,抽象类可以调用子类实现的抽象方法。
不同的类实例化打印不同的抽象方法实现,java多态的一种表现形式。