Java-多态时方法调用问题
多态时方法调用问题:
前提:必须先存在多态情况:
存在父类:SuperClass,子类:SubClass,方法:doWork.
--------------------------------------------------------------------
测试代码:
SuperClass clz = new SubClass();//多态
clz.doWork();//???输出什么结果
情况1: doWork方法存在于SuperClass中,不存在于SubClass中.
此时执行结果: 编译通过,执行SuperClass的doWork方法.
//父类 class SuperClass{ public void doWork(){ System.out.println("Super.doWork"); } } //子类 class SubClass extends SupreClass{}
应该先从SubClass类中去找doWork方法,找不到,再去父类SuperClass类中找.
情况2: doWork方法存在于SubClass中,不存在于SuperClass中.
//父类 class SuperClass{} //子类 class SubClass extends SuperClass{ public void doWork(){ System.out.println(SubClass.doWork); } }
此时执行结果: 编译错误.
编译时期,会去编译类型(SuperClass)中找是否有doWork方法:
找 到:编译通过.
找不到:编译报错.
情况3: doWork方法存在于SuperClass和SubClass中.
//父类 class SuperClass{ public void doWork(){ System.out.println(Super.doWork); } } //子类 class SubClass extends SuperClass{ public void doWork(){ System.out..println("SubClass.doWork"); } }
此时执行结果: 编译通过,执行SubClass的doWork方法.
在运行时期,调用运行类型(SubClass)中的方法.
情况4: doWork方法存在于SuperClass和SubClass中,但是doWork是静态方法.
此时这种情况,我们称之为隐藏,而不叫方法覆盖.
//父类 class SuperClass{ static public void doWork(){ System.out.println("super.doWork"); } } //子类 class SubClass extends SuperClass{ static public void doWork(){ System.out.println("SubClass.doWork"); } }
此时执行结果: 编译通过,执行SuperClass的doWork方法.
静态方法的调用只需要类即可.
如果使用对象来调用静态方法,其实使用的是对象的编译类型来调用静态方法.
和对象没有关系.
共有 0 条评论