是否可以在 Java 中从其超类调用子类的实例变量?



我有一个超类动物,由Cat, Dog & Lion扩展。这三个人都有一个代表他们声音的场String sound。方法playSound(int i, String s)播放声音s,i的次数。是否有可能在动物超类中有一个通用方法,该方法接受调用它的子类的字段?还是我必须在每个类中创建一个单独的覆盖方法,该方法使用自己的"声音"变量调用super?

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

protected abstract Sound getSound();
public void playSound(int times) {
    for(int i=0; i<times; i++) {
        getSound().play();
    }
}
超级类

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

还是我必须在每个类中创建一个单独的覆盖方法,该方法使用自己的"声音"变量调用super?

我不明白你说的"那叫超级......"是什么意思。您只需让 sub 在 makeSound() 方法覆盖中调用自己的声音即可。

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

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);
}
}

最新更新