覆盖vs隐藏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();

    }

}

然后他们说:


该程序的输出如下:


Animal中的类方法。


Cat。中的实例方法。


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


从我所见,呼叫隐藏的行为就像覆盖一样,所以为什么要区分它。如果我使用上面的类运行此代码:


Cat.testClassMethod();

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


这说明在子类中编写与父代签名相同的静态方法几乎可以实现覆盖。


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


大话西游666
浏览 351回答 3
3回答

呼如林

覆盖基本上支持后期绑定。因此,将在运行时确定调用哪种方法,这是针对非静态方法的。隐藏适用于所有其他成员(静态方法,实例成员,静态成员)。它基于早期绑定。更明确地说,要在编译时确定要调用或使用的方法或成员。在您的示例中,第一个调用Animal.testClassMethod()是对static方法的调用,因此,可以确定要调用哪个方法。在第二个调用中myAnimal.testInstanceMethod(),它调用一个非静态方法。这就是所谓的运行时多态。直到运行时才确定要调用哪种方法。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java