Posted on 2007-04-13 09:08
tanzek 阅读(271)
评论(1) 编辑 收藏 所属分类:
技术学习
[问题引出]:
public class Parent
{
public void test()
{}
public Parent()
{
test();
}
public static void main(String [] args)
{
new Child();
}
}
class Child extends Parent
{
private int instanceValue = 20;
public void test()
{
System.out.println("instance value is: " + instanceValue);
}
}
执行Parent的main结果是什么,并说出理由
[回复]:
我试着分析下哦:
很显然,程序是从Main开始执行的,不过执行之前肯定是装载了Parent类的.
当执行new Child();语句时,肯定也会去装载Child类(记住,这是只是装载,装载的同时会完成类的静态成员的初始化工作).这里是请求创建Child的实例,因为Child是Parent的子类,那么肯定是要去先去创建Parent的一个实例的,那么在这个过程中,就会执行了Child的覆盖方法test(),这时,子类中的instanceValue还没有被赋值.因为这时候还没有进行Child的实例创建.
看一下我加入一些状态的程序和执行结果哦.
程序清单:
public class Parent
{
public void test() {
System.out.println("In Parent Class.");
}
public Parent() {
System.out.println("In Parent Constructor");
test();
}
public static void main(String [] args) {
System.out.println("In Main Function.");
new Child();
}
}
class Child extends Parent {
private int instanceValue = 20;
public void test() {
System.out.println("In Child Class.");
System.out.println("instance value is: " + this.instanceValue);
}
public Child() {
System.out.println("In Child Constructor.");
}
}
执行结果(主要是看执行顺序哦):
In Main Function.
In Parent Constructor
In Child Class.
instance value is: 0
In Child Constructor.
嘿嘿,应该懂了吧!~ 你可以试着把instanceValue的修饰符改为static试试哦.