2015-02-21 2 views
1

Я имитирую заявку на парковку. И у меня есть класс Vehicle, который является абстрактным и расширены конкретными классами, такими как Car, Truck и т. Д. У меня есть переменная parkingFare, которая для каждого подкласса Vehicle будет создана как переменная класса и окончательная, чтобы все экземпляры этого конкретного класса могли использовать одинаковое значение. например, если я установил parkingFare для Car как 2 доллара, он должен быть одинаковым для всех экземпляров Car. Проблема в том, что я не могу получить доступ к этой переменной в моем конкретном классе в качестве переменной класса.Как создать статическую переменную суперкласса в подклассе как final

public abstract class Vehicle { 

String plateNo; 
LocalTime startTime; 
static int parkingFare; 
public abstract int getFare(); 
public abstract String getPlateNo(); 
public abstract LocalTime getParkedTime(); 

} 


public class Car extends Vehicle { 

    final parkingFare = 2; // how I want to instantiate it. 
    public Car(String plateNo){ 
    this.plateNo = plateNo; 
    this.startTime = LocalTime.now();  
    } 

    @Override 
    public LocalTime getParkedTime(){ 
    return startTime; 
    } 

    @Override 
    public String getPlateNo(){ 
    return plateNo; 
    } 

    @Overrid 
    public int getFare(){ 
    return parkingFare; 
    } 
} 
+0

Похоже, вы объявляете int как метод. 'public abstract int getFare();' Вы можете сделать 'public abstract int getFare1 = getFare();' – WonderWorld

+0

@WonderWorld 'getFare' метод не является моей проблемой на данный момент. его инициализация статической переменной в подклассе – Abhay

+0

Я имею в виду, что вы не можете писать 'public abstract int getFare()' afaik. '()' означает его метод. (я знаю, что это не проблема на данный момент, просто говорю.) :) – WonderWorld

ответ

0

Используйте статический-блок:

public class Car extends Vehicle { 

    static { 
     parkingFare = 2; 
    } 

    // ... 
} 

Однако это делает parkingFare одинаково во всех транспортных средствах классов, независимо от подкласса. Например, наличие другого подкласса транспортного средства. Установка шины. Парковка = 10 и работает:

Car car = new Car("Car"); 
Bus bus = new Bus("Bus"); 
System.out.println(car.getFare()); 
System.out.println(bus.getFare()); 

Результаты 10 печатаются дважды.

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

(двойной редактировать: путать с тем, как Java хранит статические переменные, но затем я проверил, и текущее описание является точным)

+0

удалив его из класса «Vehicle» и добавив его ко всем подклассам, так как статический финал должен работать.? – Abhay

+0

@ Rolf, относительно вашего предыдущего комментария: 'Статическая переменная связана с классом, не указанным в экземпляре, поэтому все экземпляры класса будут разделять статическую переменную.Вот как java обрабатывает статические переменные'. Теперь переходим к отредактированной части ответа: это вопрос инициализации, если вы находитесь в классе шины, а статический блок устанавливает тариф в 10, он останется 10 для обоих вызовов с тех же статических переменная общая. Теперь, если вы находитесь в классе автомобилей, тогда 2 будет напечатано из-за его инициализации как '2' –

+0

Да, так я думал, что это сработает, и я проверил и получил разные результаты из-за ошибок в моем тестовом коде , поэтому я был смущен не в отношении Java, а в отношении моих собственных ошибок кодирования ... –

0

Используйте это в подклассе

static { 
parkingFare=10; 
} 

Поскольку статическая переменная связан с классом не в экземпляре, поэтому все экземпляры класса будут разделять статическую переменную.

Таким образом, после инициализации parkingFare=10 всех экземпляров Class Car будет иметь тот же парковку тариф.

Теперь Приезжая в свой комментарий Вы должны сделать их окончательными в дочернем классе вы не можете, если вы хотите, чтобы сделать их final вам нужно объявить parkingFare как окончательное себя в Vehicle Class

+0

Если вы хотите, чтобы они были окончательными, сделайте их окончательными в своем абстрактном классе. –

0

Я думаю, что если вы хотите make cars стоит 2 $, тогда вы должны перенести статическую конечную переменную в этот класс.

public abstract class Vehicle { 

String plateNo; 
LocalTime startTime; 
public abstract int getFare(); 
public abstract String getPlateNo(); 
public abstract LocalTime getParkedTime(); 

} 


public class Car extends Vehicle { 

    static final int parkingFare = 2; 

    ... 
    @Override 
    public final int getFare() { 
    return parkingFare; 
    } 
} 
Смежные вопросы