Java 继承 - 可以简化将超类对象传递给子类吗?

我们知道


String s = new Object();

会导致错误:


incompatible types: Object cannot be converted to String

因此,从下面的例子中,我们不能这样做:


Car car = new Vehicle();

但是如果 Java 有这样的东西会有什么问题:


超级班:


    public class Vehicle {

        String color;

        int numberOfWheels;

        int maxSpeed;

        // etc.

    }

子类:


    public class Car extends Vehicle {


        String engineType;

        String transmissionType;

        int numberOfDoors;

        // etc.


        Car(Vehicle vehicle) {

                            // the theoretical idea of passing

                            // the superclass object within a subclass

            super = vehicle;

        }

    }

'超级 = 车辆;' 将允许我们一次性将先前设置的超类(车辆)的所有值传递给新的子类(汽车)。用法是:


    public class App {


        public static void main(String[] args) {


            Vehicle vehicle = new Vehicle();

            vehicle.color = "GREEN";

            vehicle.maxSpeed = 100;

            vehicle.numberOfWheels = 4;


            Car car = new Car(vehicle);


                                        // this would print: GREEN

            System.out.println("Car color is: " + car.color);

        }

    }

也许已经有一种简单的方法可以类似地做到这一点。


“照亮那些仍然在黑暗中的人......”


隔江千里
浏览 212回答 3
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*/);

手掌心

由于您将 Vehicle 声明为非抽象类,因此 JVM 将其视为可实例化的类。super 和 this 是面向对象语言中具有特殊含义的引用。如果您熟悉面向对象的编译器和运行时环境,您就会明白为什么不能访问派生类。想象一下,您必须拥有继承 Vehicle 的具体类,那么您要引用哪个具体类?另一个问题,编译器根据模式在堆中占用空间,它将所有信息(属性和行为)收集为对象的单个构建块,覆盖属性并为所有方法保留空间,此引用意味着所有方法都被一致定义类和超类的非重写方法,(超类只是开发中的概念,在运行时它的空间将与它的音乐会类合并),超引用意味着被它的子类重写但仍然是方法的代码空间的所有方法由构建块寻址。通过这些简单的问题,您会发现更改超级引用或此引用是不可能的,并且将围绕 OOP 概念。

撒科打诨

您可以执行类似的操作,但您仍然需要提供Car特定信息(作为Car构造函数的参数或默认值,或两者的组合)。一种相当常见的方法是为in定义一个复制构造函数:VehicleVehiclepublic 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}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java