public class Hello { /**
 * @param args
 */
public static void main(String[] args) {
A x = new A();
A y = new AA();
System.out.println("x="+x.i+"    "+"y="+ y.i); }}
class A{
 public int i; A()
{
i = 1;
}

}
 
class AA extends A{
public int i; AA()
{
i = 2;
}

}
问:为什么 输出结果为x=1    y=1;而不是y=2;谢谢

解决方案 »

  1.   

    先找点书看看继承中field的隐藏问题。
      

  2.   

    他发这个问题已经不是菜鸟问题,下面是我的总结,你先熟记,会使用,碰到类似的题目不迷惑了,以后再研究为什么在继承中,用对象或者this.调方法与调用属性是不同的,楼主你只要熟记: 
    父引用(此时必须是子对象)调 重写的member方法时,是调子类的member方法, 
    父引用(此时必须是子对象)调 重写的static方法时,是调父类的static方法, 
    父引用(此时必须是子对象)调 属性(不管是member属性还是static属性),是调父类的属性。 父引用(装父对象)调方法和属性时就只能调父类的,不能调子类的。 this.  member方法时 也是找子类的重写方法, 
    this.  static方法时  调的是书写这个 "this." 类区的static方法, 
    this.  属性(不管是member还是static)都是调的是书写这个 "this." 类区的static方法, 你的y是个父引用(装子对象) 此时y.i  就是调父类class A{}里的i,所以输出是1
      

  3.   

    The  Java Programming Language
    这本书里介绍的最权威,也比较清楚。
      

  4.   

    niuniu20008  非常谢谢你 我暂时把你给的东西记住
    ZangXT  也谢谢你介绍这本书给我看 
      

  5.   

    简单的来说,由于你的y是以A类型来声明的,所以你直接调用y.i的时候实际上调用的是A类型对应的i