当前位置: 首页 > 知识库问答 >
问题:

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

湛铭
2023-03-14
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");
    }
}
    null

一个可能的解决方案是如下所示:公共抽象void makeNoise();这既不被允许,也不会消除将代码复制到动物的每个孩子身上的必要性。

在保持方法makeNoise静态的同时,如何消除在animal的子级中使用冗余代码的需要?

共有1个答案

徐君植
2023-03-14

Java中的静态方法不能在子类中重写。

如果在子类中定义的静态方法具有与父类中的静态方法相同的签名,则该方法不重写父方法,而隐藏了它。父类和子类中的方法彼此之间没有关系。

在您的示例中,如果方法Static void makeNoise()存在于Animal中,并且任何子类也定义了该方法,则子类只是在Animal中隐藏makeNoise方法。

public static void makeNoise(String noise) {
    System.out.println(noise);
}
Animal.makeNoise(Cat.NOISE); // A constant NOISE is defined in each subclass
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);
    }
}
 类似资料:
  • 我有以下课程: 该类包含两个可选值,我想提供所有可能的构造函数排列。第一个版本不初始化任何内容,第二个版本只初始化第一个值,第三个版本只初始化第二个值。 最后一个构造函数是第二个和第三个构造函数的组合。但这是不可能写下来的,因为代码失败了。 是否可以在没有任何代码冗余的情况下(也不调用相同的setter方法)编写最后一个构造函数?

  • 我如何避免在这里过度使用试捕?我如何简化裁员

  • 问题内容: 我有一个客户端库,在该客户端库中对我的REST服务进行http远程调用,然后返回给客户,该客户正在调用我的库,其中包含从REST服务获得的响应以及所有错误(如果包装了任何错误)围绕对象。 这是我的枚举类: 这是我的枚举类: 如您所见,在我的课堂上我有很多领域,因此我有一个很长的构造器,每次当我做一个对象的时候都会有很大的联系。将来我可能会有更多的字段,但目前只有这些字段。 有什么更好的

  • 我是Java的新手,正在处理一个家庭作业问题。该问题指定使用一个构造函数创建一个Temperature类,该构造函数接受华氏温度(作为double)并将其存储在字段中。setFahrenheit方法接受一个华氏温度(以双倍数形式),并将其存储在字段中。 这在我看来是多余的。setFahrenheit方法不是和构造函数完全一样吗?

  • 问题内容: 我的网站最近遭到了一个无辜的代码的攻击: 那里没有SQL调用,因此我不担心SQL注入。但是,显然,SQL并不是唯一的注入方式。 该网站提供了解释以及避免代码注入的一些示例:http : //www.theserverpages.com/articles/webmasters/php/security/Code_Injection_Vulnerabilities_Explained.ht

  • 我在final类中有一堆静态final方法: 我知道,当实例方法的类是final时,实例方法是隐式final的。但是,静态方法也是这样吗?

  • 理论上讲,总是可以到达嵌套在两个循环中的语句。 编译器不同意,并要求在循环之外使用语句。我想知道一种优雅的方法来优化这个方法,这超出了我目前的理解,我尝试的break实现似乎都不起作用。 附加的是来自赋值的一个方法,该方法生成随机整数,并返回循环遍历直到找到第二个随机整数为止的迭代,该迭代是在作为int参数传递给该方法的范围内生成的。

  • 问题内容: 我正在尝试通过从客户端向服务器发送密钥和随机数来认证用户。 我的代码未向我显示客户端的响应。执行下面的代码时,我得到了一个空指针异常。 问题答案: 解决大多数问题的固定步骤: 阅读堆栈跟踪以确定哪一行代码引发NPE 在该行代码处设置一个断点 使用调试器,在遇到断点时,确定该行中的对象引用是 弄清楚为什么引用该文件(到目前为止,这是唯一实际的困难部分) 解决根本原因(也可能很困难)