【发布时间】:2019-04-10 06:29:27
【问题描述】:
我对Java中的variable hiding and method overriding和virtual method calling有所了解。 我的问题是,为什么变量隐藏在继承方法中不起作用?这是否意味着我们必须重写在每个子类中访问这些变量的方法?
抽象类
public abstract class ClassA{
protected int i = 0;
public void printOurStuff(){
System.out.println(i);
}
public void printMyStuff(){
System.out.println(this.i);
}
public void printSomeStuff(String s){
System.out.println(s);
}
}
具体类
public class ClassB extends ClassA{
protected int i = 1;
public static main(String[] args){
ClassB b = new ClassB();
b.printOurStuff();
b.printMyStuff();
b.printSomeStuff(b.i);
}
}
结果
0 0 1
EDIT - 将字段的访问修饰符从私有更改为受保护并添加方法printOurStuff
【问题讨论】:
-
不清楚您要更改哪个结果 - 调用
printMyStuff的结果或调用printSomeStuff(b.i)的结果。但这是两个完全独立的变量,每个变量只能被同一个类声明中的代码访问,因为它们都是私有变量。 -
没有。这意味着您应该避免隐藏字段。如果
i需要在子类中可用,请将其设置为受保护的,或者添加可以在子类中调用的受保护的 getter 方法。 -
@JBNizet 更改访问修饰符并不能解决此问题。但是,我要求解释为什么会发生这种情况,而不是如何做到这一点
-
如果您停止隐藏字段,即如果您删除 ClassB 中的
i字段并因此有一个ifield,则会这样做。 -
更新了问题以反映我感兴趣的问题。
标签: java inheritance abstract-class