此代码存在编译问题。我如何获得a.f()
?
class A {
int i = 1;
int f() {
return i;
}
static char g() {
return 'A';
}
}
class B extends A {
int i = 2;
int f() {
return -i;
}
static char g() {
return 'B';
}
}
class Test {
public static void main(String args[]) {
B b = new B();
System.out.println(b.i);
System.out.println(b.f());
System.out.println(b.g());
System.out.println(B.g());
A a = b;
System.out.println(a.i);
System.out.println(a.f());
System.out.println(a.g());
System.out.println(A.g());
}
}
这是结果
2
-2
B
B
1
-2
A
A
答案 0 :(得分:1)
您没有为类成员指定任何访问修饰符,因此它只具有默认或包级别访问权限,并且不可用于子类
Modifier Class Package Subclass World
public Y Y Y Y
protected Y Y Y N
no modifier Y Y N N
private Y N N N
有关详细信息,请参阅here
如果您将f()
的签名更改为protected int f()
,那么它应该可以正常工作
当然,你和班上的其他成员有同样的问题,所以由你来决定如何控制这个
答案 1 :(得分:0)
覆盖仅仅是例如方法,而不是变量。因此,当您从类A的实例中获取变量i时,您将从此类中获取值。与B类实例相同。
但是你可以在构造函数中重新初始化i的值,例如:
class B extends A {
public B() {
i=2;
}
int f() {
return -i;
}
static char g() {
return 'B';
}