- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我了解variable hiding and method overriding和 virtual method calling在 java 。我的问题是,为什么变量隐藏在继承的方法中无法生效?这是否意味着我们必须重写每个子类中访问这些变量的方法?
抽象类
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);
}
}
结果
001
编辑 - 将字段的访问修饰符从私有(private)更改为 protected 并添加方法printOurStuff
最佳答案
当您声明私有(private)字段时,例如
private int i = 0;
这意味着只有这个具体类可以访问这个变量。该字段不可用于子类。如果您希望此字段可用于子类,则应将其设为 protected
:
protected int i = 0;
要覆盖此字段的值,您可以使用静态 block ,例如:
public class ClassB extends ClassA {
{
i = 1;
}
}
或者在构造函数中分配一个新值:
public class ClassB extends ClassA {
public ClassB() {
i = 1;
}
}
就您的示例而言,如果您使用调试器检查 ClassB
对象,您会发现实际上有两个 i
字段:一个用于 ClassA
和一个用于 ClassB
。
更新:
关于i
变量受保护
的情况:
仔细看看你的类定义。
您不能不同意您声明 i
字段两次:对于 ClassA
和 ClassB
。 JVM 将尊重此声明并遵循您的指示。如果该字段是protected
甚至是public
,您仍然有两个字段。您不能像覆盖方法一样覆盖它们。当访问像 i = ...
这样的字段时,您实际上正在访问距离您的范围最近的字段。对于 ClassB
来说,它是其字段 i
,而不是其父类(super class) ClassA
的字段。
此外,您仍然可以按如下方式访问父类(super class)的字段:
super.i = ...
super
是对父类(super class)的引用。
关于java - 有没有办法从抽象类的具体方法访问具体类变量值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55606045/
我是一名优秀的程序员,十分优秀!