继承和多态、组合下的构造器调用顺序

Java类中的构造器是隐式static的,每个类都有一个默认构造器,在实例化类的对象时就要执行,并检查对象是否被正确的构造。那么当一个派生类甚至多层继承的类被实例化时,执行顺序是怎样的呢?

下面进行测试

测试代码

    public class Test {
        public static void main(String[] args) {
            MaleShepherdDog maleShepherdDog = new MaleShepherdDog();
        }
    }

    class Insect {
        public Insect() {
            System.out.println("Insect");
        }
    }

    class Animal {
        public Animal() {
            System.out.println("Animal");
        }
    }

    class Human {
        public Human() {
            System.out.println("Human");
        }
    }

    class Plane {
        public Plane() {
            System.out.println("Plane");
        }
    }

    class Dog extends Animal {
        public Dog() {
            System.out.println("Dog");
        }
    }

    class ShepherdDog extends Dog {
        public ShepherdDog() {
            System.out.println("ShepherdDog");
        }
    }

    // 实现第三重继承的子类作为测试
    class MaleShepherdDog extends ShepherdDog {
        // 实例化三个非继承关系的对象
        private Insect insect = new Insect();
        private Human human = new Human();
        private Plane plane = new Plane();
        // 构造方法
        public MaleShepherdDog() {
            System.out.println("MaleShepherdDog");
        }
    }

执行结果

Animal
Dog
ShepherdDog
Insect
Human
Plane
MaleShepherdDog

问题总结

  1. 调用基类构造器。从最顶层基类开始,依次向下。
  2. 按声明顺序调用类成员的初始化方法。
  3. 调用本类构造器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值