gpt4 book ai didi

java - 为接受父对象的子类编写 Java 构造函数

转载 作者:行者123 更新时间:2023-12-01 13:31:07 25 4
gpt4 key购买 nike

是否可以使用父对象来实例化子对象? Length2 类扩展了 Length1,并添加了一个实例变量。我尝试创建一个复制构造函数,将 Length1 作为参数并将额外的 ivar 设置为 0,但我仍然被告知无法从 Legnth1 转换为 Length2。我想可能发生了一些隐式转换...看看。

public class Length1 extends Length implements Comparable<Length1>{

protected int miles;
protected int yards;

public Length1(){ //default constructor
miles = 0;
yards = 0;
}

public Length1(int m, int y){ //constructor
miles = m;
yards = y;
}

public void setYards(int x){
yards = x;
}
public void setMiles(int x){
miles = x;
}
public int getYards(){
return yards;
}
public int getMiles(){
return miles;
}

...

public class Length2 extends Length1 {

protected int feet;

public Length2(){ //default constructor
super(0,0);
setFeet(0);
}
public Length2(int m, int y, int f){ // constructor
super(m,y);
setFeet(f);
}
public Length2(Length1 x){
super(x.miles,x.yards);
setFeet(0);
}
public void setFeet(int x){
feet = x;
}
public int getFeet(){
return feet;
}

...

public class LengthTest{

public static void main(String[] args) {
Length1 a,b,c,d,e,f;
Length2 g,h,i,j;

a = new Length1(78,1610);
b = new Length1(77,1694);
c = new Length1();
d = new Length1();

g = new Length2(32,1022,1);
h = new Length2(31,1700,2);
i = new Length2();
j = new Length2();


j = c; //problem occurs here


}

}

最佳答案

你不能这么做。 Length2 是 Length1,因此您始终可以将 Length2 对象 分配给 Length1 引用(您无需强制转换它)。您还可以将指向 Length2 对象的 Length1 引用分配给声明为 Length2 的另一个引用。在这种情况下,您需要显式转换,因为编译器在编译时并不知道 Length1 引用实际上是 Length2。但是您尝试做的事情是不可能的,因为 Length1 不是 Length2

这就像说Car 扩展了Vehicle。您随时可以指向汽车并说汽车

Car c = new Car();

一切都好。您可以随时指着其中一个车辆并说车辆:

Vehicle v = new Car();

没问题。这里唯一的问题是,如果您决定调用 CarprintLicensePlate() 方法,该方法在 Vehicle 中不存在,而 Vehicle 具有一种方法称为printSpeed()。由于 Car 是“车辆”,因此您可以随时调用:

c.printSpeed();
c.printLicensePlate();

v.printSpeed();

但是你不能调用:

v.printLicensePlate();

即使您知道v是一辆Car。在这种情况下,您可以使用强制转换来转换引用。这是非法的:

c = v; // WRONG

因为在编译时我们不知道c中到底是什么,因为new Car()只发生在运行时。所以你告诉编译器“相信我,这真的是一辆汽车”,方法是:

c = (Car) v;

但是你所做的是这样的:

Car c = new Vehicle(); // WRONG

您指着一个通用的车辆并说汽车。虽然 Car 始终是 Vehicle,但 Vehicle 可能不是汽车。 (使用c引用,编译器认为您可以合法地调用c.printLicensePlate(),但在运行时您找到的对象没有这样的方法。所以即使您可以如果编译器通过强制转换引用来传递它,则它不会工作,并且会在运行时产生 ClassCastException。)

关于java - 为接受父对象的子类编写 Java 构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21567139/

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