我正在学习java中的继承。在我正在学习的地方编写小代码时,我们无法访问子类中超类的私有成员。
这是我的代码:
class A {
int i;
private int j;
void setij(int x, int y) {
i = x;
j = y;
}
class B extends A {
int b;
void sum() {
b = i + j;
}
}
当我在eclipse中创建一个新类时,我无法在A类中创建一个sublcass B的对象。
class mainclass{
public static void main(String args[]){
B object = new B(); ----error
}
}
}
错误表示需要创建B类。
我可以知道为什么会这样吗?它发生的不是问题,但我想解决并理解它为什么会发生的逻辑。
由于
答案 0 :(得分:2)
这是因为类B
中存在类A
,因此需要在A
之外创建,例如:
class A {
int i;
private int j;
void setij(int x, int y) {
i = x;
j = y;
}
}
class B extends A {
int b;
void sum() {
b = i + j;
}
}
使用此代码,可以从包内的所有类访问类B
(和A
)。如果您希望从当前包外部访问这些类,则需要在单独的文件中创建这些类,并将它们标记为public
。
Here's更多关于类的访问修饰符。
<强> Upate 强>
如果要在B
中将类A
定义为内部类,那么您将需要封闭类(在我们的示例中为A
)的实例来访问B
,例如:
class A {
int i;
private int j;
void setij(int x, int y) {
i = x;
j = y;
}
class B extends A {
int b;
void sum() {
b = i + j;
}
}
}
现在,要实例化B
,您需要执行以下操作:
A a = new A();
B b = a.new B();
当然,与访问修饰符相同的规则将应用于内部类实例(除了内部类将能够访问封闭类的私有成员的事实),
答案 1 :(得分:1)
这是因为B类的实例必须与A类的实例相关。因此,您必须首先创建A类的实例,然后创建B类的实例:
A a = new A();
a.setij(1,2);
B b = a.new B();
b.setij(3,4);
b.sum();
System.out.println(b.b);
(如果你想知道,结果是5)