Подтвердить что ты не робот

Мне действительно нужно определить конструктор по умолчанию в java?

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

Проблема, с которой столкнулся Аюш, заключалась в попытке создать экземпляр класса 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 предоставляет нам конструктор по умолчанию (без аргументов), когда мы не определяем конструктор для этого класса самостоятельно.

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

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, как указано выше, вызывает конструктор суперкласса без аргументов. Если он не может его найти, он выдаст ошибку.

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

Ссылка: Oracle Java Tutorial

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

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

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

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

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

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

Ответ 6

Есть также один любопытный случай, когда вы должны определить конструктор без аргументов. Как писал другой, если вы не укажете конструктор по умолчанию - Java сделает это за вас. Приятно понимать, как выглядит конструктор по умолчанию, сгенерированный Java. На самом деле он вызывает конструктор суперкласса, и это нормально. Давай теперь представим один случай. Вы создаете класс Транспортного средства:

public class Vehicle {
private String name;
private String engine;

public Vehicle(String name, String engine) {
    this.name = name;
    this.engine = engine;
}

public String makeNoise(){
    return "Noiseee";
} 
}

Как мы видим, у класса Vehicle есть только один определенный конструктор с двумя аргументами. Теперь давайте создадим класс Car, который наследуется от класса Vehicle:

public class Car extends Vehicle {

@Override
public String makeNoise() {
    return "Wrrrrrrr....";
}  }

Возможно, это выглядит странно, но единственной причиной, по которой он не будет компилироваться, является тот факт, что Java не может создать конструктор по умолчанию для класса Car, который вызывает класс super Vehicle. Класс транспортного средства не имеет конструктора аргументов и не может быть сгенерирован автоматически, пока конструктор 2 arg уже существует.

Я знаю, что это очень редкий случай, но мне было интересно это узнать.