Java по умолчанию конструктор - PullRequest
145 голосов
/ 20 декабря 2010

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

public Module() {
   this.name = "";
   this.credits = 0;
   this.hours = 0;
}

public Module(String name, int credits, int hours) {
   this.name = name;
   this.credits = credits;
   this.hours = hours;
}

Ответы [ 11 ]

235 голосов
/ 20 декабря 2010

Ни один из них.Если вы его определили, это не значение по умолчанию.

Конструктор по умолчанию - это автоматически созданный конструктор без аргументов, если вы не определите другой конструктор.Любые неинициализированные поля будут установлены в значения по умолчанию.Для вашего примера это будет выглядеть так, если предположить, что типы String, int и int, а сам класс общедоступен:

public Module()
{
  super();
  this.name = null;
  this.credits = 0;
  this.hours = 0;
}

Это точно так же, как

public Module()
{}

И точно так же, как отсутствие конструкторов вообще.Однако, если вы определите хотя бы один конструктор, конструктор по умолчанию не будет создан.

Ссылка: Спецификация языка Java

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

Уточнение

Технически это не конструктор (по умолчанию или иным образом), который инициализирует поля по умолчанию.Тем не менее, я оставляю это как ответ, потому что

  • вопрос неверен по умолчанию, и
  • конструктор имеет точно такой же эффект независимо от того, включены они или нет.
32 голосов
/ 20 декабря 2010

Конструктор по умолчанию создается, если вы не определяете конструкторов в своем классе. Это просто конструктор без аргументов, который ничего не делает. Изменить: За исключением вызова супер ()

public Module(){
}
19 голосов
/ 20 декабря 2010

Конструктор по умолчанию автоматически генерируется компилятором, если вы явно не определяете хотя бы один конструктор в своем классе.Вы определили два, поэтому ваш класс не имеет конструктора по умолчанию.

Per Спецификация языка Java, третье издание :

8.8.9 Конструктор по умолчанию

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

17 голосов
/ 11 декабря 2013

Привет.Насколько мне известно, позвольте мне прояснить концепцию конструктора по умолчанию:

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

Я прочитал эту информацию из Java Tutorials .

7 голосов
/ 17 августа 2012

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

Единственное действие, выполняемое неявным конструктором по умолчанию, - это вызов конструктора суперкласса с использованиемсупер () вызов.Аргументы конструктора предоставляют вам способ предоставить параметры для инициализации объекта.

Ниже приведен пример класса куба, содержащего 2 конструктора.(один конструктор по умолчанию и один параметризованный конструктор).

public class Cube1 {
    int length;
    int breadth;
    int height;
    public int getVolume() {
        return (length * breadth * height);
    }

    Cube1() {
        length = 10;
        breadth = 10;
        height = 10;
    }

    Cube1(int l, int b, int h) {
        length = l;
        breadth = b;
        height = h;
    }

    public static void main(String[] args) {
        Cube1 cubeObj1, cubeObj2;
        cubeObj1 = new Cube1();
        cubeObj2 = new Cube1(10, 20, 30);
        System.out.println("Volume of Cube1 is : " + cubeObj1.getVolume());
        System.out.println("Volume of Cube1 is : " + cubeObj2.getVolume());
    }
}
6 голосов
/ 12 сентября 2013

Общая терминология заключается в том, что если вы не предоставляете никакого конструктора в своем объекте, автоматически не создается конструктор аргументов, который называется конструктором по умолчанию.

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

Согласно документам

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

Пример

public class Dog
{
}

будет автоматически изменен (добавив конструктор по умолчанию) следующим образом

public class Dog{
    public Dog() {

    }
} 

и когда вы создаете его объект

 Dog myDog = new Dog();

этот конструктор по умолчанию вызывается.

3 голосов
/ 29 апреля 2017

Конструктор по умолчанию относится к конструктору, который автоматически генерируется компилятором при отсутствии каких-либо конструкторов, определенных программистом.

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

* 1006 Е.Г. *

class Klass {
      // Default Constructor gets generated
} 

new Klass();  // Correct
-------------------------------------

class KlassParameterized {

    KlassParameterized ( String str ) {   //// Parameterized Constructor
        // do Something
    }
} 

new KlassParameterized(); //// Wrong  - you need to explicitly provide no-arg constructor. The compiler now never declares default one.


--------------------------------

class KlassCorrected {

    KlassCorrected (){    // No-arg Constructor
       /// Safe to Invoke
    }
    KlassCorrected ( String str ) {   //// Parameterized Constructor
        // do Something
    }
} 

new KlassCorrected();    /// RIGHT  -- you can instantiate
2 голосов
/ 13 декабря 2013

Если класс не имеет конструктора, предоставленного программистом, то компилятор java добавит конструктор по умолчанию с параметрами out, которые будут вызывать конструктор суперкласса внутренне с вызовом super ().Это называется конструктором по умолчанию.

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

public Module()
{
   super();
}

Примечание : в боковом конструкторе по умолчанию он также добавит вызов super (),для вызова конструктора суперкласса.

Цель добавления конструктора по умолчанию:

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

Вот почему, если нет конструкторов, java-компилятор добавит конструктор по умолчанию и вызовет конструктор суперкласса.

1 голос
/ 21 июня 2016

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

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

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

0 голосов
/ 31 октября 2017

Я надеюсь, что вы получили свой ответ относительно того, какой конструктор по умолчанию. Но я даю нижеприведенные утверждения, чтобы исправить приведенные комментарии.

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

  • Конструктор по умолчанию предоставляет значения по умолчанию для объекта, такие как 0, и т. д. в зависимости от типа.

Для получения более подробной информации см. Ссылку ниже.

https://www.javatpoint.com/constructor

...