我在Java中为继承创建了以下难题:
Animal.java
public class Animal {
private String sound;
public void roar() {
System.out.println(sound);
}
public void setSound(String sound) {
this.sound = sound;
}
}
Run Code Online (Sandbox Code Playgroud)
Tiger.java
public class Tiger extends Animal {
public String sound;
public Tiger() {
sound = "ROAR";
}
}
Run Code Online (Sandbox Code Playgroud)
Jungle.java
public class Jungle {
public static void main(String[] args) {
Tiger diego = new Tiger();
diego.roar();
diego.sound = "Hust hust";
diego.roar();
diego.setSound("bla");
diego.roar();
System.out.println(diego.sound);
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
null
null
bla
Hust hust
Run Code Online (Sandbox Code Playgroud)
我猜这种奇怪的行为正在发生,因为sound在动物是私人的,而sound在虎是公开的.但是你能解释一下(并告诉我JLS的相关部分)为什么会这样?
字段不是多态的,方法是多态的.
diego.roar();
Run Code Online (Sandbox Code Playgroud)
调用roar()的方法Animal和版画sound从Animal.
diego.sound = "Hust hust";
Run Code Online (Sandbox Code Playgroud)
在Tiger类sound变量中设置声音值
diego.roar();
Run Code Online (Sandbox Code Playgroud)
返回null; 因为从Animal打印声音,它仍然是空的.上面的声音分配反映了Tiger类变量,而不是Animal类.
diego.setSound( "BLA");
设置Animal声音bla
diego.roar();
Run Code Online (Sandbox Code Playgroud)
bla因为setSound更新了Animal类的声音变量而打印bla.
的System.out.println(diego.sound);
打印Hust hust由于diego属于类型Tiger并且您已经访问了场声Tiger并且字段不是多态的.
有关详细信息,请参阅java语言规范8.3.