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方法.

静态方法的调用只需要类即可.

如果使用对象来调用静态方法,其实使用的是对象的编译类型来调用静态方法.

和对象没有关系.

版权声明:
作者:yfeer
链接:https://www.yfeer.com/631.html
来源:个人编程学习网
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>