考虑以下程序:
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
答案 0 :(得分:6)
要能够访问在子类中声明的方法,必须向下转换到相应的类:
((Splender) b).run2();
使用不兼容的对象时,当然会导致运行时错误。
答案 1 :(得分:4)
通过再次投射
((Splender)b).run2();
别无他法。
答案 2 :(得分:4)
使用Bike b = new Splender();
时,您将变量b
分配为Bike
类型。
要访问Splender
的方法,您需要强制转换:((Splender) b).run2();
正如我看到的您的评论:实现接口会导致编译器不了解“专用”方法的相同编译“问题”,而他只会知道接口方法。但是投射也可以在那工作。
避免这种情况的唯一方法是将run2()
移至与您的问题/用例相矛盾的界面