Java での継承について、次のパズルを作成しました。
Animal.java
public class Animal {
private String sound;
public void roar() {
System.out.println(sound);
}
public void setSound(String sound) {
this.sound = sound;
}
}
Tiger.java
public class Tiger extends Animal {
public String sound;
public Tiger() {
sound = "ROAR";
}
}
ジャングル.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);
}
}
出力:
null
null
bla
Hust hust
sound
Animal はプライベートでsound
、Tiger はパブリックであるため、この奇妙な動作が発生していると思います。しかし、なぜこれが起こるのか説明できますか (そして JLS の関連部分を教えてください)。