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

Java防止重写静态方法吗?[重复]

仲孙焱
2023-03-14

我不明白为什么当我尝试编译这段代码时,编译器会显示错误:

class A
{
    public static void f()
    {
        System.out.println("A.f()");
    }
}

class B extends A
{
    public static int f()
    {
        System.out.println("B.f()");
        return 0;
    }
}

在A和B类中,两种方法之间的区别在于返回类型,我读到Java阻止重写静态方法。所以我希望编译器不会显示任何错误,因为最初没有任何重写!!

共有2个答案

司空瑾瑜
2023-03-14

B中的方法没有重写类A中的方法,正如您已经知道的那样。问题是,对于具有相同签名的类B,您有两个不同的方法可见。请记住,返回类型不算作方法签名的一部分。

来自JLS§8.4.2-方法签名:

如果两个方法具有相同的名称和参数类型,则它们具有相同的签名。

因此,类B中的方法既不是有效的重写,也不是有效的重载。因为重载要求你有不同的方法签名,而你没有。

此外,它既不是有效的方法隐藏,因为这要求隐藏方法的返回类型与超级类方法的返回类型相同或子类型。这里也没有发生这种情况。

因此,要么将类B方法的返回类型更改为void,然后更改其签名。

卓俊晖
2023-03-14

Java语言规范有以下规则:

8.4.8.3. 覆盖和隐藏中的需求

如果返回类型为R1的方法声明d1覆盖或隐藏另一个返回类型为R2的方法d2的声明,则d1必须是d2的可替换返回类型(§8.4.5),否则会发生编译时错误。

此规则允许协变返回类型——在重写方法时细化方法的返回类型。

因此,即使该方法隐藏了超类中的一个,并且没有覆盖它,返回类型也必须是兼容的。

 类似资料:
  • 是否有一种方法可以防止重写我在映射器类中为其提供了实现的特定方法? null 我的映射器类如下所示: 然后,Mapstruct生成如下所示的实现:

  • 我想知道: 为什么在Java中不能重写静态方法? 静态方法可以在Java中重载吗?

  • 我试图理解重载和重写静态和非静态方法是如何工作的。事实上,我试图理解这些方法如何能够和不能出现在父类和子类中。我想出了下面的规则: 我们不能重写静态方法,只能隐藏它们。通过隐藏,我们的意思是在编译时根据引用变量类型决定执行哪个方法,而不是重写(,在运行时根据实例类型选择哪个方法执行)。 例如,让,然后隐藏. 我们可以重写实例方法。 例如重写. 两个或多个具有相同签名的方法不能以静态或非静态组合形式

  • 为什么输出是"静态A"?

  • 输出为"A的静态方法"。因此静态方法不会被重写,否则输出将是“静态方法B”。JVM如何在运行时决定调用类A而不是B的静态方法。

  • 问题内容: 到处都写着静态方法不能被覆盖,但是当我尝试将访问说明符从public改为protected时,它给出了一个错误。例如 它说 无法降低继承方法的可见性 所以说这是遵循最重要的规则,为什么我们说foo在B类中没有被忽略?为什么我们说它是隐藏/阴影而不是覆盖? 问题答案: 它 遵循 与覆盖 相同 的 一些规则 ,但这并不意味着它 被 覆盖。在这种情况下,这就是JLS的8.4.8.3节 “覆盖