Я относительно новичок/неопытен в компьютерных науках. Мне было интересно, какой смысл иметь конструктор по умолчанию, когда вы можете просто объявить любые поля, которые вы хотите в своем классе, и инициализировать их любым значением по умолчанию, которое вы хотите, чтобы они имели. Затем вы можете написать перегруженные конструкторы.
Чтобы понять, о чем я говорю, вот пример.
public class Restaurant {
String name = "No name";
int Rating = -1;
}
Против
public class Restaurant {
String name;
int rating;
public Restaurant() {
name = "No name";
rating = -1;
}
3 ответа
Конструкторы в основном используются для создания объектов. Что касается инициализации переменных, когда вы инициализируете переменную (переменную экземпляра), вы изменяете переменную, которая является членом только что созданного вами объекта. Вы лучше поймете это на примере, приведенном ниже (ваш, например, сам):
public class Restaurant {
String name;
int rating;
public Restaurant() {
name = "No name";
rating = -1;
}
}
Теперь предположим, что вы создаете объект,
Restaurant obj = new Restaurant();
Здесь obj.name = "No name"
и obj.rating=-1
. Обратите внимание, что name
и obj.name
различны. Теперь, когда вы используете первый код, данный вами,
public class Restaurant {
String name = "No name";
int Rating = -1;
}
Теперь, какой бы объект вы ни создали, переменная name
каждого объекта будет содержать только "No name"
.
Таким образом, когда вам приходится работать с объектами, вы должны инициализировать переменную экземпляра через конструкторы. Кстати, сам экземпляр означает объект...
ИМХО конструктор по умолчанию не является требованием ООП. Это скорее требование Java: каждый класс должен иметь хотя бы один конструктор. Это подчеркивается JLS : 8.8.9 Конструкторы по умолчанию:
Если класс не содержит объявлений конструктора, то неявно объявляется конструктор по умолчанию.
Если ваш класс содержит хотя бы одно объявление конструктора (как во втором примере), конструктор по умолчанию не создается.
Обратите внимание, что когда вы пишете
public class Restaurant {
String name = "No name";
int Rating = -1;
}
Инициализаторы полей name = "No name";
и Rating = -1;
выполняются как часть конструктора (JLS 12.5 Создание новых экземпляров класса):
Непосредственно перед тем, как в результате будет возвращена ссылка на вновь созданный объект, указанный конструктор обрабатывается для инициализации нового объекта с использованием следующей процедуры:
Назначьте аргументы конструктора вновь созданным переменным параметров для этого вызова конструктора.
Если этот конструктор начинается с явного вызова конструктора (§8.8.7.1) другого конструктора в том же классе (с использованием этого), то оцените аргументы и обработайте этот вызов конструктора рекурсивно, используя те же пять шагов. Если вызов конструктора завершается внезапно, эта процедура завершается внезапно по той же причине; в противном случае перейдите к шагу 5.
Этот конструктор не начинается с явного вызова конструктора другого конструктора в том же классе (используя this). Если этот конструктор предназначен для класса, отличного от Object, то этот конструктор начнется с явного или неявного вызова конструктора суперкласса (с использованием super). Оцените аргументы и обработайте этот вызов конструктора суперкласса рекурсивно, используя те же пять шагов. Если вызов конструктора завершается внезапно, эта процедура завершается внезапно по той же причине. В противном случае перейдите к шагу 4.
Выполнить инициализаторы экземпляра и инициализаторы переменных экземпляра для этого класса, присвоив значения инициализаторов переменных экземпляра соответствующим переменным экземпляра в порядке слева направо, в котором они отображаются в текстовом виде в исходный код класса. Если выполнение любого из этих инициализаторов приводит к возникновению исключения, дальнейшие инициализаторы не обрабатываются, и эта процедура завершается внезапно с тем же исключением. В противном случае перейдите к шагу 5.
Выполнить остальную часть тела этого конструктора. Если это выполнение завершается внезапно, то эта процедура завершается внезапно по той же причине. В противном случае эта процедура завершается нормально.
Этот код инициализации добавляется к каждому конструктору — будь то конструктор по умолчанию или любой конструктор, который вы пишете.
Когда ваша инициализация переменной основана на некоторой логике, вам нужно написать некоторый код, и для этой цели требуется конструктор по умолчанию. Java предоставляет другой подход, называемый блоками инициализации, и вы сможете сделать то же самое, но ключевым моментом является согласованность. Конструкторы предназначены для построения объекта, позволяя ему обрабатывать конструкцию с точки зрения читаемости кода и удобства обслуживания.
Похожие вопросы
Новые вопросы
java
Java - это язык программирования высокого уровня. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег редко используется отдельно и чаще всего используется вместе с [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] и [maven].