class B 
{
   String name = "我没变!";
   
    public String getN()
    {
     return this.name;
    }
}public class Hello extends B
{
 String name ="dddd!";
    public static void main(String [] args)
    {
        Hello c = new Hello();
        B b = new B();
         c.name="aa";
       
        System.out.println(b.getN());
        System.out.println(c.getN());
        System.out.println(c.name);
    }
}结果:
我没变!
我没变!
aa问题:为什么c.getN()与b.getN()的返回值一样,反而与c.name不一样,c.name和c.getN()的返回值应该一样呀?

解决方案 »

  1.   

    你的hello继承自B,在hello再写啦一个string name;这叫覆盖。也可以理解为hello中的name把B中的name隐藏啦,需要特殊的方法才能调用,两个name是不同的存在。而你的B中的getN()方法没有在hello中被重写,所以getN()返回的是父类中的name的值。这就是为什么第一个输出是:我没变。第二个输出就不用解释啦。第三个输出,因为c.name这条语句是调用子类中的name,父类的name的值并没有改变。所以第三条语句输出aa.
      

  2.   

    我的疑问就是为什么c.getN()输出的值与c.name不一样?在getN()里返回的是this.name,如果是用c去调用get()那么返回的因该是c.name,而c.name值因该是aa,但是现在的返回的却是b.name的值"我没变!",难道当调用c.getN()时,里面的this指向b这个对象?
      

  3.   

    正确。楼主,你不要忘啦你的this在在父类,而你在子类中并没有重写该方法,所以你的this.name是指父类的name。而你c.name="aa";改变的是子类name的值。
      

  4.   

    需要好好理解
    子类继承父类,可以更改父类,this调用父类的值,重载,初始化
    这些东西容易忘,时间稍微一长就忘了