zl程序教程

您现在的位置是:首页 >  后端

当前栏目

Java抽象类及子类实例化顺序和方法调用顺序测试

JAVA实例方法测试 调用 顺序 抽象类 子类
2023-09-27 14:28:50 时间

测试目的

  1. 验证抽象类及子类实例化顺序;
  2. 验证抽象类是否可以在子类未实例化时调用子类实现的抽象方法;
  3. 验证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

结果分析

  1. 查看子类、抽象类的构造方法打印结果可知,实例化子类时先实例化父类。
  2. 在抽象类的构造方法中调用了自己未实现的抽象方法,那么对应实例化的子类实现了此方法,在抽象类实例化之后,子类未实例化之前,抽象类可以调用子类实现的抽象方法。
  3. 不同的类实例化打印不同的抽象方法实现,java多态的一种表现形式。