我可以从位于超类中的私有字段的派生类调用super()吗?

时间:2014-12-20 15:09:25

标签: java inheritance

我在单独的文件中有2个类。

public class A 
{
   private int _x;

   public A (int x)
   { 
      _x = x;
   }

   public int getX()
   {
      return _x;
   }

   public int doubleX()
   {
     return 2 * getX();
  }
}

public class B extends A 
{
    private int _x;

    public B(int xA, int xB)
    {
       super(xA);
       _x = xB;
    }
}

单独文件中的主要方法...

public static void main(String[] args)
{
    A a = new A(1);
    A b = new B(2,22);
    System.out.println(b.doubleX());
}

可以使用相同的名称。它被称为隐藏权? 但是B类不能从A继承私有字段 如上所示,可以在B的构造函数中调用super吗?

我读了很多文章并研究了遗产。 只是想让事情变得清晰。

1 个答案:

答案 0 :(得分:2)

  

它被称为隐藏权?

不,A的{​​{1}}仅对_x隐藏,因为它B中的private。它可以是Aprotected,因此public可以访问B,因为您已使用super._x中的声明对其进行了隐藏,并且它不会不做任何改变。

  

但是类B无法继承B的私有字段,可以在A的构造函数中调用super,如上所示?

B无法查看 B中的私有_x,因为它是私有的,但 继承它。 A也可以拥有自己的B(私有或其他),两者完全没有冲突 - _x实例都有。请注意,B B

这可能有助于为您澄清事情:

A

运行的输出是:

this.getX() = 42, this.x = 67

如您所见,该实例包含public class Example { public static final void main(String[] args) { (new B(42, 67)).show(); } static class A { private int x; protected A(int arg) { this.x = arg; } protected int getX() { return this.x; } } static class B extends A { private int x; public B(int arg1, int arg2) { super(arg1); this.x = arg2; } public void show() { System.out.println("this.getX() = " + this.getX() + ", this.x = " + this.x); } } } 个成员,xA$x