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

При инициализации любого класса в java он создает два объекта?

Я знаю, что для каждой инициализации класса каждый класс расширяет класс объекта. Означает ли это, что JVM создаст объект для пользовательского класса и класса Object? Может ли кто-нибудь объяснить этот процесс инициализации класса очень четко.

Изменить:

Итак, если я добавлю суперкласс к подклассу, делает ли этот суперкласс одной и той же памятью подкласса?

4b9b3361

Ответ 1

Означает ли это, что JVM создаст объект для пользовательского класса и класса Object?

Нет, он создаст объект только для пользовательского класса, но этот объект содержит членов класса Object (и членов всех других суперклассов).

Концептуально вы можете думать о макете памяти одного экземпляра пользовательского класса, выглядящего следующим образом:

+============+
|Members of  |
|Object      |
+------------+
|Members of  |
|other super |
|classes     |
|  ...       |
+------------+
|Members of  |
|Custom class|
+============+

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

См. также

Ответ 2

Он не создает 2 объекта, он создает только один объект пользовательского класса. Конструктор суперкласса вызывается для инициализации полей суперкласса, поскольку по определению суперкласс должен быть инициализирован для построения подкласса. Но помните, что созданный объект является экземпляром как пользовательского класса, так и java.lang.Object.

Прочитайте JLS 12.5, чтобы узнать, как это работает. Отрывок:

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

Рекомендуемое чтение:

Вызывает ли вызов конструктора средство создания объекта?

Ответ 3

Рассмотрим это -

public class SomeClass {

    public static void main(String... args){

       SomeClass someClass = new SomeClass();

    }

}

Скомпилируйте этот класс -

javac SomeClass.java

Теперь, разоберите -

javap -c SomeClass

Получаем -

public class SomeClass {
  public SomeClass();
    Code:
       0: aload_0       
       1: invokespecial #1        // Method java/lang/Object."<init>":()V
       4: return        

  public static void main(java.lang.String...);
    Code:
       0: new           #2       // class SomeClass
       3: dup           
       4: invokespecial #3       // Method "<init>":()V
       7: astore_1      
       8: return        
}

Как вы видите, только один новый байт-код означает, что в куче был создан только один объект.

Ответ 4

Будет создан только один объект CustomClass, а не для класса Object.

Предположим, что у вас есть класс CustomClass. Вызов new CustomClass() создаст экземпляр CustomClass. Процесс идет следующим образом.

  • Вызывается конструктор аргументов CustomClass по умолчанию.
  • Существует вызов по умолчанию конструктора super по умолчанию, в этом случае конструктор no-argument класса Object.
  • После запуска конструктора суперкласса управление возвращается к CustomClass.
  • Блоки инициализации CustomClass запускаются после завершения конструктора super no-arg.
  • После блоков инициализации конструктор CustomClass завершается и создается экземпляр CustomClass.

Ответ 5

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

Например, у вас есть как теги Person, так и Student, которые простираются от Object. Студенческий класс также расширяет Person. Person имеет свои свойства, как имя, фамилии. Appart из этого класса Student имеет свои собственные свойства, такие как код колледжа, средние оценки..

При создании Student создается один Student с свойствами Object и Person.

Object
    --Person (name, surname1, surname2)
        --Student (college number, average mark)

Вы можете взглянуть на английскую Wikipedia статью "Наследование" (объектно-ориентированное программирование), чтобы узнать больше о наследовании не только в Язык Java.

Ответ 6

Когда вы используете новый оператор, он создаст объект для этого класса. Для атрибутов родительского класса он инициализирует переменные внутри пространства созданного объекта.

Ответ 7

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

Например:

class Foo {
    static void bar() { .... }
    ... // other members
}

Этот класс инициализируется (но не создается), когда вызывается Foo.bar().

И я думаю, что если это произойдет, тогда будет создан объект Class<Foo>, тот, который вы пройдете через Foo.class.