2013-04-02 2 views
4

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

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

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

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

ответ

8

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

public ClassName() { 
    super(); 
} 

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

2

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

Formal specification:

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

2

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

0

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

public B() { 
    super(); 
} 

При вызове new B(), это неявный конструктор будет вызываться ,

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

1

При возникновении сомнений используйте 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-единственное ограничение или если он также присутствует на уровне байт-кода по адресу: Is it valid to have a JVM bytecode class without any constructor?

Смежные вопросы