我刚开始学习 Java,所以如果答案有些明显,请耐心等待。我做了一些研究,但无济于事。
据我了解,属性不会被覆盖,而只会隐藏字段。为了确定是否使用父类(super class)或子类中的属性,Java 将检查引用的类型。
然后我不明白这里的输出:
public class Super {
String str = "I'm super!\n";
public String toString() {
return str;
}
}
public class Sub extends Super {
String str = "I'm sub.\n";
}
public class TestFH {
public static void main(String[] args) {
Sub s1 = new Sub();
System.out.printf(s1.toString());
}
}
它给了我:
I'm super!
我知道我可以通过方法覆盖轻松实现我想要的。我只是好奇引擎盖下发生了什么。
提前致谢。
最佳答案
当您调用 s1.toString()
时,它会找到仅在 Super
类中定义的 toString()
方法,因此将该方法用作父类(super class)方法在子类中可用。 您的父类(super class)方法 toString()
使用它自己的类变量 str
(值在父类(super class)中初始化) 作为方法的返回值因此,行为即输出为 I'm super!
。
如果你想获得 I'm sub.\n
的输出,那么你需要重用与父类(super class)中相同的变量并分配新的字符串值,即 I' m sub.\n
到它。最好的选择是将构造函数用作:
public class Super {
String str = "I'm super!\n";
public Super(String stringValue){
this.str = stringValue;
}
public String toString() {
return str;
}
}
public class Sub extends Super {
public Sub(){
super("I'm sub.\n");
}
}
public class TestFH {
public static void main(String[] args) {
Sub s1 = new Sub();
System.out.printf(s1.toString());
}
}
关于属性的 Java 字段隐藏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13984472/