Новый программист, нужна помощь. Присвоение поля, унаследованного от суперкласса, переменной внутри метода подкласса

#java #oop #inheritance

#java #ооп #наследование

Вопрос:

Я хочу присвоить basePrice (который является унаследованным полем от класса Hamburger) переменной double NewPrice внутри перезаписанного метода AddItems() . Это не было проблемой в суперклассе, поскольку поле существовало. Я просто набрал «double NewPrice = this.basePrice;». Но это не работает в подклассе. Я новичок в программировании, любая помощь приветствуется.

 public class HealthyBurger extends Hamburger{

    public HealthyBurger(String meat, double basePrice) {
        super("Healthy Burger", "brown rye", meat, basePrice);
    }

    public void addItems() {
        double newPrice = ???HOW TO ASSISGN basePrice HERE???;
    }
}
  

Комментарии:

1. Это зависит basePrice от того, является ли оно закрытым или для него есть метод установки.

Ответ №1:

Для доступа this.basePrice из производного класса basePrice атрибут должен быть protected в базовом классе.

Затем вы можете сделать:

 this.basePrice = ...; // whatever you want here
  

Комментарии:

1. Это действительно решило мою проблему, в курсе, который я просматриваю, до сих пор не упоминается защищенное ключевое слово, думал, я видел его здесь и там. Большое спасибо.

Ответ №2:

Скорее всего, существует метод getBasePrice() , который вы должны вызвать:

 this.getBasePrice();
// instead of
this.basePrice;
  

Если его нет, перейдите к исходному коду Hamburger ( Hamburger.java ) и добавьте этот метод.

Объяснение

Если вы получаете сообщение об ошибке при записи this.basePrice в свой HealthyBurger класс, это означает, что поле в Hamburger классе либо помечено как private или, либо [1] находится в другом пакете, а [2] было объявлено без модификатора доступа (что является java-ese для концепции, называемой package private, что означает, к нему могут прикасаться только вещи внутри пакета, а вас там нет).

Одно из исправлений состоит в том, чтобы перейти к исходному коду Hamburger.java и создать его protected вместо этого (что означает: любой исходный код в этом файле, все классы в одном пакете и любые подклассы — и этот последний откроет вам двери), но более идиоматично java делать поля закрытыми,поэтому оставьте все как есть и создайте этот метод, который называется «получателем» и, вероятно, должен быть public .

ПРИМЕЧАНИЕ: Если вам кажется утомительным писать их, всегда есть Lombok .

Ответ №3:

Вы можете просто создать getBasePrice() метод, определенный в родительском классе, или просто объявить поле:

protected double basePrice

и вы можете просто назначить double newPrice = this.basePrice;

Комментарии:

1. тогда с чем getBasePrice() ?

2. @Pierre Разумнее объявить поле с модификатором protected, но если он по какой-то причине не может этого сделать, он может создать метод getBasePrice() для доступа к значению этого экземпляра