当一个类扩展另一个类时,它会继承超类的所有方法和变量。如果您在具有相同签名的子类中以不同方式定义方法和变量,则可以在子类中以不同方式使用。现在 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 知道得更好,所以我想我只是不理解这篇文章。当我从超类的对象调用实例方法时,它使用被覆盖的方法是不可能的。所以我不明白为什么要区分覆盖和隐藏!有人可以帮忙吗?
编辑; 插入代码而不是描述类!