比如这段代码class a
{
int x=0;
}
class b extends a
{
int x=1;
}
class c extends b
{
public void show()
{
System.out.println(super.x);
}
}从c类里直接访问a类x,而不通过b类

解决方案 »

  1.   

    对于private成员建议提供setter,getter函数,比如写一个public getX(),在子类里就可以调用了啊.你的这个例子x是private varible,在子类中是没有办法直接访问的,在b或者c中一样.
      

  2.   

    A aInst = new A();
    System.out.println(aInst.x);这样就可以直接访问祖父类的属性
    PS. 1、代码要符合Java规范;
    2、你给出来的代码不是多重继承,Java 也不支持多重继承。
      

  3.   

    一楼的说错了,x又不是private的
      

  4.   

    其实C类可以继承A类的X值的,只不过你在B类中把X值进行重载,C类分不清是找哪个父类的X值,就先调用B类最后一次重载的值的,如果把B类的int x=1;改成int a=1;有话,哪么,你的C类就是直接调用A类的X的值的!注意在多重继承的时候,最好将这些只允许子类继承的对象定义成protected型
    public class a {
      public a() {
      }
      
      //private int x=0;
      protected int x=0;
      protected int geta(){
      return x;
      }
    }public class b extends a {
      public b() {
      }
      int k=x;
    // private int x=1;
    }
    public class c  extends b{
      public c() {
      }
      public void main(String[] str){
        
      System.out.println(super.x);
      int cc=super.geta();
      
      }
    }
      

  5.   

    不是访问a ,其实是访问了b,由于b中的另外一个变量x是从a继承来的 ,即使重新声明了一个x,但是在c中你访问的还是b从a中继承得到的 x
    还有 kingofhawks(蓝鹰) 注意,x不是private的,应该是默认的“友好的”吧,在同一个包下可以访问。
      

  6.   

    以前只学过C++,以为Java的访问控制跟C++差不多,刚才又去看了一遍,发现由于包的存在使得Java的访问控制平添了很多复杂性啊.尤其是默认成员和protected的语义比较晦涩.
      

  7.   

    Java 中 field 只能被hidden(隐藏),不能被overloaded(重载)或者overriden(覆盖)!
      

  8.   

    Java 中默认的访问修饰符不是“友好的”(friend),是“包私有”(package private)!