如果我有:
class Zero {
int n = 0;
void setN(int x) {
n += x;
}
}
class One extends Zero {
int n = 1;
void setN(int x) {
n += x;
super.setN(x);
}
}
class Two extends One {
int n = 2;
void setN(int x) {
n += x;
super.setN(x);
}
void show() {
System.out.println(n);
System.out.println(super.n);
// System.out.println(super.super.n); error
}
public static void main(String[] args) {
Two two = new Two();
two.show();
// >>>
// 2
// 1
two.setN(1);
two.show();
// >>>
// 3
// 2
}
}
我重新编辑了它,用setN
从Zero
传下来的方法。它有效,所以它是否意味着我仍然可以'改变'n
中的Zero
,但我只是不会看到它?
同样非常有趣的是,即使setN
和One
中的Two
完全相同,我必须手动覆盖它,如果我在setN
中删除Two
,这将表现不同。 setN
不会改变n
中的Two
。
似乎super
只能超过一级?反正把n
称为零吗?
但另一个问题是,如果我打算在子类中覆盖int n
,为什么它允许我在父母中访问n
?
谢谢,
在Java中,与使用范围分辨率支持它的C ++不同,它是不可能的。
你可以有一个方法
int getZeroN(){
return n;
}
在你的Zero
,然后使用来自System.out.println(super.getZeroN());
的Two
来调用它
但是,您可以在Two.main()中执行此操作:
Two two = new Two();
Zero z = (Zero)two;
System.out.println( Zero's n is " + z.n );
你不能用super
升级两级。它也可以用于参数。作为super(argument1)
,它将调用接受argument1
类型的1个参数的构造函数(如果存在)。
它也可用于从父级调用方法。 super.method()
有关更多信息,请参阅here