如何在Java中实现运行时多态

时间:2019-06-12 11:10:19

标签: java

考虑以下程序:

class Bike{
   void run(){System.out.println("running");}
 }

class Splender extends Bike{

   void run(){
          System.out.println("running safely with 60km");
   }

   void run2(){
        System.out.println("running2 safely with 60km");
   }

   public static void main(String args[]){
     Bike b = new Splender();//upcasting
     b.run2();
   }
 }

我的问题:

b.run2();

如何使用基类对象访问派生类的run2方法? 到目前为止,它会引发编译错误:

242/Splender.java:12: error: cannot find symbol
     b.run2();
      ^
  symbol:   method run2()
  location: variable b of type Bike
1 error

3 个答案:

答案 0 :(得分:6)

要能够访问在子类中声明的方法,必须向下转换到相应的类:

((Splender) b).run2();

使用不兼容的对象时,当然会导致运行时错误。

答案 1 :(得分:4)

通过再次投射

((Splender)b).run2();

别无他法。

答案 2 :(得分:4)

使用Bike b = new Splender();时,您将变量b分配为Bike类型。 要访问Splender的方法,您需要强制转换:((Splender) b).run2();

正如我看到的您的评论:实现接口会导致编译器不了解“专用”方法的相同编译“问题”,而他只会知道接口方法。但是投射也可以在那工作。
避免这种情况的唯一方法是将run2()移至与您的问题/用例相矛盾的界面