JAVA中继承时的初始化顺序

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

     我们都知道继承是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。


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