posts - 134,  comments - 242,  trackbacks - 0

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结果是什么,并说出理由


instance value is:0

答案是对的,我想知道为什么?

posted on 2007-04-12 23:30 -274°C 阅读(294) 评论(4)  编辑  收藏 所属分类: JAVA


FeedBack:
# re: 群里看到个问题
2007-04-13 09:05 | 五大郎
我试着分析下哦:

很显然,程序是从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试试哦.
  回复  更多评论
  
# re: 群里看到个问题[未登录]
2007-04-14 14:10 | αβγ
thanks  回复  更多评论
  
# re: 群里看到个问题
2007-04-20 13:37 | 我为J狂
@五大郎
受益匪浅,讲得很透彻。  回复  更多评论
  
# re: 群里看到个问题
2007-04-23 17:00 | ZelluX
@五大郎
赞!  回复  更多评论
  

标题  
姓名  
主页
验证码 *  
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2007-05-11 10:05 编辑过
 
 
相关链接:
网站导航:

<2007年4月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

常用链接

留言簿(11)

随笔分类(139)

随笔档案(134)

JAVA网站

关注的Blog

最新随笔

搜索

  •  

积分与排名

  • 积分 - 84747
  • 排名 - 95

最新评论

阅读排行榜

评论排行榜