Java继承之谜

Mar*_*oma 8 java inheritance

我在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的相关部分)为什么会这样?

kos*_*osa 9

字段不是多态的,方法是多态的.

 diego.roar();
Run Code Online (Sandbox Code Playgroud)

调用roar()的方法Animal和版画soundAnimal.

diego.sound = "Hust hust";
Run Code Online (Sandbox Code Playgroud)

Tigersound变量中设置声音值

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.