在子类中重新定义静态方法

发布于 2024-09-10 11:26:57 字数 497 浏览 9 评论 0原文

我想知道为什么 Java 中首先允许这样做(或者一般来说哎呀) 我记得静态方法对于父类和子类都是通用的

public class Redefine extends Parent{
    public static void test () {

    }
}


class Parent{
    public static void test () {

    }
}

问题1:由于静态方法不支持重写,两个类如何包含相同的方法?

Q2:如果更改静态方法以引发未定义的异常,则无法编译。 为什么会这样。它显然不是压倒性的,所以我应该被允许抛出新的异常,对吗?

public class Redefine extends Parent{
    public static void test () throws Exception{

    }
}

I would like to know the reason why this is first allowed in Java (or oops in general)
I remember that the static methods are common for both parent and child class

public class Redefine extends Parent{
    public static void test () {

    }
}


class Parent{
    public static void test () {

    }
}

Q1 : Since Overriding is not supported for static methods , how can both classe contain same methods ?

Q2 : If change the method in static to throw an exception not defined its not compiling.
why is the case. Its obviously not overriding so i should be allowed to throw new exceptions right ?

public class Redefine extends Parent{
    public static void test () throws Exception{

    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

恬淡成诗 2024-09-17 11:26:57

A1:静态方法是每个类的。就多态性而言,它们与继承层次结构无关。因此,调用 Parent.test() 将调用父方法,而调用 Redefine.test() 将调用子方法。

A2: JLS 8.4 .8 写道:

如果一个类声明了静态方法 m,则声明 m 被认为隐藏了超类中的任何方法 m',其中 m 的签名是 m' 签名的子签名(第 8.4.2 节)类的超级接口,否则类中的代码可以访问这些接口。

方法声明中的 throws 子句不得与它覆盖或隐藏的任何方法冲突(第 8.4.6 节);否则,会出现编译时错误。

A1:: static method are per-class. They have nothing to do with inheritance hierarchies in terms of polymorphism. So calling Parent.test() will call the parent method, while calling Redefine.test() will call the child.

A2: JLS 8.4.8 writes:

If a class declares a static method m, then the declaration m is said to hide any method m', where the signature of m is a subsignature (§8.4.2) of the signature of m', in the superclasses and superinterfaces of the class that would otherwise be accessible to code in the class.

A method declaration must not have a throws clause that conflicts (§8.4.6) with that of any method that it overrides or hides; otherwise, a compile-time error occurs.

久随 2024-09-17 11:26:57

你没有覆盖它,你隐藏

http://faq.javaranch。 com/java/OverridingVsHiding

你得到了什么异常?

you arent overriding it, you are hiding it

http://faq.javaranch.com/java/OverridingVsHiding

what exception are you getting?

梦太阳 2024-09-17 11:26:57

Q1:静态方法不会被重写,因此这是两个具有相同签名的不同方法。一个是用 Parent.test() 调用的,另一个是用 Redefine.test() 调用的。

Q2:你的方法似乎是有效的。你得到什么错误?

Q1: Static methods are not overridden, so these are two different methods with the same signature. One is called with Parent.test(), the other is called with Redefine.test()

Q2: Your method seems valid. What error do you get?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文