假设我有以下类(class):
public class Cat {
private final String noise = "meow";
pulic static void makeNoise(){
System.out.println(noise);
}
}
public class Dog {
private final String noise = "woof";
pulic static void makeNoise(){
System.out.println(noise);
}
}
正如您所看到的,这两个类共享几乎相同的代码。要删除冗余代码,我将创建一个如下所示的父类:
public abstract class Animal {
protected final String noise;
public Animal(String noise) {
this.noise = noise;
}
public void makeNoise() {
System.out.println(noise);
}
}
public class Dog extends Animal{
public Dog(){
super("woof");
}
}
现在不幸的是我遇到了两个问题:
- 既然动物的叫声不再是静态的,因为常数 必须通过动物的构造函数进行分配,你将 需要创建一只猫或狗来获取该动物的噪音。甚至 尽管它是一个常数。
- 方法 makeNoise() 需要在 Animal 类中工作 - 其中 默认情况下没有噪音。
一个可能的解决方案是这样的: 公共(public)抽象无效 makeNoise(); 这是不允许的,也不会消除将代码复制到 Animal 的每个子项中的需要。
如何在保持方法 makeNoise 静态的同时消除动物子级中多余代码的需要?
最佳答案
Java 中的静态方法不能在子类中重写。
如果在子类中定义与父类中的静态方法具有相同签名的静态方法,则该方法不会覆盖父方法而是隐藏它。父类和子类中的方法彼此没有关系。
在您的示例中,如果方法 static void makeNoise()
存在于 Animal
中,并且任何子类也定义了该方法,则子类只是隐藏了 makeNoise
Animal 中的方法。
在您的示例中,使用静态方法可以做的最好的事情是:
public static void makeNoise(String noise) {
System.out.println(noise);
}
并以这种方式调用该方法:
Animal.makeNoise(Cat.NOISE); // A constant NOISE is defined in each subclass
如果方法 makeNoise
是非静态的,则可以使用继承来在每个子类中使用不同的噪声:
public abstract class Animal {
protected String noise;
protected Animal(String noise) {
this.noise = noise;
}
public void makeNoise() {
System.out.println(noise);
}
}
public class Cat extends Animal{
public static final String NOISE = "meow";
public Cat() {
super(NOISE);
}
}
关于java - 如何避免静态方法的冗余代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40172935/