3 回答
TA贡献1818条经验 获得超3个赞
因此,从下面的例子中,我们不能这样做:
Car car = new Vehicle();
是的,你不能这样做,因为Vehicle是Car. 所以,你可以这样做:
Vehicle car = new Car();
这是多态性的一部分。做你想做的事情的简单方法是,
首先在Vehicle类中添加构造函数,
public Vehicle(String color, int numberOfWheels, int maxSpeed) {
this.color = color;
//other two assignment
}
然后在Car类构造函数中,
public Car(String color, int numberOfWheels, int maxSpeed, String engineType, String transmissionType, int numberOfDoors) {
super(color, numberOfWheels, maxSpeed);
this.engineType = engineType;
this.transmissionType = transmissionType;
this.numberOfDoors = numberOfDoors;
}//keep remember, you can also use constructor overloading.
现在里面main(),
Vehicle car = new Car(/*arguments*/);
TA贡献1942条经验 获得超3个赞
由于您将 Vehicle 声明为非抽象类,因此 JVM 将其视为可实例化的类。
super 和 this 是面向对象语言中具有特殊含义的引用。如果您熟悉面向对象的编译器和运行时环境,您就会明白为什么不能访问派生类。
想象一下,您必须拥有继承 Vehicle 的具体类,那么您要引用哪个具体类?
另一个问题,编译器根据模式在堆中占用空间,它将所有信息(属性和行为)收集为对象的单个构建块,覆盖属性并为所有方法保留空间,此引用意味着所有方法都被一致定义类和超类的非重写方法,(超类只是开发中的概念,在运行时它的空间将与它的音乐会类合并),超引用意味着被它的子类重写但仍然是方法的代码空间的所有方法由构建块寻址。
通过这些简单的问题,您会发现更改超级引用或此引用是不可能的,并且将围绕 OOP 概念。
TA贡献1934条经验 获得超2个赞
您可以执行类似的操作,但您仍然需要提供Car特定信息(作为Car构造函数的参数或默认值,或两者的组合)。
一种相当常见的方法是为in定义一个复制构造函数:VehicleVehicle
public Vehicle(Vehicle other) {
this.color = other.color;
this.numberOfWheels = other.numberOfWheels;
this.maxSpeed = other.maxSpeed;
}
然后在 中Car,您使用该复制构造函数,然后充实Car细节:
public Car(Vehicle v/*, and possibly car-specified args...*/) {
super(v);
// ...fill in `Car`-specific information
}
添加回答
举报