有没有办法从抽象 class 的具体方法访问具体的 class 变量值
Is there a way to access the concrete class variable values from concrete methods of an abstract class
我对Java的variable hiding and method overriding and virtual method calling有所了解。
我的问题是,为什么变量隐藏在继承方法中无法生效?这是否意味着我们必须重写在每个子 class 中访问这些变量的方法?
摘要class
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);
}
}
混凝土class
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 - 将字段的访问修饰符从 private 更改为 protected 并添加方法 printOurStuff
当你声明私有字段时
private int i = 0;
这意味着只有这个具体的 class 可以访问这个变量。此字段不适用于 subclasses。如果您希望此字段可用于 subclasses,则应改为 protected
:
protected int i = 0;
要覆盖此字段的值,您可以使用静态块,f.e.:
public class ClassB extends ClassA {
{
i = 1;
}
}
或者在构造函数中赋一个新值:
public class ClassB extends ClassA {
public ClassB() {
i = 1;
}
}
关于您的示例,如果您使用调试器检查 ClassB
对象,您会发现实际上有两个 i
字段:一个用于 ClassA
,一个用于 ClassB
.
更新:
关于i
变量为protected
的情况:
仔细查看您的 classes 定义。
你不能不同意你 声明 i
字段两次:ClassA
和 ClassB
。 JVM 将尊重此声明并遵循您的指示。如果字段是 protected
甚至 public
,你仍然有两个字段。您不能像覆盖方法一样覆盖它们。当访问像 i = ...
这样的字段时,您实际上是在访问最接近您的范围的字段。对于 ClassB
它是它的字段 i
,而不是它的 superclass ClassA
.
的字段
此外,您仍然可以访问 superclass 的字段,如下所示:
super.i = ...
super
是对超class.
的引用
我对Java的variable hiding and method overriding and virtual method calling有所了解。 我的问题是,为什么变量隐藏在继承方法中无法生效?这是否意味着我们必须重写在每个子 class 中访问这些变量的方法?
摘要class
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);
}
}
混凝土class
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 - 将字段的访问修饰符从 private 更改为 protected 并添加方法 printOurStuff
当你声明私有字段时
private int i = 0;
这意味着只有这个具体的 class 可以访问这个变量。此字段不适用于 subclasses。如果您希望此字段可用于 subclasses,则应改为 protected
:
protected int i = 0;
要覆盖此字段的值,您可以使用静态块,f.e.:
public class ClassB extends ClassA {
{
i = 1;
}
}
或者在构造函数中赋一个新值:
public class ClassB extends ClassA {
public ClassB() {
i = 1;
}
}
关于您的示例,如果您使用调试器检查 ClassB
对象,您会发现实际上有两个 i
字段:一个用于 ClassA
,一个用于 ClassB
.
更新:
关于i
变量为protected
的情况:
仔细查看您的 classes 定义。
你不能不同意你 声明 i
字段两次:ClassA
和 ClassB
。 JVM 将尊重此声明并遵循您的指示。如果字段是 protected
甚至 public
,你仍然有两个字段。您不能像覆盖方法一样覆盖它们。当访问像 i = ...
这样的字段时,您实际上是在访问最接近您的范围的字段。对于 ClassB
它是它的字段 i
,而不是它的 superclass ClassA
.
此外,您仍然可以访问 superclass 的字段,如下所示:
super.i = ...
super
是对超class.