gpt4 book ai didi

java - 静态方法重新定义规则

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:30:45 24 4
gpt4 key购买 nike

我知道这是一个老生常谈的话题,但我需要澄清一些事情,请耐心等待一分钟。

静态方法与任何其他方法一样被继承,并遵循关于访问修饰符的相同继承规则(私有(private)方法不被继承等)

静态方法不会被覆盖,它们会被重新定义。如果一个子类定义了一个与父类(super class)中的签名具有相同签名的静态方法,则称它隐藏或隐藏了父类(super class)的版本而不是覆盖它,因为它们不像实例方法那样是多态的。

重新定义的静态方法似乎仍然遵循一些(如果不是全部的话)最重要的规则。

首先,重新定义的静态方法不能比父类(super class)的静态方法有更多的访问限制。为什么??

其次,返回类型也必须在父类(super class)和子类的方法中兼容。例如:

class Test2 {
static void show() {
System.out.println("Test2 static show");
}
}

public class StaticTest extends Test2 {
static StaticTest show() {
System.out.println("StaticTest static show");
return new StaticTest();
}

public static void main(String[] args) {
}

}

在 eclipse 中,它在以下行显示错误:返回类型与 Test2.show() 不兼容为什么??

第三,在重新定义静态方法时是否有其他规则与覆盖规则相同,这些规则的原因是什么?

提前致谢!

最佳答案

§8.4.8.3 of the Java Language Specification 中详细说明了隐藏静态方法的要求。 .总的来说,它与实例方法相同:

  1. 隐藏方法(在子类中)的返回类型必须与隐藏方法(在父类(super class)中)的返回类型赋值兼容。
  2. 隐藏方法的访问修饰符不能比隐藏方法的访问修饰符更严格。
  3. T 中的方法 m 在删除后 与另一个方法 n< 具有相同的签名是错误的 可在 T 中访问,除非 m 删除之前的签名是方法 n 的子签名。
  4. 对隐藏、覆盖或实现声明为抛出已检查异常的其他方法的方法的 throws 子句有限制。 (基本上,隐藏方法不能声明为抛出未在隐藏/覆盖/实现方法中声明的已检查异常。)

我想就是这样,但请参阅 JLS 了解更多详细信息。 JLS 没有解释这些规则的基本原理,但它们中的大多数似乎旨在防止多态性问题。您希望在使用父类的任何地方都可以使用子类。

关于java - 静态方法重新定义规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11814789/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com