| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 687 人关注过本帖
标题:这个题为什么输出结果是这样的?
只看楼主 加入收藏
Grace_TT
Rank: 1
等 级:新手上路
威 望:1
帖 子:324
专家分:0
注 册:2005-12-21
收藏
 问题点数:0 回复次数:6 
这个题为什么输出结果是这样的?

public class Test3 extends Test4
{
int i=30;
Test3()
{
print();
i=40;
}
public static void main(String[] args)
{
System.out.println(new Test3().i);
}
void print()
{
System.out.println(i);
}
}
class Test4
{
int i=10;

Test4()
{
print();
i=20;
}
void print()
{
System.out.println(i);
}
}

输出结果:
0 //这里,为什么是0而不是10?
30
40
Press any key to continue...

这个程序是怎样执行的?

[此贴子已经被作者于2006-4-13 9:38:29编辑过]

搜索更多相关主题的帖子: 结果 输出 
2006-04-13 09:35
千里冰封
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:灌水之王
等 级:版主
威 望:155
帖 子:28477
专家分:59
注 册:2006-2-26
收藏
得分:0 

这个程序的执行过程你得清楚
一个有继承关系的类之间
它是先初始化父类的成员变量和调用父类的构造函数,然后再去初始化子类的成员变量和调用子类的构造函数

它的执行过程是这样的:
new Test3().i,它先必须构造一个Test3的对象,但是Test3又是继承自Test4的,所以这个时候,类装载器就会去装载Test4的类了,所以这个时候就把Test4这个类装进来,先把Test4里面的成员变量i初始化了,这个时候,i=10,然后它再去调用Test4的构造函数,在构造函数里面,它发现有一个函数叫print(),于是它会就去找这个函数,关键在于它会调用哪个函数呢,是父类的还是子类的,根据JAVA的动态绑定,它会调用子类的,因为此时它要构造的对象的引用就是指向子类的,虽然此时此刻它正在调用父类的构造函数,但是你得清楚,它调用父类的构造函是为了构造子类的对象啊。所以这个时候它调用了子类的print()函数,而print()函数又要用到一个变量i,要看清楚,此时子类也显示的声明了一个成员变量i.所以这个时候,它就把父类的i给屏避了,而此时子类的i显然是没有初始化的,所以它的值会是0,所以打印出来的结果就是0了,然后在父类构造函数中,再把20赋给父类中的i,这个时候,父类的初始化工作算是完成了,然后再初始化子类了,这个时候,先把子类的成员变量初始化,把子类的i赋值30,然后再调用print()函数,这个时候显然就是调用子类的了,这个时候i已经赋值30,所以打印出30,然后再把40赋给i,然后子类Test3的对象构造完成。
这个时候调用Test3对象的i,它当然是40了,所以最后打印出40

初始化顺序。
父类静态成员,子类静态成员,父类成员变量,父类构造函数,子类成员变量,子类构造函数。


可惜不是你,陪我到最后
2006-04-13 10:45
chujun69
Rank: 1
等 级:新手上路
帖 子:38
专家分:0
注 册:2006-4-11
收藏
得分:0 
果然是猛男型人物

中国首款免费实奖休闲游戏,http://www. 推荐人写chujun69有外挂送,QQ:79147981
2006-04-13 11:09
Grace_TT
Rank: 1
等 级:新手上路
威 望:1
帖 子:324
专家分:0
注 册:2005-12-21
收藏
得分:0 
以下是引用千里冰封在2006-4-13 10:45:00的发言:

这个程序的执行过程你得清楚
一个有继承关系的类之间
它是先初始化父类的成员变量和调用父类的构造函数,然后再去初始化子类的成员变量和调用子类的构造函数

