Я относительно новичок/неопытен в компьютерных науках. Мне было интересно, какой смысл иметь конструктор по умолчанию, когда вы можете просто объявить любые поля, которые вы хотите в своем классе, и инициализировать их любым значением по умолчанию, которое вы хотите, чтобы они имели. Затем вы можете написать перегруженные конструкторы.

Чтобы понять, о чем я говорю, вот пример.

public class Restaurant {
      String name = "No name";
      int Rating = -1;
}

Против

public class Restaurant {
     String name;
     int rating;
     public Restaurant() {
           name = "No name";
           rating = -1;
     }
           
1
Allen 19 Янв 2022 в 08:26
Одна из причин: некоторые фреймворки, такие как Hibernate, требуют явного конструктора по умолчанию.
 – 
Tim Biegeleisen
19 Янв 2022 в 08:28
Кроме того, если вам нужно более одного конструктора, один без параметров и, скажем, один с двумя. если вы просто напишите один с двумя, вы не получите один без параметров, поэтому вам нужно написать и его.
 – 
Ofek
19 Янв 2022 в 08:30
1
Как только вы создадите конструктор, который принимает параметры, у вас больше не будет конструктора по умолчанию, поэтому вам нужно будет явно определить конструктор без аргументов, если он требуется.
 – 
tgdavies
19 Янв 2022 в 08:30
Вся идея конструктора по умолчанию состоит в том, чтобы помочь вам уменьшить объем кода, который вы пишете. иногда вам даже не нужен конструктор, например основные классы.
 – 
Ofek
19 Янв 2022 в 08:31

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".

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

0
Utkarsh Sahu 19 Янв 2022 в 08:44

ИМХО конструктор по умолчанию не является требованием ООП. Это скорее требование Java: каждый класс должен иметь хотя бы один конструктор. Это подчеркивается JLS : 8.8.9 Конструкторы по умолчанию:

Если класс не содержит объявлений конструктора, то неявно объявляется конструктор по умолчанию.

Если ваш класс содержит хотя бы одно объявление конструктора (как во втором примере), конструктор по умолчанию не создается.


Обратите внимание, что когда вы пишете

public class Restaurant {
    String name = "No name";
    int Rating = -1;
}

Инициализаторы полей name = "No name"; и Rating = -1; выполняются как часть конструктора (JLS 12.5 Создание новых экземпляров класса):

Непосредственно перед тем, как в результате будет возвращена ссылка на вновь созданный объект, указанный конструктор обрабатывается для инициализации нового объекта с использованием следующей процедуры:

  1. Назначьте аргументы конструктора вновь созданным переменным параметров для этого вызова конструктора.

  2. Если этот конструктор начинается с явного вызова конструктора (§8.8.7.1) другого конструктора в том же классе (с использованием этого), то оцените аргументы и обработайте этот вызов конструктора рекурсивно, используя те же пять шагов. Если вызов конструктора завершается внезапно, эта процедура завершается внезапно по той же причине; в противном случае перейдите к шагу 5.

  3. Этот конструктор не начинается с явного вызова конструктора другого конструктора в том же классе (используя this). Если этот конструктор предназначен для класса, отличного от Object, то этот конструктор начнется с явного или неявного вызова конструктора суперкласса (с использованием super). Оцените аргументы и обработайте этот вызов конструктора суперкласса рекурсивно, используя те же пять шагов. Если вызов конструктора завершается внезапно, эта процедура завершается внезапно по той же причине. В противном случае перейдите к шагу 4.

  4. Выполнить инициализаторы экземпляра и инициализаторы переменных экземпляра для этого класса, присвоив значения инициализаторов переменных экземпляра соответствующим переменным экземпляра в порядке слева направо, в котором они отображаются в текстовом виде в исходный код класса. Если выполнение любого из этих инициализаторов приводит к возникновению исключения, дальнейшие инициализаторы не обрабатываются, и эта процедура завершается внезапно с тем же исключением. В противном случае перейдите к шагу 5.

  5. Выполнить остальную часть тела этого конструктора. Если это выполнение завершается внезапно, то эта процедура завершается внезапно по той же причине. В противном случае эта процедура завершается нормально.

Этот код инициализации добавляется к каждому конструктору — будь то конструктор по умолчанию или любой конструктор, который вы пишете.

0
Thomas Kläger 19 Янв 2022 в 09:43

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

0
Hitesh A. Bosamiya 19 Янв 2022 в 09:18