我有一个情况
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()方法。有没有更好的方法来构建这个?
答案 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