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