多继承的构造顺序:Java中,父类和子类的构造顺序和时机来源: 发布时间:星期四, 2009年2月12日 浏览:109次 评论:0
下面是个完整测试类: /** *@(#)TestJava.java2008-2-22 * *Copyright2007GeneralData,Inc.Allrightsreserved. */ packagecom.bbebfe; /** *这个类测试父类和子类构造时机 *父类中有个(抽象)思路方法prt; *子类(实现)覆盖了这个思路方法并打印\"inchild\"+ii是 *子类中定义个成员字段设定初值为10 * *在父类构造中prt *如果能够成功介绍说明子类对象在子类构造思路方法执行前 *已经在内存中构造好了(父类构造思路方法会在子类构造 *思路方法前执行)如果子类对象没有在内存中存在则 *不可能执行打印更不能打印成员字段i * *最终执行结果是成功打印\"inchild0\"介绍说明能够执行打印 *介绍说明子类对象内存已经分配 *但i值打印为0介绍说明内存虽然已经分配但成员字段尚未执行显示化 *默认化为0 *在Child构造中打印i值为10介绍说明成员字段显示化在内存分配 *和构造体的间进行 * *因此可以看出个Java对象具体构造过程(不包含静态结构): *1.父类对象内存分配 *2.父类字段默认化 *3.子类对象内存分配 *4.子类字段默认化 *5.进入父类构造->父类成员显示化(定义字段时设置字段初值) *->执行父类构造体(此时可以抽象思路方法所有父类字段已 *化完毕但子类字段尚未进行显示化) *6.进入子类构造->子类成员显示化(定义字段时设置字段初值) *->执行子类构造体(此时所有字段已经显示化) * *因此父类构造中可以抽象思路方法(子类实现)但最好 *不要这样做子类对象仅仅分配了内存和默认化还没有 *进行显示化 *@projectTestJava *@authorchenhao *@version1.0.0,2008-2-22 */ publicTestJava{ publicvoid(Stringargs){ Childc=Child; } } ChildextendsFather { i=10; /** *这个构造思路方法是没有必要写默认构造 *肯定是按这个顺序执行但为了表示明确 *目因此把这个默认构造写出来 * */ publicChild{ super; .out.prln(i); } @Override publicvoidprt{ .out.prln(\"inchildi=\"+i+\"k=\"+k); } } abstractFather { protectedk=5; publicFather{ prt; } publicvoidprt{ .out.prln(\"inFatherk=\"+k); } } 0
相关文章读者评论发表评论 |