JAVA中继承时的初始化顺序

时间:2023-02-15 19:37:20

     我们都知道继承是JAVA面向对象中的一个很重要的特性。那么你有没有思考过当我们使用继承这个特性的时候,程序是如何执行的呢?也就是说,继承的初始化顺序到底是怎么样的。接下来我就要用eclipse来试验一下了。

   首先,我们可以创建一个Animal的类,然后写上构造方法。

   

package com.yangyi;

public class Animal {
public String name;

public int age;

public void eat(){
System.out.println("动物可以吃东西");
}

public Animal(){
System.out.println("Animal构造方法执行了");
}
}

   然后,再创建一个Dog类(继承自Animal类),同时也写上自己的构造方法。

  

package com.yangyi;

public class Dog extends Animal {
public Dog(){
System.out.println("Dog构造方法执行了");
}
}

   我们接着在主函数里面创建一个Dog类对象,然后执行起来,查看结果。

  

package com.yangyi;

public class Initial {

public static void main(String[] args) {
// TODO Auto-generated method stub
Dog dog=new Dog();
dog.age=10;
dog.name="xiaobai";

}

}

   输出结果是:

                Animal构造方法执行了

                Dog构造方法执行了

  从这里我们可以得到一个结论:当我们在创造一个子类对象的时候,会先创建它的父类对象,然后再创建这个子类对象。


    接下来我们再讨论另一种情况:如果对象里面有属性和构造方法,我们先执行哪一个呢?同样的我们用eclipse来验证一下。

    首先我们可以可以给Animal类中的age直接赋一个初值,然后再构造方法里也将age进行初始化。

package com.yangyi;

public class Animal {
public String name;

public int age=10;//赋初值

public void eat(){
System.out.println("动物可以吃东西");
}

public Animal(){
System.out.println("Animal构造方法执行了");
age=20;//使用构造方法初始化
}
}

    在主函数里面创建一个Animal类的对象然后输出age的值,进行判断。

      

package com.yangyi;

public class Initial {

public static void main(String[] args) {
// TODO Auto-generated method stub
Dog dog=new Dog();
dog.age=10;
dog.name="xiaobai";

Animal animal=new Animal();//创建一个对象
System.out.println("age:"+animal.age);
//通过输出的值来判断初始化顺序,如果是10,先调用构造方法初始化
//如果是20,先通过赋值进行初始化
}

}


   最后输出:age的值为20。


   因此,通过以上试验,我们可以得出如下的结论:先初始化父类,再初始化子类。先执行初始化对象中属性,再执行构造方法中初始化。