gpt4 book ai didi

java - 需要澄清继承和异常

转载 作者:搜寻专家 更新时间:2023-10-31 08:28:12 25 4
gpt4 key购买 nike

所以我想弄清楚为什么一个程序会这样编译,希望你们能为我解释一下。

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()
}
}

所以上面程序的输出将是

汽车行驶
汽车行驶
汽车行驶

我的问题是,为什么我必须做一个 try/catch block 来为 v 和 c2 对象而不是 c 调用 drive() 方法?它们都是 Car 的实例,所以这里发生了什么?

最佳答案

Vehicle 有一个抛出异常的 drive() 方法。

Car 用它自己的 Drive() 方法覆盖了 VehicleDrive() 方法不抛出异常。

你得到你所做的输出的原因是因为即使 Vehicle v 是 car 类型,编译器在编译时不知道这个事实,所以当你调用 v .drive() 编译器不知道您正在调用 Car 的 drive 方法。

假设您通过以下方式实例化了 v:

Vehicle v;
if(rand(0,1) == 1)
v = new Car();
else
v = new Vehicle();

你在编译的时候并不知道 v 是不是一辆汽车。在运行该程序之前,您不会知道。

关于java - 需要澄清继承和异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11459495/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com