【发布时间】:2012-07-28 01:05:09
【问题描述】:
当一个类扩展另一个类时,它会继承超类的所有方法和变量。如果您在具有相同签名的子类中以不同方式定义方法和变量,则可以在子类中以不同方式使用。 现在 Oracle 区分了覆盖和隐藏 (http://docs.oracle.com/javase/tutorial/java/IandI/override.html)。 它说实例方法覆盖其超类的方法,而类方法隐藏它。 “隐藏和覆盖之间的区别具有重要意义。被调用的覆盖方法的版本是子类中的版本。被调用的隐藏方法的版本取决于它是从超类调用还是从子类调用。”
假设我有 2 个课程 Yes 和 Maybe。 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
因为实例方法覆盖了它的超类方法。
我很确定我的输出是正确的,但我也很确定,Oracle 知道 更好,所以我想我只是不明白这篇文章。 当我从超类的对象调用实例方法时,它使用被覆盖的方法是不可能的。 所以我不明白为什么要区分覆盖和隐藏! 有人可以帮忙吗?
编辑;插入代码而不是描述类!
【问题讨论】:
-
能否请您发布这些类的代码而不是描述它们?这样一来,您所谈论的代码类型就毫无疑问了。
-
stackoverflow.com/questions/10594052/… 是基本相同问题的一个很好的答案。
-
@JoachimSauer 好吧对不起,我下次贴代码!
-
@cups:您不必等待下一次,您可以直接在此处编辑问题。
标签: java inheritance overwrite