是否可以调用子类'来自Java中超类的实例变量?

时间:2015-04-19 13:00:48

标签: java inheritance

我有一个超级动物,由Cat,Dog& amp;狮子。这三个都有一个表示声音的字段String sound。方法playSound(int i,String s)播放声音s,i次数。是否可以在Animal超类中使用一个通用方法来接受调用它的子类的字段?或者我是否必须在每个使用自己的“声音”变量调用super的类中创建一个单独的重写方法?

3 个答案:

答案 0 :(得分:6)

超类不能访问子类中的字段。通常的方法是制作一个抽象的getter:

protected abstract Sound getSound();

public void playSound(int times) {
    for(int i=0; i<times; i++) {
        getSound().play();
    }
}

答案 1 :(得分:0)

super不能访问sub的字段,也不应该 - 超类不应该对他们的孩子有依赖性 - 但是由于多态性,它不需要。您需要做的就是给出超级makeSound()方法或类似方法,然后让子方法覆盖方法,每个方法都播放自己的声音。

重,

  

或者我是否必须在每个使用自己的“声音”变量调用super的类中创建一个单独的重写方法?

我不明白你的意思是“那叫超级......”。您只需在makeSound()方法覆盖中调用子调用自己的声音。

答案 2 :(得分:0)

据我所知,不,这是不可能的。您可以尝试在超类中进行比较,如

if (this intanaceof of Cat)
play cat sound

但这会破坏多态性的目的。我不明白你为什么要这样做。我会做这样的事情:

abstract class Animal{

Sound [] sounds;
int soundI;

Animal(int soundI){
this.soundI = soundI
}

void playSound(){
sounds[i].play();
}

}

class Cat extends Animal{

Cat(){
super(5);
}

}