想象一个简单的层次结构:
abstract class Animal {}
class Dog extends Animal {}
class Cat extends Animal {}
我想实现抽象方法makeNoise
,以便Dog
可以覆盖它以打印Woof!
,而Cat
可以覆盖它以打印Meow!
。< / p>
我写了以下代码:
abstract class Animal {
abstract void makeNoise();
}
class Dog extends Animal {
@Override
void makeNoise() {
System.out.println("Woof!");
}
}
class Cat extends Animal {
@Override
void makeNoise() {
System.out.println("Meow!");
}
}
但我不喜欢它。我在重写方法中重复sout
。
我想在abstract final static
中创建一个名为SOUND
的{{1}}变量,并在子项中覆盖它:
Animal
但该代码显然不起作用。但这是一种创建这样的逻辑的方法,所以我可以创建以下代码:
abstract class Animal {
abstract static final String SOUND;
void makeNoise() {
System.out.println(SOUND);
}
}
class Dog extends Animal {
static final String SOUND = "Woof!";
}
class Cat extends Animal {
static final String SOUND = "Meow!";
}
更新
除了new Dog().makeNoise(); // Woof!
new Cat().makeNoise(); // Meow!
我还希望静态访问声音,以便我也可以编写以下代码:
makeNoise
答案 0 :(得分:4)
abstract class Animal {
void makeNoise() { System.out.println(noise()); }
abstract String noise();
}
class Dog extends Animal {
@Override
String noise() { return "Woof!"; }
}
class Cat extends Animal {
@Override
String noise() { return "Meow!"; }
}
这和你一样好。