#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. Я думаю, то, что я хочу, не очень подходит для ООП. Я должен указать имя транспортного средства при создании нового объекта с помощью конструктора. Но в любом случае я не могу получить доступ к имени транспортного средства, потому что оно было закрытым. Вот как используются частные модификаторы.