Мне действительно нужно определить конструктор по умолчанию в Java? - PullRequest
31 голосов
/ 04 сентября 2010

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

Зачем мне определять конструктор по умолчанию, если я определил параметризованный конструктор? Разве конструктор по умолчанию не предопределен?

Ответы [ 5 ]

56 голосов
/ 04 сентября 2010

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

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

13 голосов
/ 11 апреля 2014

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

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

Например, давайте создадим класс Student с одним параметризованным конструктором и попытаемся создать его экземпляр с помощью no-arg.конструктор.

public class Student {

    private String name;
    private int rollNo;

    public Student(String name, int rollNo) {
        this.name = name;
        this.rollNo = rollNo;
    }

    public static void main(String[] args) {
        // The line below will cause a compile error.
        Student s = new Student();
        // Error will be "The constuctor Student() is undefined"
    }
}

Woha!Но когда мы все вместе удаляем конструктор public Student(String name, int rollNo), ошибка исчезает и код компилируется.

Причина этой кажущейся аномалии заключается в том, что Java предоставляет нам только значения по умолчанию (no-arg) конструктор, когда мы не определяем никакого конструктора для этого класса самостоятельно.

Например, следующий класс поставляется с конструктором по умолчанию:

public class Student {
    private String name;
    private int rollNo;
}

становится:

public class Student {

    private String name;
    private int rollNo;

    //Default constructor added by Java.
    public Student() {
        super();
    }
}

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

Также в случае наследования, подкласс без конструкторов;поставляется один конструктор по умолчанию.Этот конструктор по умолчанию, предоставляемый Java, как указано выше, вызывает конструктор суперкласса без аргументов.Если он не может его найти, он выдаст ошибку.

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

Ref: OracleУчебник по Java

10 голосов
/ 04 сентября 2010

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

2 голосов
/ 04 сентября 2010

Это точно ожидаемое поведение.

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

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

1 голос
/ 23 июня 2015

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

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

Но, если вы определилиПараметризованный конструктор в вашем классе, это означает, что вы ограничиваете объекты такими параметрами

Пример: каждый сотрудник должен иметь идентификатор.

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

...