Можно ли назначить экземпляр подкласса переменной суперкласса? - PullRequest
1 голос
/ 12 апреля 2020

Меня смущают определения и логика суперкласса и подкласса.

Ответы [ 2 ]

3 голосов
/ 12 апреля 2020

Одним словом - да. Поскольку экземпляр подкласса "isA" является суперклассом, вы можете назначить его такой переменной.

Рассмотрим следующий пример - String - это Object, поэтому это назначение будет допустимым:

Object obj = "abcd"; // this is a string literal
1 голос
/ 12 апреля 2020

Чтобы быстро ответить на ваш вопрос: да, подкласс можно назначать практически везде, где идет суперкласс.

Причины этого связаны с наследованием и объектно-ориентированным программированием. Позвольте привести пример. Давайте подумаем о поездах и железнодорожных вагонах, которые являются частью поезда.

Суперкласс - это RailwayCar . Каждый железнодорожный вагон имеет вес.

public class RailwayCar {
   private int weight;

   public RailwayCar() {
   }

   public RailwayCar(int weight) {
      setWeight(weight);
   }

   public int getWeight() {
      return weight;
   }

   public void setWeight(int weight) {
      this.weight = weight;
   }

   public void arriveAtStation(Station station) {}

   public void leaveStation(Station station) {}
}

Это просто базовая c машина. Однако есть специальные автомобили.

// Engines have power in addition to weight
public class Engine extends RailwayCar {
   private int power;

   public Engine(int weight, int power) {
      super(weight);
      setPower(power);
   }

   public void setPower(int power) {
      this.power = power;
   }

   public int getPower() {
      return power;
   }
}

Есть и другие типы автомобилей. Например, например, может быть пассажирский вагон, где вес может меняться на каждой станции, когда пассажиры входят и выходят. Есть определенные c типы автомобилей для определенных c типов автомобилей go. LogCar будет содержать длинные журналы.

Все эти подклассы RailwayCar могут переопределять методы станции (receiveAtStation () и leftStation ()) для выполнения определенных c действий путем переопределения этих методов.

Все эти автомобили могут быть помещены в один список или массив. Например, RailwayCar [] вагоны или List cars = new ArrayList <> ();

...