java 中的构造函数和继承

constructor and inheritance in java

我知道 java 中不继承构造函数,我们必须隐式或显式调用它们,私有实例变量只能在它们声明的 class 中访问。 假设我们有一个 superclass 和一个私有实例变量,我们用 superclass 构造函数初始化它 例如

       public class SuperClass

       {

            private int a;

           public SuperClass ( int a )
           {

             this.a = a;

           }
          .
          .
          .
       }

而我们的子class是这样的

    public class SubClass extends SuperClass

   {

       public int b;


      public SubClass ( int a, int b )
      {

         super( a );
         this.b = b;

      }
      .
      .
      .
    }

所以这里 public SubClass ( int a, int b ) 即使它的参数之一是私有的并且属于 SuperClass 也没有问题???如果是,怎么可能通过另一个 class 访问 private 实例变量???

当您调用 super(a); 时,您并不是从子类访问超类。您正在调用超类的构造函数,该构造函数又访问它自己的变量。完全正确,合乎逻辑。

另外,超类的所有变量和函数都被子类继承,子类可以访问超类的变量。注意,如果是private就不能直接访问,但是不代表子类不继承该字段。

考虑以下 类:

public class A {
    private int a = 5;

    public int getA() {
        return a;
    }
}

public class B extends A {
    public int getnumber() {
        return this.getA();
    }
}

如果我这样做:

B x = new B();

然后

System.out.println(x.a); //invalid

这将是无效的。你不能直接访问 B 对象内部的 a 字段,但即使你看不到它,它仍然存在。我们可以通过这样做来验证这一点:

System.out.println(x.getnumber());

打印出 5.

public SubClass ( int a, int b )   {

     super( a );
     this.b = b;

  }

int a是一个新变量,不同于SuperClass中的private int a。当您调用 super(a) 时,您将参数变量 int a 内的值传递给超类的构造函数。然后将其存储在 private int a

so here public SubClass ( int a, int b ) there is no problem even one of it's argument is private and belong to SuperClass??? if yes, how could it possible to access a private instance variable through another class???

该构造函数中那些参数的范围仅限于该代码块。 int a 和 int b 与 class 级别变量没有任何关系,它们只是碰巧被命名为相同。

您可能应该为变量创建一个 public getter,但您也可以简单地将变量声明为 "protected"(可供其他 class 访问相同的包,并通过 subclasses) 或 "public" - 任何东西都可以访问。