package test;
/**
* 对象实例化过程:
* 1,首先加载类,如果发现有父类,先加载父类再加载子类。
* 2,依次为类的属性分配空间并执行默认初始化.如int默认初始化为0,boolean变量为false。
* 3,然后调用Child()构造器。由于Child()的构造器里没有显式使用super()来调用父类构造器,因此
* 系统将自动调用Base()类中无参构造器来执行初始化。
* 4,执行Base()构造器时,先将Base类里的属性i赋值为2,然后执行构造器里的this.display()方法。
* 注意:此时,这里的this指的是创建的Child()对象。所以会调用子类的display()方法。而此时子类的属性i还是默认初始值,所以打印出0。
* 5,Base()执行完之后,开始执行子类的构造器。在执行Child()时,会依次执行i=22,i=600,然后执行构造器里的i=222。至此,对象实例化过程完毕。
*
* 考核要点:
* 1,必须说到类加载顺序。先加载父类,再加载子类的。
* 2,如何证明Base()里的this是创建的子类对象,通过this.getClass()可以查看。
* 3,如果子类没有重写display()方法,则会调用父类的display()方法。
* 4,每一步的图必须画清晰。
* 5,有同学会问,只能打印出子类的属性i,那么如何打印出父类的属性i呢?可以在display()方法里使用
* super.display()方法。
* 6,必须说到代码块与初始化语句的执行顺序。
*
*/
public class Test {
public static void main(String[] args) {
Base child=new Child();
}
}
class Base{
public int i=2;
public Base(){
this.display();//构造器里面的this指的是要创建的对象。
System.out.println(this.getClass());
//this.dis(); //编译不通过,this是指的父类(Base)要创建的对象
}
public void display(){
System.out.println("i"+i);
}
}
class Child extends Base{
public int i=22;
{
i=600;
}
public Child(){
i=222;
}
public void display(){
super.display();//调用父类的方法super
System.out.println("i="+i);
}
public void dis(){
super.display();
}
}
考题:对象实例化过程
最新推荐文章于 2020-03-31 13:31:16 发布