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