它的执行过程是这样的:
new Test3().i,它先必须构造一个Test3的对象,但是Test3又是继承自Test4的,所以这个时候,类装载器就会去装载Test4的类了,所以这个时候就把Test4这个类装进来,先把Test4里面的成员变量i初始化了,这个时候,i=10,然后它再去调用Test4的构造函数,在构造函数里面,它发现有一个函数叫print(),于是它会就去找这个函数,关键在于它会调用哪个函数呢,是父类的还是子类的,根据JAVA的动态绑定,它会调用子类的,因为此时它要构造的对象的引用就是指向子类的,虽然此时此刻它正在调用父类的构造函数,但是你得清楚,它调用父类的构造函是为了构造子类的对象啊。所以这个时候它调用了子类的print()函数,而print()函数又要用到一个变量i,要看清楚,此时子类也显示的声明了一个成员变量i.所以这个时候,它就把父类的i给屏避了,而此时子类的i显然是没有初始化的,所以它的值会是0,所以打印出来的结果就是0了,然后在父类构造函数中,再把20赋给父类中的i,这个时候,父类的初始化工作算是完成了,然后再初始化子类了,这个时候,先把子类的成员变量初始化,把子类的i赋值30,然后再调用print()函数,这个时候显然就是调用子类的了,这个时候i已经赋值30,所以打印出30,然后再把40赋给i,然后子类Test3的对象构造完成。
这个时候调用Test3对象的i,它当然是40了,所以最后打印出40

初始化顺序。
父类静态成员,子类静态成员,父类成员变量,父类构造函数,子类成员变量,子类构造函数。

向你敬礼!呵呵。

2006-04-13 19:31
bigboy000
Rank: 2
等 级:新手上路
威 望:3
帖 子:45
专家分:0
注 册:2006-4-2
收藏
得分:0 
好版主!

2006-04-13 22:27
★王者至尊★
Rank: 1
等 级:新手上路
帖 子:528
专家分:0
注 册:2006-3-28
收藏
得分:0 
这个问题具有代表性
冰封的解答让我彻底明白了
也谢了

------Java 爱好者,论坛小混混,学习中------
2006-04-13 22:33
164726003
Rank: 1
等 级:新手上路
帖 子:114
专家分:0
注 册:2005-7-12
收藏
得分:0 
以下是引用千里冰封在2006-4-13 10:45:00的发言:

这个程序的执行过程你得清楚
一个有继承关系的类之间
它是先初始化父类的成员变量和调用父类的构造函数,然后再去初始化子类的成员变量和调用子类的构造函数

它的执行过程是这样的:
new Test3().i,它先必须构造一个Test3的对象,但是Test3又是继承自Test4的,所以这个时候,类装载器就会去装载Test4的类了,所以这个时候就把Test4这个类装进来,先把Test4里面的成员变量i初始化了,这个时候,i=10,然后它再去调用Test4的构造函数,在构造函数里面,它发现有一个函数叫print(),于是它会就去找这个函数,关键在于它会调用哪个函数呢,是父类的还是子类的,根据JAVA的动态绑定,它会调用子类的,因为此时它要构造的对象的引用就是指向子类的,虽然此时此刻它正在调用父类的构造函数,但是你得清楚,它调用父类的构造函是为了构造子类的对象啊。所以这个时候它调用了子类的print()函数,而print()函数又要用到一个变量i,要看清楚,此时子类也显示的声明了一个成员变量i.所以这个时候,它就把父类的i给屏避了,而此时子类的i显然是没有初始化的,所以它的值会是0,所以打印出来的结果就是0了,然后在父类构造函数中,再把20赋给父类中的i,这个时候,父类的初始化工作算是完成了,然后再初始化子类了,这个时候,先把子类的成员变量初始化,把子类的i赋值30,然后再调用print()函数,这个时候显然就是调用子类的了,这个时候i已经赋值30,所以打印出30,然后再把40赋给i,然后子类Test3的对象构造完成。
这个时候调用Test3对象的i,它当然是40了,所以最后打印出40

初始化顺序。
父类静态成员,子类静态成员,父类成员变量,父类构造函数,子类成员变量,子类构造函数。

学到了点东西


坚持!!!
2006-04-13 22:50
快速回复:这个题为什么输出结果是这样的?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.026970 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved