gpt4 book ai didi

java - 在Java中再次向下转换执行父构造函数?

转载 作者:太空宇宙 更新时间:2023-11-04 13:11:18 25 4
gpt4 key购买 nike

为了理解向下转型,我编写了以下代码。

class Vehicle{
protected int tyres=0;
protected String name="default";
Vehicle(){

}
Vehicle(String aname){
name=aname;
}
//abstract void setTyres(int number);
public void print(){
System.out.println(name+":"+tyres);
}
}

class TwoWheeler extends Vehicle{
TwoWheeler(){
tyres=2;
}
public void print(){
System.out.println(name+":"+tyres);
}

}

class FourWheeler extends Vehicle{
FourWheeler(){
tyres=4;
}
public void print(){
System.out.println(name+":"+tyres);
}

}

public class vehicles {
public static void main(String[] args) {
try{
Vehicle v= new Vehicle("Dummy");
v.print();
v= new TwoWheeler();
v.print();
}
catch(Exception e){
System.out.println(e.toString());
}
}
}

现在的输出是假人:0默认值:2

虽然我期望虚拟:0 虚拟:2看起来父构造函数被调用了第二次?请解释一下这里发生了什么。另外,如何在不调用父级的情况下进行向下转换?

最佳答案

父构造函数被第二次调用,因为您正在创建两个对象。

    Vehicle v = new Vehicle("Dummy"); // first object created here
v.print();
v = new TwoWheeler(); // second object created here

您无法将基类实例(例如您创建的第一个对象)的类型更改为子类实例。

您可以定义一个 TwoWheeler 构造函数,该构造函数接受 Vehicle 参数,并使用传递的 Vehicle 的属性初始化新实例。这称为复制构造函数。

TwoWheeler(Vehicle source) {
super (source.getName());
tyres=2;
}

你的main将如下所示:

    Vehicle v = new Vehicle("Dummy");
v.print();
v = new TwoWheeler(v);
v.print();

关于java - 在Java中再次向下转换执行父构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33932600/

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