Java继承:覆盖或隐藏的方法

lis*_*isa 2 java inheritance overwrite

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

让我们假设我有2个类是和可能.是延伸可能.也许有String 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();
}
Run Code Online (Sandbox Code Playgroud)

我说:它会打印出来,也许是的,也许是的

但在我阅读了Oracle文章后,我认为它必须打印出来:

yes
yes
maybe
yes
Run Code Online (Sandbox Code Playgroud)

因为实例方法会覆盖其超类方法.

我很确定我对输出是正确的,但我也很确定,甲骨文知道的更好,所以我想我只是不理解这篇文章.当我从超类的对象调用实例方法时,它使用覆盖的方法是不正确的.所以我不明白为什么要区分覆盖和隐藏!有人可以帮忙吗?

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

JB *_*zet 5

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

如果你打电话Maybe.printOut(),它会调用中printOut()定义的静态方法Maybe.事实上,还有一个printOut()定义的方法Yes是无关紧要的:除了它们的名字之外,这两种方法没有任何共同之处.

请注意,您只需编写程序并执行即可确认或确认您的疑虑.

只有当您开始在对象的实例上调用静态方法时,才会出现隐藏方法的问题.这是非常糟糕的做法,永远不应该这样做.如果您不遵守此规则,请执行以下操作:

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();
Run Code Online (Sandbox Code Playgroud)

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