考题:对象实例化过程

来源:互联网 发布:上传下载网站源码 编辑:程序博客网 时间:2024/06/06 05:24
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();//调用父类的方法superSystem.out.println("i="+i);}public void dis(){super.display();}}

0 0
原创粉丝点击