2015-11-06 2 views
1

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

пример:

Parent(){ 
     super(); 
    } 

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

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

+2

Большая часть реализации 'java.lang.Object' является родной. – Mena

+0

Вы смотрите на исходный код или файл класса? Компилятор java вставляет пустой конструктор в файл класса Object, как и в вашем классе «Parent». – SamTebbs33

+0

Спасибо @Mena за быстрый ответ :) Можем ли мы получить дополнительную информацию/ссылки относительно этого, что происходит в собственной реализации. – Sravan

ответ

1

Класс Object выполняет некоторые собственные операции в каждом экземпляре.

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

Именно поэтому каждый конструктор должен начать с вызова super() или this(). Таким образом, первый конструктор, выполненный в каждом экземпляре, будет иметь конструктор Object.

+0

Спасибо @jfcorugedo за быстрый ответ :) Можем ли мы получить дополнительную информацию/ссылки относительно этого, что происходит в собственной реализации. – Sravan

+1

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

1

Object класс в основном реализован на родном пути, так что конструктор не вызывает его родительский. Кроме того, он не имеет родительского класса, потому что он установлен в null в файле .class. Вы можете узнать больше о java .class file format о том, как хранится Java-класс.

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

1

Создание объектов до JVM. Каждый конструктор Java появляется как специальный метод с именем <init>, который отвечает за инициализацию экземпляра. Этот метод <init> предоставляется компилятором и потому, что <init> не является допустимым идентификатором в Java, его нельзя использовать непосредственно на этом языке.

Как работает JVM этот метод <init>?

Виртуальная машина Java будет вызывать метод <init> с помощью invokespecial инструкции и может быть использована только в случаях неинициализированного класса.

Что произойдет в конструкторе класса Object?

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

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

Для получения дополнительной информации посмотрите на спецификации JVM и спецификации языка Java:

1

Хотя все другие ответы о собственном коде верны, формально нет ничего особенного или таинственного о явном отсутствии конструктора java.lang.Object.

Любой класс, который не имеет явно определенного конструктора, автоматически получит default constructor. Это правильный код, например:

class Foo {} 
class Bar extends Foo { 
    public Bar(String baz) { 
     super(); 
    } 
} 

Где Object отличается тем, что этот конструктор по умолчанию содержит:

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