繁体   English   中英

声明对象为其超类与对象之间的区别?

[英]Difference between declaring object as its superclass and its class?

我已经阅读了Java书籍的继承部分,并尝试了以下示例作为练习:

public class Car {
private int wheels;
private int doors;
public Car(int initWheels, int initDoors){
    wheels = initWheels;
    doors = initDoors;
}
public int getWheels(){
    return  wheels;
}
public int getDoors(){
    return doors;
}

protected int calculateMaterials(){
    return wheels + doors;
}
}

public class Ford extends Car{
private String color;
private String type;
private int horsePower;
public Ford(int initWheels, int initDoors, String initColor, String initType, int initHorsePower){
    super(initWheels, initDoors);
    color = initColor;
    type = initType;
    horsePower = initHorsePower;
}
public String getColor(){
    return color;
}
public String getType(){
    return type;
}

protected int calculateMaterials(){
    return getWheels() + getDoors() + horsePower;
}
}

主要:

public class Main {
public static void main(String [] args){
    Car car = new Car(4,4);
    Car myCar = new Ford(6,2,"black", "pickup", 2);
    System.out.println(myCar.getWheels());
    System.out.println(myCar.calculateMaterials());
  }
}

但是,在重新查看代码之后,我问自己是否可行: Car myCar = new Ford(6,2,"black", "pickup", 2); 我运行它,看到输出完全相同,现在我想知道是否:

Car myCar = new Ford(6,2,"black", "pickup", 2);

和这个

Ford myCar = new Ford(6,2,"black", "pickup", 2);

同样的事情,如果是这样,那是更可取或更普遍的? 如果没有,我如何得到相同的输出?

问题是,您将引用类型声明为Car您将得到我认为的预期结果

Ford myCar = new Ford(6,2,"black", "pickup", 2);

有几个人提出了一个好处,即您实际上并未使构造函数过载。 这确实是更大的问题。 只有当顶级类和继承类的构造函数具有相同的参数时,才真正发生重载构造函数。 结果,只要您包含五个参数,就总是调用福特构造函数。

您会得到相同的输出,因为carCar而不是Ford的类型的引用。 因此,您不能将Ford的方法传递给参考car因为它的参考类型是Car not Ford 因此,要获得所需的内容,必须将参考变量car的参考类型更改为Ford例如:

Ford fordCar = new Ford(6,2,"black", "pickup", 2);

但是,这是: Car myCar = new Car(6,2,"black", "pickup", 2); 根本不应该编译,因为Car构造函数没有在Car定义的5参数构造函数

根据经验:

  • 在方法中,使用所需的类型(如果需要福特专用的东西,请使用福特,否则使用汽车)
  • 在函数的返回值中,使用与方法中相同的类型
  • 在将值作为参数传递时,请在参数声明中使用所需的类型,例如,如果要仅使用特定于Car的东西,请使用print(Car car);否则,如果需要福特特定的东西,请使用print(Ford ford)

哪个更合适或更普遍?

这取决于您打算如何使用参考。 如果必要的方法仅特定于Car类型的对象,则应将引用声明为此类。 但是,如果您需要获取与子类相关的详细信息(在示例中为Ford ),则应声明该类型。 换句话说,请始终使用必要的最少特定类型。

如果没有,我如何得到相同的输出?

因为在两种情况下都使用仅与类型Car相关联的值。 如果您不向Ford添加更多类型特定的信息,那么它可能不应该是自己的类型。

运行以下示例将输出8、10和10。object(new)的实例是告诉JVM运行哪个代码的信息,而不是类型的信息。 在此示例中,即使将myCar和myCarToo都实例化为福特类型,即使它们存储在类型为Car和Ford的变量中。

主要:

public class Main {
public static void main(String [] args){
    Car car = new Car(6,2);
    Car myCar = new Ford(6,2,"black", "pickup", 2);
    Ford myCarToo = new Ford(6,2,"black", "pickup", 2);

    System.out.println(car.calculateMaterials());  //Car.calculateMaterials
    System.out.println(myCar.calculateMaterials());  //Ford.calculateMaterials
    System.out.println(myCarToo.calculateMaterials());  //Ford.calculateMaterials
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM