У меня есть абстрактный класс, который наследуют подклассы. Я хочу иметь метод get, который возвращает количество пассажиров. Я объявляю этот метод в абстрактном классе, и он вернет пассажиров.

Член класса passengers не определен, но создан, поэтому метод get знает, какую переменную вернуть.

В подклассах я хочу, чтобы эта переменная имела разные значения.

Однако метод get возвращает 0, даже если количество пассажиров не равно 0.

Я пробовал написать: passengers = random.nextInt(4) + 1;

Автомобиль абстрактного класса

import java.util.Random;

public abstract class Vehicle {
    protected Random random = new Random();
    protected int passengers;

    public int getPassengerAmount() {
        return this.passengers;
    }
}

Класс автомобилей

public class Car extends Vehicle {
    private String name = "Car";
    private int size = 1;
    public int passengers = random.nextInt(4) + 1;
}
2
FatDog 28 Янв 2020 в 13:42

3 ответа

Лучший ответ

Вы маскируете родительскую переменную путем повторного выделения переменной passengers в классе Car.

Вместо этого вы должны инициализировать родительскую переменную в конструкторе потомка:

public class Car extends Vehicle {

    private String name = "Car";
    private int size = 1;

    public Car() {
        this.passengers = random.nextInt(4) + 1;
    }

}

Если вы хотите, чтобы он был общедоступным, то вы должны сделать его общедоступным в классе Vehicle, но, если честно, я бы его не рекомендовал, и я бы предпочел использовать защищенные переменные, но публичные методы получения / установки.

2
AntoineB 28 Янв 2020 в 10:52

Ответом на ваш вопрос будет то, что вы инициализируете переменную пассажиров напрямую. Вы должны создать конструктор для него и назначить значение по умолчанию там. Кроме того, вам не нужно снова создавать открытую переменную в подклассе, иначе абстрактный класс не имеет смысла существовать. Обратите внимание, что абстрактный класс должен иметь абстрактную функцию.

0
Farrukh 28 Янв 2020 в 10:56
public class Car extends Vehicle {
    private String name = "Car";
    private int size = 1;
    public int passengers = random.nextInt(4) + 1; // this is not passengers of the superclass
    void setPassengers() { passengers = random.nextInt(4) + 1; } // this is passengers of the superclass
}
0
lainatnavi 28 Янв 2020 в 11:14