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" - 任何东西都可以访问。
我知道 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" - 任何东西都可以访问。