class A
{
public int i = 10;
}class B extends A
{
         public int i = 8;  //编译无错误,请问到底B类中现在有几个i,如果是子类覆盖了A类的i,哪我们怎样在B的方法show中访问A中的i

         void show()
         {
                   System.out.println("B类中的show方法被调用了, i = " + i);
          }
}class  M
{
          public static void main(String[] args)
          {
                     new B().show();                    System.out.printf("拉拉! 2008年10月29日11:26:35");
           }
}
/*
在JDK 1.6中的运行结果是:
--------------------------
B类中的show方法被调用了, i = 8
拉拉! 2008年10月29日11:26:35
--------------------------
*/

解决方案 »

  1.   

    属性没有覆盖的概念,如果同名,这是一种隐藏,访问父类中定义的field,使用super.i
      

  2.   

    Java没有真正的属性的,都是方法模拟的,只要是PUBLIC方法,就是多态的。你想想
      

  3.   

    方法有覆盖,属性是隐藏。要输出父类的i要用super关键字
      

  4.   

    非常感谢大家 不过小弟还有一问题
    如:
    class  A
    {
        public int i= 10;
    }class B
    {
        public int i= 8;
    }class C
    {
        public int i= 6;   void show()
       {
           //我既想访问C自身的i,又想访问B中的i, 还想访问A中的i,代码该如何写????????????? 
       }
    }
      

  5.   

    构造B.C类的对象!对象.i看看行不行!
      

  6.   

    如果像楼主给出的代码那样的话,
    C必须要有A类和B类的对象才能访问他们的i
    要不然就把A类和B类中的i改成静态的,那么就可以
    使用A.i和B.i来访问了
      

  7.   


    new C().i ;
    new B().i ;
    new A().i ;这就分别访问了
      

  8.   

    父类的对象是调用的父类的属性,子类的对象是调用子类的属性,如果想使用父类的属性使用super,高手给解下是否是这样?
      

  9.   

    父类的对象调用的是父类的属性,子类的对象调用的是子类的属性,若子类想调用父类的属性可以使用super,高手给解下是否如此
      

  10.   


    加一点:子类与父类的属性可同名,而且可以改变子类的访问权限,但子类的属性的权限不能高于父类的。也就是如果父类是public int i;在子类就可以定义成:private int i;反之是不可以的。
      

  11.   

    sorry! 我写错了 应该是:
    class  A 

        public int i= 10; 
    } class B  extends A

        public int i= 8; 
    } class C  extends B

        public int i= 6;   void show() 
      { 
          //我既想访问C自身的i,又想访问B中的i, 还想访问A中的i,代码该如何写????????????? 
      } 

      

  12.   

    package net.been;
    class  A 

    public int i= 10; 
    } class B  extends A 

    public int i= 8; 
    } class C  extends B 

    public int i= 6; 
    void show() 

    System.out.println(i);
    System.out.println(super.i);
    System.out.println(new A().i);
    } } 
    public class test{
    public static void main(String args[]){
    new C().show();
    }
    }
      

  13.   


    System.out.println(i); 
    System.out.println(super.i); 
    System.out.println(new A().i); 
    对啊,这3行应该就可以实现了吧?我觉得可以,可惜公司没有环境试
      

  14.   

    类中隐藏了2个引用,一个是this一个是super
    在子类中可以用super.访问父类对子类开放的属性和方法
    如果子类没有定义与父类中同名的属性,并且子类可以访问父类的这个属性,那么直接用属性名就可调用
    如果子类定义与父类同名的属性,而且子类可以访问父类的这个属性,那么用super.调用
    如果子类定义了与父类的属性,但子类不对父类的这个属性有访问属性,那么用super.也无法调用
      

  15.   


    A中的访问不了了。只能访问B 中的用super
      

  16.   

    记错了吧,
    对于方法倒是有类似的限制:如果父类的方法为public的,子类不可以定义成private,但反之可以。
      

  17.   

    什么隐藏封装,都是骗你玩的,利用java自己提供反射机制就可以破坏它。只要创建了一个对象,可以把它爸它爷它祖宗的private秘密搞出来。有心人看看下面的代码吧。import java.lang.reflect.*;class  AA 

        private int i= 10; 
    } class BB extends AA 

        private int i= 8; 
    } class CC extends BB

        private int i = 6;
    }public class Test {
        public Test() {
        }
        public static void main(String[] args) throws Exception{
            CC o = new CC();
            
            Class c = o.getClass();
            Class b = c.getSuperclass();
            Class a = b.getSuperclass();
            
            Field ci = c.getDeclaredField("i");
            Field bi = b.getDeclaredField("i");
            Field ai = a.getDeclaredField("i");
            
            ci.setAccessible(true);
            bi.setAccessible(true);
            ai.setAccessible(true);
            
            System.out.println(ci.getInt(o));
            System.out.println(bi.getInt(o));
            System.out.println(ai.getInt(o));
        }
    }
      

  18.   

    子类属性与父类的属性名字相同时,调用自身(子类)的属性用this.方式调用,调用父类的属性用super.方式调用
      

  19.   

    java为什么没有属性的概念?难道java的属性都是方法?你是怎么理解这个问题的,我玩了这么久java还是觉得属性是属性,方法是方法。
      

  20.   


    this表示当前类的实例,当然子类的实例是可以调用父类的属性地。