在 Java 中再次向下转换执行父构造函数?
Downcasting excecuting parent constructor again in Java?
为了理解向下转型,我做了以下代码。
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());
}
}
}
现在输出是
Dummy:0
default:2
虽然我预计 Dummy:0 Dummy:2
看起来父构造函数被调用了第二次?请解释这里发生了什么。
另外,如何在没有调用父对象的情况下进行向下转换?
第二次调用父构造函数,因为您正在创建两个对象。
Vehicle v = new Vehicle("Dummy"); // first object created here
v.print();
v = new TwoWheeler(); // second object created here
您不能将基础 class 实例(例如您创建的第一个对象)的类型更改为子 class 实例。
你可以做的是定义一个 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();
Vehicle v = new Vehicle("Dummy");
//First object create with following properties,
name = "Dummy"
tyres = 0
v = new TwoWheeler();
//Second object created with following properties,
/* Flow goes like,
TwoWheeler() constructor called,
flow again go up to super and assign name with "default",
while flow come back to TwoWheeler() constructor ,
tyres = 2 assign.
*/
最后,输出如您所显示。
并进入
为了理解向下转型,我做了以下代码。
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());
}
}
}
现在输出是 Dummy:0 default:2
虽然我预计 Dummy:0 Dummy:2 看起来父构造函数被调用了第二次?请解释这里发生了什么。 另外,如何在没有调用父对象的情况下进行向下转换?
第二次调用父构造函数,因为您正在创建两个对象。
Vehicle v = new Vehicle("Dummy"); // first object created here
v.print();
v = new TwoWheeler(); // second object created here
您不能将基础 class 实例(例如您创建的第一个对象)的类型更改为子 class 实例。
你可以做的是定义一个 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();
Vehicle v = new Vehicle("Dummy");
//First object create with following properties,
name = "Dummy"
tyres = 0
v = new TwoWheeler();
//Second object created with following properties,
/* Flow goes like,
TwoWheeler() constructor called,
flow again go up to super and assign name with "default",
while flow come back to TwoWheeler() constructor ,
tyres = 2 assign.
*/
最后,输出如您所显示。 并进入