我们都知道继承是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。
因此,通过以上试验,我们可以得出如下的结论:先初始化父类,再初始化子类。先执行初始化对象中属性,再执行构造方法中初始化。