这主要是this的问题
假如你在test2中写 user = this.getPassword();//估计就应该是test2了。

解决方案 »

  1.   


            System.out.println(this.user);//这里打印的为什么是"test2",而不是"test4"         注意 this
            user = getPassword();//这里执行的为什么是test3的方法,而不是本身定义的方法呢        test4 extends test3, 当然用 test3 的方法, 除非 test3并没有复写test2的方法
      

  2.   


            System.out.println(this.user);//这里打印的为什么是"test2",而不是"test4"         注意 this
            user = getPassword();//这里执行的为什么是test3的方法,而不是本身定义的方法呢        test4 extends test3, 当然用 test3 的方法, 除非 test3并没有复写test2的方法
      

  3.   

    对啊,this用了就保证是本类中的,不用的话要看情况,你这里test4是个继承类,在test3中已经重写了test2的getpassword()方法了,所以就会调用test3中的方法.
    总是调用最近的一级父类的方法的.
      

  4.   

    to toobug(toobug) 
    返回到最上层的基类开始调用,也就是说getUser方法是在test2中执行的所以打印的是"test2",那么在执行getUser的期间调用了getPassword怎么又跑到test3的方法里去了,test2不是自己已经定义了getPassword方法吗,难道此方法因为被覆写了,就无效了吗。
      

  5.   

    这是个作用域的问题!
    由于在继承中,只是针对方法的覆盖,对于属性并没有覆盖的作用。那样来说,user这个属性,在一个test4的对象里面就有3份!在test4的作用范围内,他就是test4,test3的范围内就是test3.这个问题,可能比较难以让人理解。但是你想一下类代码的调用方式你就明白了!如果你学过c的话,你肯定知道,全局变量带来的副作用,哈哈,跟这个类似!不过这个问题,好像还真不是个一般的问题,我用jb跟踪执行的时候,那个user一直是test4,但是实际输出的就不是了!不知道jb的调试工具,对这个问题怎么考虑的!
      

  6.   

    不过我试了下,写了this.getPassword()也是一样的输出结果,也纳闷了,this的完整定义是什么呢?
      

  7.   

    以下是本人的理解,不知道是否正确
    当test4调用getUser方法时找到的是test2的getUser方法,但在执行的时候碰到getPassword方法调用,又跑到test3的方法里去了,所以结果打印的是"test2","test3",但这个执行流程是不是有点太不好理解了(当test2的getUser方法执行的时候,一个现成的getPassword方法不用,偏要去调用test3的getPassword方法)写得比较罗嗦,请不要介意
      

  8.   

    难道this不是传的当前对象的句柄吗?
      

  9.   

    根据打印的结果,很明显传的是test2的句柄
      

  10.   

    那你看我上面说了,写this.getpassword()于是一样调用了test3的方法啊,结果一样的,怎么就没调test2的句柄呢?
      

  11.   

    miaoliujun(傲龙):这主要是this的问题
    假如你在test2中写 user = this.getPassword();//估计就应该是test2了。测试了一下,test2中改成user = this.getPassword(),运行结果还是一样:test2,test3
    我也搞不明白了,请高手指教一下。
      

  12.   

    this传的是当前调用方法的对象的句柄,在本例中是test4,而它有三个user属性,它们是有各自的属性域的,即在test2中只显示"test2",即在test3中只显示"test3"(若在test3中也重写一段getuser(),那就会显示"test3",感觉就是三个属性只在自己娘家才会显现出对应的那个);对于方法,则只是调用最近一层父类的方法,所以调用test3的getpassword()方法.
      

  13.   

    实践了下,往上再写了个test1,也是这样的,就会显示结果test1,test3
      

  14.   

    现在我想证明一下,那个this是指向的test4吗,然后在结帖
      

  15.   

    我在test2的方法中加入如下代码,证明specialsoldier(雪地撒野)讲的是正确的System.out.println(this.getClass().getName());
      

  16.   

    请大家也可以实验实验。感谢大家的热心讨论,特别是specialsoldier(雪地撒野)先生
      

  17.   

    估计是,因为getUser()方法是在test2中定义的,
    System.out.println(this.user);//这个user是在test2的作用域中,因此调用的是test2的成员变量user
      

  18.   

    这个涉及到了构造方法和普通方法的继承与覆盖的问题,在test4调用getUser()时,自身没有此方法,t4会通过test4的构造方法会去调用test3的构造方法,同例。test3的构造方法也会访问test2的构造方法,实现上溯,t4成为test2的对象,所以打印的是“test2”,这里即使去掉 this结果也一样。
    而当t4调用getpassword()时,test3的这个方法覆盖了test2的这个方法,实际上t4是将自己上溯变成了(test3),所以打印为test3.
    不知各位意见如何???