java - 如何避免静态方法的冗余代码

标签 java oop static abstract

假设我有以下类(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");
    }
}

现在不幸的是我遇到了两个问题:

  1. 既然动物的叫声不再是静态的,因为常数 必须通过动物的构造函数进行分配,你将 需要创建一只猫或狗来获取该动物的噪音。甚至 尽管它是一个常数。
  2. 方法 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/

相关文章:

c++ - STL 静态常量成员定义

typescript :如何从继承的静态属性返回子类类型?

Java Swing - JTable 中的多个列标题?

java - 三元运算符在条件不满足时评估条件语句

java - 为什么这个整数不是 0,却返回 0?

php oop 从数据库中选择数据

java - 在 Strategy 设计模式中使用抽象类代替接口(interface)

java - 当 foo 由类 ArrayList 而不是接口(interface) List 表示时,使用 foo 不是更容易吗?

c - 指向静态字符的 int 指针

java - 使用 Spans 获取 EditText 的左侧部分文本