做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
...全文
477 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
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不是传的当前对象的句柄吗?
加载更多回复(10)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