一尘不染

Overriding vs Hiding Java - Confused

java

我对重写与隐藏在Java中有何不同感到困惑。谁能提供更多有关这些差异的详细信息?我阅读了Java教程,但是示例代码仍然让我感到困惑。

更清楚地说,我理解压倒一切。我的问题是,除了一个隐藏在实例级别而另一个隐藏在类级别之外,我看不到隐藏有什么不同。

查看Java教程代码:

public class Animal {
    public static void testClassMethod() {
        System.out.println("Class" + " method in Animal.");
    }
    public void testInstanceMethod() {
        System.out.println("Instance " + " method in Animal.");
    }
}

然后我们有一个子类Cat

public class Cat extends Animal {
    public static void testClassMethod() {
        System.out.println("The class method" + " in Cat.");
    }
    public void testInstanceMethod() {
        System.out.println("The instance method" + " in Cat.");
    }

    public static void main(String[] args) {
        Cat myCat = new Cat();
        Animal myAnimal = myCat;
        Animal.testClassMethod();
        myAnimal.testInstanceMethod();
    }
}

然后他们说:

该程序的输出如下:

`Class method in Animal.

The instance method in Cat.`

对我来说,testClassMethod()直接从Animal类中调用类方法会在类中执行该方法这一事实Animal是显而易见的,在那里没有什么特别的。然后,他们testInstanceMethod()从引用调用myCat,因此很明显,然后执行的方法是的实例中的方法Cat

从我的角度来看,呼叫隐藏的行为就像覆盖一样,那么为什么要区分它呢?如果我使用上面的类运行此代码:

Cat.testClassMethod();

我会得到: Cat中的class方法。 但是,如果我testClassMethod()从Cat中删除,则将得到: Animal中的类方法。

这说明在子类中编写具有与父代相同的签名的静态方法几乎可以重写。

希望我能弄清楚我的困惑之处,并且有人可以阐明。首先十分感谢!


阅读 282

收藏
2020-03-18

共1个答案

一尘不染

覆盖基本上支持后期绑定。因此,在运行时确定将调用哪种方法。它用于非静态方法。

隐藏适用于所有其他成员(静态方法,实例成员,静态成员)。它基于早期绑定。更明确地说,要在编译时确定要调用或使用的方法或成员。

在你的示例中,第一个调用Animal.testClassMethod()是对static方法的调用,因此可以确定要调用哪个方法。

在第二个调用中myAnimal.testInstanceMethod(),你将调用一个非静态方法。这就是所谓的运行时多态。直到运行时才确定要调用哪种方法。

2020-03-18