Почему подклассы наследуют частные поля?

#java #oop #inheritance #constructor #access-specifier

Вопрос:

Я создаю новый класс, который является транспортным средством. Я ожидаю, что единственные защищенные переменные наследуются подклассами. Но когда я пытаюсь создать конструктор с помощью IDE, он также использует частные переменные суперклассов? -Что является частной строкой vehicleName — я не совсем понимаю эту ситуацию. Разве я не должен использовать автоконструктор?

 public class Vehicle {  protected int capacityOfPassengers;  protected String mapOfRoute;  private String vehicleName;   public Vehicle(int capacityOfPassengers, String mapOfRoute,   String vehicleName) {   this.capacityOfPassengers = capacityOfPassengers;  this.mapOfRoute = mapOfRoute;  this.vehicleName = vehicleName;  } }  public class LandVehicle extends Vehicle {  private String brand;  private int priceModel;   public LandVehicle(int capacityOfPassengers, String mapOfRoute,   String vehicleName, String brand, int priceModel) {   super(capacityOfPassengers, mapOfRoute, vehicleName);  this.brand = brand;  this.priceModel = priceModel;  } }  

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

1. Ваша среда разработки знает, что LandVehicle это невозможно создать, пока Vehicle не будет вызван конструктор from. Теперь Vehicle у него нет конструктора без аргументов, и это означает, что LandVehicle он должен вызывать конструктор, отличный от конструктора по умолчанию Vehicle . Это может сработать только в том случае, если он создает конструктор LandVehicle со всеми параметрами конструктора суперкласса, который он использует для вызова super(...)

2. он также использует частные переменные суперклассов , где он использует поля суперкласса?

Ответ №1:

Как правило, класс имеет конструктор по умолчанию, не принимающий аргументов, ЕСЛИ вы не предоставили конструктор.

Когда вы подклассируете Vehicle со своим LandVehicle , ваш LandVehicle — это тип Vehicle . Это означает, что он наследует методы и поля от своего суперкласса, даже если они являются частными. Для класса LandVehicle эти члены просто не видны, но они все еще присутствуют — иначе он не мог бы функционировать должным образом. Ключевое слово private — это модификатор доступа, который изменяет видимость вызывающего объекта.

В результате, чтобы создать экземпляр a LandVehicle , вы также должны предоставить необходимые атрибуты его суперкласса Vehicle (поскольку по умолчанию конструктора без аргументов нет Vehicle ). В вашем примере a LandVehicle без имени (от Vehicle ) не имело бы смысла, так как a LandVehicle -это a Vehicle , для которого требуется имя.

Ответ №2:

Вы не можете получить доступ к имени транспортного средства из LandVehicle. Вы просто передаете некоторый строковый параметр суперконструктору, и суперконструктор задает имя транспортного средства. Например, вы не можете инициализировать это поле внутри класса LandVehicle как this.vehicleName = vehicleName .

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

1. Я должен указать имя транспортного средства, когда я пытаюсь создать новый объект, такой как LandVehicle landV = новый автомобиль(25,»Берген-Кельн», «Имя транспортного средства», «Человек», 2009); Но я не хочу указывать имя транспортного средства, когда я пытаюсь создать объект из LandVehicle

2. Я думаю, то, что я хочу, не очень подходит для ООП. Я должен указать имя транспортного средства при создании нового объекта с помощью конструктора. Но в любом случае я не могу получить доступ к имени транспортного средства, потому что оно было закрытым. Вот как используются частные модификаторы.