Что вызывается, когда вы инициализируете класс без конструктора?

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

Как пример, что здесь называется (new b())??

public class a {
    public static void main(String args[]) {
        b classB = new b();
    }
}

public class b {
    public void aMethod() {
    }
}

5 ответов

Решение

В Java нет такого понятия, как "класс без конструктора" - если в исходном коде нет явного конструктора, компилятор автоматически добавляет конструктор по умолчанию в файл класса:

public ClassName() {
  super();
}

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

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

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

Формальная спецификация:

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

Если есть сомнения, используйте javap,

Empty.java:

public class Empty {
    public static void main(String[] args) {}
}

Затем:

javac Empty.java
javap -v Empty.class

Выходная выдержка:

public Empty();
  descriptor: ()V
  flags: ACC_PUBLIC
  Code:
    stack=1, locals=1, args_size=1
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

Ха! Конструктор получен. Если мы попробуем то же самое для:

public class Empty {
    public Empty() {}
    public static void main(String[] args) {}
}

мы видим точно такой же байт-код.

Я спросил, является ли это ограничением только для Java или оно также присутствует на уровне байт-кода по адресу: допустимо ли иметь класс байт-кода JVM без какого-либо конструктора?

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

public B() {
   super();
}

Когда вы звоните new B()этот неявный конструктор вызывается.

Одно замечание: в Java мы используем соглашение о том, что имена классов начинаются с заглавной буквы. Так что я изменил это для вас.

Другие вопросы по тегам