1

スーパー クラスと、Vehicleそれを拡張する 3 つのクラスがあります。さまざまなタイプの車両を含むリンクされたリストが必要です。使用しますBusCarTruck

list = new LinkedList<Vehicle>()

を使用するとうまくいくようSystem.out.println(list.get(2))ですが、理由がわかりませんか?私は異なるクラスに実験toString()関数として追加しましVehicleたが、それでも拡張されたクラスのtoString(). いつ父親の機能を使用し、いつ息子の機能を使用しますか?

異なるクラスはすべて同じ関数を持ちますが、プライベート変数は異なります。

クラスは次のとおりです。

public class Vehicle {

    protected String maker;
    protected int year;
    private int fuel; //0 1 2 3 4

    public Vehicle (String maker, int year) {
        this.maker = maker;
        this.year = year;
        this.fuel = 0;
    }

    public void drive () {...}

    public void fill () {...}
}

バス:

public class Bus extends Vehicle{

    private int sits;

    public Bus (String maker, int year, int sits) {
        super (maker, year);
        this.sits = sits;
    }

    public String toString () {...}
}

トラック:

public class Truck extends Vehicle{

    private int weight;

    public Truck (String maker, int year, int weight) {
        super (maker, year);
        this.weight = weight;
    }

    public String toString () {...}
}

車:

public class Car extends Vehicle{

    private float volume;

    public Car (String maker, int year, float volume) {
        super (maker, year);
        this.volume = volume;
    }

    public String toString () {...}
}
4

2 に答える 2

3

はい、違いが非公開である限り、型キャストなしで機能します。インターフェイスに表示されないメソッドにメソッドを追加すると、その瞬間が変わります。

于 2011-06-20T09:24:09.797 に答える
3

もちろん、オブジェクトListを含むを作成できます。Vehicle

List<Vehicle> list = new LinkedList<Vehicle>();

そうすると、インデックス 2System.out.println(list.get(2));のオブジェクトが取得されて呼び出され、この文字列がコンソールに出力されます (もちろん、自分で簡単に試すことができます)。VehicletoString()

orに固有Busのメソッドを呼び出したい場合(つまり、スーパークラスではなく、これらのクラスのいずれかで定義されている) を呼び出したい場合、 の結果をキャストせずにそれを行う方法はないことに注意してください。TruckCarlist.get(...)

Vehicleクラスで宣言されている(またはスーパークラス - classtoString()で宣言されている)任意のメソッドをキャストせずに呼び出すことができ、特定のオブジェクト ( 、または) にObject適したメソッドが呼び出されます。これがポリモーフィズムのすべてです。BusTruckCar

于 2011-06-20T09:26:25.087 に答える