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

Java 我可以从位于超类中的私有字段的派生类调用super()吗?,java,inheritance,Java,Inheritance,我有两个类在不同的文件中 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

我有两个类在不同的文件中

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可以吗

我读过很多关于继承的文章和研究。 我只是想把事情弄清楚

这叫隐藏,对吗

不,A的x只对B隐藏,因为它在A中是私有的。它可以被保护或公开,因此B可以作为超级访问。因为你在B中用声明对它进行了跟踪,它不会改变任何东西

但是类B不能从a继承一个私有字段,它可以在B的构造函数中调用super吗

B看不到A中的私有x,因为它是私有的,但它确实继承了它。B也可以有自己的x private或其他类型,两者根本不冲突——B实例两者都有。记住,B是A

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

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);
        }
    }
}
运行的输出是:

this.getX() = 42, this.x = 67
如您所见,该实例同时包含x个成员,A$x和B$x。

注意:它们是否在不同的文件中一点也不重要。是的,这很好。有两个不同的_x字段,每个类一个,每个类只访问自己的一个。所有这些都不会影响从派生类调用父方法(包括super)的能力。这是将属性设置为私有的原因之一。在这种情况下,它有助于避免许多糟糕的混乱。我不知道你说的“还好吗”是什么意思。我想这取决于你想做什么。至少从编译器的角度来看,它没有错。@T.J.Crowder,this.getX和supergetX是一样的吗?还有。这是有效的吗?->超级的getX@idandi:this.getX与supergetX相同吗?不,supergetX将尝试调用超类的构造函数,并传递调用getX的结果。还有。这是有效的吗?->是的,这是有效的。这是在重写超类的方法时如何调用该超类的方法版本。不过,在上面的代码中不需要它,因为B不重写getX。