所以我想弄清楚为什么一个程序正在编译它的方式,希望你们能为我解释它.
class Vehicle{
public void drive() throws Exception{
System.out.println("Vehicle running");
}
}
class Car extends Vehicle{
public void drive(){
System.out.println("Car Running");
}
public static void main(String[] args){
Vehicle v = new Car();
Car c = new Car();
Vehicle c2 = (Vehicle) v;
c.drive();
try {
v.drive();
} catch (Exception e) {
e.printStackTrace();
} //try v.drive()
try {
c2.drive();
} catch (Exception e) {
e.printStackTrace();
} //try c2.drive()
}
}
Run Code Online (Sandbox Code Playgroud)
所以上述程序的输出将会是
汽车
跑车
跑车运行
我的问题是,为什么我必须执行try/catch块来为v和c2对象调用drive()方法而不是c?他们都是Car的例子,所以这里发生了什么?
Sam*_*ica 10
Vehicle有一个drive()抛出异常的方法.
Car覆盖Vehicle的Drive()用它自己的方式Drive()方法不抛出异常.
你得到输出的原因是因为即使Vehicle v是car类型,编译器在编译时也不知道这个事实,所以当你调用v.drive()编译器时不知道你正在调用Car的drive方法.
假设您v以下列方式实例化:
Vehicle v;
if(rand(0,1) == 1)
v = new Car();
else
v = new Vehicle();
Run Code Online (Sandbox Code Playgroud)
编译时,你不知道v是否是汽车.在你运行程序之前你不会知道.
| 归档时间: |
|
| 查看次数: |
124 次 |
| 最近记录: |