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

是否可以调用子类';Java中来自其超类的实例变量?,java,inheritance,Java,Inheritance,我有一个超类动物,由猫、狗和狮子扩展而来。这三个字段都有一个表示其声音的字段字符串声音。playSound(int i,String s)方法可以多次播放声音s,i。有可能在动物超类中有一个通用的方法,在调用它的子类的字段中使用它吗?或者我必须在每个类中创建一个单独的重写方法,用它们自己的“sound”变量调用super吗?super不能访问sub的字段,也不应该访问sub的字段——super类应该不依赖于它们的子类——但多亏了多态性,它不需要访问。你所需要做的就是给super一个makeSou

我有一个超类动物,由猫、狗和狮子扩展而来。这三个字段都有一个表示其声音的字段
字符串声音
。playSound(int i,String s)方法可以多次播放声音s,i。有可能在动物超类中有一个通用的方法,在调用它的子类的字段中使用它吗?或者我必须在每个类中创建一个单独的重写方法,用它们自己的“sound”变量调用super吗?

super不能访问sub的字段,也不应该访问sub的字段——super类应该不依赖于它们的子类——但多亏了多态性,它不需要访问。你所需要做的就是给super一个
makeSound()
方法或类似的东西,然后让sub重写这个方法,每个方法都播放自己的声音

关于,

或者我必须在每个类中创建一个单独的重写方法,用它们自己的“sound”变量调用super


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

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

关于,

或者我必须在每个类中创建一个单独的重写方法,用它们自己的“sound”变量调用super


我不明白你说的“那叫超级……”是什么意思。只需在
makeSound()
方法覆盖中调用子类自己的声音即可。

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

protected abstract Sound getSound();

public void playSound(int times) {
    for(int i=0; i<times; i++) {
        getSound().play();
    }
}
受保护的抽象声音getSound();
公共空间播放声音(整数次){

对于(int i=0;i超类无法访问子类中的字段。通常的方法是生成抽象getter:

protected abstract Sound getSound();

public void playSound(int times) {
    for(int i=0; i<times; i++) {
        getSound().play();
    }
}
受保护的抽象声音getSound();
公共空间播放声音(整数次){

对于(inti=0;i,据我所知,不,这是不可能的

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

}

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

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

}

FWIW:你不“调用”变量,你“使用”或“访问”或“读取自”或“写入至”或“分配至”等。你调用函数/方法/构造函数。FWIW:你不“调用”变量,你“使用”或“访问”或“读取自”或“写入至”或“分配至”等。你调用函数/方法/构造函数。我的意思是如果我有一个makeSound(int I,String s)方法,该方法的代码适用于所有内容,但根据s更改输出。在子类中,我是否应该有另一个makeSound(int I,String s)调用super的方法,将其传递给int i和它们自己的声音变量?@platelminto:您应该有一个makeSound方法,它不接受字符串,而是由子类提供字符串。我的意思是,如果我有一个makeSound(int i,String s)方法,该方法的代码适用于所有内容,但根据s更改输出。在子类中,我是否应该有另一个makeSound(int I,String s)调用super的方法,将其传递给int i和它们自己的声音变量?@platelminto:您应该有一个makeSound方法,该方法不接受字符串,而是由子类提供字符串。执行intanaceof的方法不好,大多数时候总有更好的方法。在这种情况下,最好的解决方案是抽象方法。id不好ea要想做到这一点,大多数时候总有更好的方法。在这种情况下,最好的解决方案是抽象方法。