【问题标题】:Is "Indirect Overriding" of static methods possible in Java?在 Java 中是否可以“间接覆盖”静态方法?
【发布时间】:2023-12-26 06:17:02
【问题描述】:

我们不能覆盖静态方法(至少在 Java 中)。

如果我想重写继承的静态方法,我可以通过嵌套调用已重写的父类的非静态方法来实现吗?

class A {
.
.
static func(args) {..M(args)..}
.
.
<Type> M(args) {...}
.
.
}

class B extends A {
.
.
@Override
<Type> M(args) {...}
.
.
}

或者,这段代码能否改变func的功能?

【问题讨论】:

  • 重载静态方法当然是可能的,而覆盖是不可能的——你让它们切换了。但即便如此,最好的解决方法是为您想要尝试的内容编写代码并查看会发生什么,或者至少共享特定代码而不是代码描述。
  • 对,只需向我们展示您想尝试的代码即可。基本上你必须在这里从头开始实现每个方法,没有办法“自动”引用静态方法。这就是为什么它们是“静态的”。

标签: inheritance methods static overriding non-static


【解决方案1】:

这就是它崩溃的地方:

我在嵌套调用的帮助下定义了 A 的静态方法 给M。

您不能从静态方法调用非静态方法。

如果我理解正确的话,你想做如下的事情:

public class A {
    public static void staticMethod() {
        m();
    }
    public void m() {
        // do something here or leave it to the subclasses
    }
}

在我的 Eclipse 中,调用 m() 我得到了

无法从类型 A 对非静态方法 m() 进行静态引用

要调用非静态方法,您需要一个实例来调用它。例如,要问一个人的名字,你首先需要一个人对象,否则这个问题就没有意义了。在静态上下文中,您没有任何实例。

当然,如果您可以设置在 staticMethod 内部有 BC 的实例的情况,那么您就在那里。然后你就可以打电话给myInstanceOfBOrC.m()

我认为您所追求的通常解决方案是从一开始就创建BC 的实例,而不是将方法声明为静态。然后使用通常的覆盖。仅仅为此目的创建一个实例可能感觉像是一种浪费;但它有效。

【讨论】:

  • 我的意思是“覆盖”。很抱歉混淆了。无论如何,我明白你的意思。感谢您的快速澄清,对于这个荒谬的问题,我们深表歉意。
  • 不,这个问题很好。我们都会在某个时候碰壁,并思考是否有办法获得您所要求的内容。这个问题也很容易对其他读者有所帮助。