gpt4 book ai didi

Java 继承 : Overwritten or hidden methods

转载 作者:行者123 更新时间:2023-11-30 05:52:22 24 4
gpt4 key购买 nike

当一个类扩展另一个类时,它继承父类(super class)的所有方法和变量。如果您在具有相同签名的子类中以不同方式定义方法和变量,则它们可以在子类中以不同方式使用。现在 Oracle 区分覆盖和隐藏 (http://docs.oracle.com/javase/tutorial/java/IandI/override.html)。它说实例方法会覆盖其父类(super class)的方法,而类方法会隐藏它。“隐藏和覆盖之间的区别具有重要意义。被调用的被覆盖方法的版本是子类中的版本。被调用的隐藏方法的版本取决于它是从父类(super class)还是从子类调用。”

假设我有 2 个类 Yes 和 Maybe。是的扩展了可能。可能有字符串 a。

class Maybe {
String a;
public static void printOut() {
System.out.println("Maybe");
}
public void printAndSet() {
a = "Maybe";
System.out.println(a);
}

}
class Yes extends Maybe {
public static void printOut() {
System.out.println("Yes");
}
pubilc void printAndSet() {
a = "Yes";
}
}
class Print{
public static void mail(String[] args) {
Maybe m = new Maybe();
Yes y = new Yes();
Maybe.printOut();
Yes.printOut();
m.printAndSet();
y.printAndSet();
}

然后我说:它会打印出来或许是的或许是的

但是在我看了 Oracle 文章之后我认为它必须打印出来:

yes
yes
maybe
yes

因为实例方法覆盖了它的父类(super class)方法。

我很确定我的输出是正确的,但我也很确定,Oracle 知道更好,所以我想我只是不明白这篇文章。当我从父类(super class)的对象调用实例方法时,它使用的是被覆盖的方法,这不可能是真的。所以我不明白为什么要区分覆盖和隐藏!有人可以帮忙吗?

编辑;插入代码而不是描述类!

最佳答案

静态方法根本无法被覆盖。它们不是多态调用,因为它们不作用于类的实例,而是作用于类本身。

如果调用 Maybe.printOut(),它将调用 Maybe 中定义的静态 printOut() 方法。在 Yes 中还定义了一个方法 printOut() 这一事实是无关紧要的:这两个方法除了它们的名称外没有任何共同点。

请注意,您可以通过简单地编写并执行程序来证实或证实您的疑问。

隐藏方法的问题只会在您开始对对象实例调用静态方法时出现。这是非常糟糕的做法,永远不应该这样做。如果您不遵守此规则,并且有以下情况:

Maybe m = new Maybe();
Maybe y = new Yes();

m.printOut(); // DON'T DO THAT: it should be Maybe.printOut();
y.printOut(); // DON'T DO THAT: it should be Maybe.printOut() or Yes.printOut();

结果将是maybe maybe,因为在静态方法的情况下,重要的是不是对象的具体类型(MaybeYes),但它们的声明类型(MaybeMaybe)。

关于Java 继承 : Overwritten or hidden methods,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11720216/

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