为了账号安全,请及时绑定邮箱和手机立即绑定

覆盖vs隐藏Java-困惑

覆盖vs隐藏Java-困惑

大话西游666 2019-10-15 10:08:02
我对覆盖与隐藏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中的类方法。这说明在子类中编写与父代签名相同的静态方法几乎可以实现覆盖。希望我能弄清楚我的困惑之处,并且有人可以阐明。首先十分感谢!
查看完整描述

3 回答

?
呼如林

TA贡献1798条经验 获得超3个赞

覆盖基本上支持后期绑定。因此,将在运行时确定调用哪种方法,这是针对非静态方法的。隐藏适用于所有其他成员(静态方法,实例成员,静态成员)。它基于早期绑定。更明确地说,要在编译时确定要调用或使用的方法或成员。


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


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


查看完整回答
反对 回复 2019-10-15
  • 3 回答
  • 0 关注
  • 350 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信