Составление списка разных типов в Java - PullRequest
1 голос
/ 20 июня 2011

У меня есть суперкласс Vehicle и три класса, которые расширяют его: Bus, Car и Truck.Я хочу иметь связанный список, который будет содержать автомобили разных типов, я использую

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 () {...}
}

Ответы [ 2 ]

3 голосов
/ 20 июня 2011

Конечно, вы можете сделать List, который содержит Vehicle объектов:

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

Когда вы делаете System.out.println(list.get(2));, тогда он получает объект Vehicle с индексом 2 и вызывает на нем toString(), а затем эта строка выводится на консоль (вы, конечно, можете легко попробовать это самостоятельно).

Обратите внимание, что если вы хотите вызвать метод, специфичный для Bus, Truck или Car (т. Е. Определенный в одном из этих классов, а не в суперклассе), то нет способа сделать это без применения результата list.get(...).

Вы можете вызвать любой метод, который объявлен в классе Vehicle (или суперклассы - toString() объявлен в классе Object) без приведения, и метод, соответствующий конкретному объекту (Bus, Truck или Car) будет называться - вот что такое полиморфизм - это все.

3 голосов
/ 20 июня 2011

Да, это будет работать без приведения типов, пока различия будут частными. Это изменится, как только вы добавите метод к тому, который не отображается в интерфейсе.

...