做java半年,却被一个继承的问题弄糊涂了,请大家帮帮忙

parisli 2005-03-21 03:51:32
现有三个类,test4继承至test3,test3继承至test2,有两处疑问已在代码里标出,请大家仔细看看,谢谢!!!

public class test2 {
public String user = "test2";

public test2() {
}

public String getUser(){
System.out.println(this.user);//这里打印的为什么是"test2",而不是"test4"
user = getPassword();//这里执行的为什么是test3的方法,而不是本身定义的方法呢
return user;
}

public String getPassword(){
System.out.println(this.user);
return "hello test2";
}
}

public class test3 extends test2{
public String user = "test3";

public test3() {
}

public String getPassword(){
System.out.println(this.user);
return "hello test3";
}
}

public class test4 extends test3{
public String user = "test4";

public test4() {
}

public static void main(String[] args){
test4 t4 = new test4();
t4.getUser();
}
}

输出结果是:test2,test3
...全文
444 点赞 收藏 30
写回复
30 条回复
wmzsl 2005年03月22日
这个属于变态问题!可以不用管哈
回复 点赞
milkandcoffee 2005年03月22日
这个涉及到了构造方法和普通方法的继承与覆盖的问题,在test4调用getUser()时,自身没有此方法,t4会通过test4的构造方法会去调用test3的构造方法,同例。test3的构造方法也会访问test2的构造方法,实现上溯,t4成为test2的对象,所以打印的是“test2”,这里即使去掉 this结果也一样。
而当t4调用getpassword()时,test3的这个方法覆盖了test2的这个方法,实际上t4是将自己上溯变成了(test3),所以打印为test3.
不知各位意见如何???
回复 点赞
alexanderf 2005年03月22日
刚开始学,向各位前辈好好学习
回复 点赞
iorifly 2005年03月21日
估计是,因为getUser()方法是在test2中定义的,
System.out.println(this.user);//这个user是在test2的作用域中,因此调用的是test2的成员变量user
回复 点赞
jstars 2005年03月21日
把this去掉,this代表本类
回复 点赞
parisli 2005年03月21日
请大家也可以实验实验。感谢大家的热心讨论,特别是specialsoldier(雪地撒野)先生
回复 点赞
parisli 2005年03月21日
我在test2的方法中加入如下代码,证明specialsoldier(雪地撒野)讲的是正确的

System.out.println(this.getClass().getName());
回复 点赞
parisli 2005年03月21日
现在我想证明一下,那个this是指向的test4吗,然后在结帖
回复 点赞
specialsoldier 2005年03月21日
实践了下,往上再写了个test1,也是这样的,就会显示结果test1,test3
回复 点赞
iorifly 2005年03月21日
恩,只能是这样才解释得通了
对成员变量和成员函数是区别对待的
回复 点赞
specialsoldier 2005年03月21日
this传的是当前调用方法的对象的句柄,在本例中是test4,而它有三个user属性,它们是有各自的属性域的,即在test2中只显示"test2",即在test3中只显示"test3"(若在test3中也重写一段getuser(),那就会显示"test3",感觉就是三个属性只在自己娘家才会显现出对应的那个);对于方法,则只是调用最近一层父类的方法,所以调用test3的getpassword()方法.
回复 点赞
iorifly 2005年03月21日
知道了就说撒
回复 点赞
parisli 2005年03月21日
知道就说嘛
回复 点赞
specialsoldier 2005年03月21日
我知道了
回复 点赞
iorifly 2005年03月21日
miaoliujun(傲龙):这主要是this的问题
假如你在test2中写 user = this.getPassword();//估计就应该是test2了。

测试了一下,test2中改成user = this.getPassword(),运行结果还是一样:test2,test3
我也搞不明白了,请高手指教一下。
回复 点赞
specialsoldier 2005年03月21日
等等,再查查资料,有高手来指点的会
回复 点赞
parisli 2005年03月21日
难道只能这样结帖了吗?
回复 点赞
specialsoldier 2005年03月21日
那你看我上面说了,写this.getpassword()于是一样调用了test3的方法啊,结果一样的,怎么就没调test2的句柄呢?
回复 点赞
parisli 2005年03月21日
根据打印的结果,很明显传的是test2的句柄
回复 点赞
specialsoldier 2005年03月21日
难道this不是传的当前对象的句柄吗?
回复 点赞
发动态
发帖子
Java SE
创建于2007-09-28

3.4w+

社区成员

30.7w+

社区内容

Java 2 Standard Edition
社区公告
暂无公告