超类/子类方法

时间:2016-07-07 19:26:24

标签: java oop inheritance

我有一个情况

public class Animal
{
   String noise;

  public String makeNoise()
  {
      return noise;
  }
}

然后会有一个具有噪声具体定义的子类。

public class Dog extends Animal{
   String noise = "woof";
}

public class Cat extends Animal{
   String noise = "meow";
}

我想做的是

 Animal cat = new Cat();
 cat.makeNoise();  // This will be 'meow'

Animal dog = new Dog();
dog.makeNoise();  // This will be 'woof'

基本上,我不想在创建动物时重复makeNoise()方法。但是,这不起作用。 (噪音是一个空字符串)

我可以使用像

这样的静态对象
static String NoiseDog = "woof"
static String NoiseCat = "meow"

但是我必须再为每只动物编写makeNoise()方法。有没有更好的方法来构建这个?

4 个答案:

答案 0 :(得分:2)

如果要强制Animal的所有子类定义noise,可以在构造函数中强制执行:

public abstract class Animal {
    private final String noise;

    public Animal(final String noise) {
        this.noise = noise;
    }

    public String makeNoise() {
        return noise;
    }
}

然后狗:

public class Dog extends Animal {
    public Dog() {
        super("woof");
    }
}

和猫:

public class Cat extends Animal {
    public Cat() {
        super("meow");
    }
}

并测试出来:

public class Test {
    public static void main(String[] args) {
        final Animal dog = new Dog();
        System.out.println(dog.makeNoise());
        final Animal cat = new Cat();
        System.out.println(cat.makeNoise());
    }
}

输出:

woof
meow

答案 1 :(得分:1)

public class Cat extends Animal{
   String noise = "meow";
}

这将创建一个名为“noise”的实例变量,该变量隐藏了超类变量。 相反,您需要这个来设置超类值:

public class Cat extends Animal{
   public Cat() {
      noise = "meow";
   }
}

答案 2 :(得分:0)

使Animal类抽象化。这样,就不会有Animal对象调用makeNoise

然后,将noise String设置为每个子类的构造函数中的值,以适合该动物的声音。

答案 3 :(得分:0)

或者,您可以实现一个接口:

动物

public interface Animal {
    public String makeNoise();
}

犬:

public class Dog implements Animal {
    public String makeNoise() {
        return "woof";
    }
}

猫:

public class Cat implements Animal {
    public String makeNoise() {
        return "meow";
    }
}

测试:

public class Test {
    public static void main(String[] args) {
        Animal dog = new Dog();
        System.out.println(dog.makeNoise());
        Animal cat = new Cat();
        System.out.println(cat.makeNoise());
    }
}

输出:

woof
meow