11

我知道对于每个类初始化,每个类都会扩展对象类。这是否意味着JVM将为自定义类和Object该类创建一个对象?谁能非常清楚地解释这个类的初始化过程。

编辑 :

那么如果我将任何超类扩展到子类,这个超类是否占用子类的相同内存?

4

7 回答 7

11

这是否意味着JVM将为自定义类和Object类创建对象?

不,它只会为自定义类创建一个对象,但这个对象包含Object类成员(以及所有其他超类的成员)。

从概念上讲,您可以认为自定义类的一个实例的内存布局如下所示:

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

本质上,将分配一块内存,其大小与自定义类(包括 Object所有其他超类)的大小相同,并且通过调用每个超类的构造函数,将初始化超类的成员。

也可以看看

于 2013-07-23T07:35:48.987 回答
9

它不会创建 2 个对象,它只会创建一个自定义类对象。调用超类构造函数来初始化超类的字段,因为根据定义,必须初始化超类才能构造子类。但请记住,创建的对象是定义类和java.lang.Object.

阅读JLS 12.5以了解其工作原理。一个片段:

每当创建一个新的类实例时,都会为其分配内存空间,并为该类类型中声明的所有实例变量和该类类型的每个超类中声明的所有实例变量(包括所有可能隐藏的实例变量)分配空间

推荐阅读:

调用构造函数是否意味着创建对象?

于 2013-07-23T07:34:48.087 回答
5

考虑一下——

public class SomeClass {

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

       SomeClass someClass = new SomeClass();

    }

}

让我们编译这个类-

javac SomeClass.java

现在,让我们拆解——

javap -c 某类

我们得到-

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        
}

如您所见,只有一个的字节码意味着在堆中只创建了一个对象。

于 2013-07-23T07:43:19.447 回答
1

只会创建一个对象,CustomClass而不是Object类。

假设你有一堂课CustomClass。调用new CustomClass()将创建 的实例CustomClass。该过程如下。

  1. CustomClass被调用的默认无参数构造函数。
  2. 有一个对super构造函数的默认调用,在这种情况下,Object 类无参数构造函数。
  3. 超类构造函数运行后,控制权返回到CustomClass.
  4. CustomClass超级无参数构造函数完成后运行的初始化块。
  5. 在初始化块之后,构造函数CustomClass完成并CustomClass创建实例。
于 2013-07-23T07:36:42.613 回答
0

这就是继承的工作原理:您只创建一个从父对象继承属性的对象。因此,您创建了一个对象,它具有从Object类和自定义类中获取的相同属性。

例如,您同时拥有PersonStudent类,它们都从Object. 学生类也扩展了Person一个。Person有它的属性,如名字,姓氏..Student该类的 Appart 有它自己的属性,如大学代码,平均分数..

创建时会创建一个具有's 和' 属性Student的单个。StudentObjectPerson

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

您可以查看英文 Wikipedia 的Inheritance(面向对象编程)文章,了解更多关于继承的信息,而不仅仅是 Java 语言。

于 2013-07-23T07:37:07.710 回答
0

当您使用 new 运算符时,它将为该类创建对象。对于父类属性,它将初始化创建对象空间内的变量。

于 2013-07-23T07:37:18.043 回答
0

问题是当一个类被初始化时会发生什么,而不是当这个类的实例是用 new 创建时发生的。

例如:

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

Foo.bar()此类在被调用时被初始化(但未实例化) 。

而且我认为如果发生这种情况,Class<Foo>则会创建一个对象,与您通过的对象相同Foo.class

于 2013-07-23T12:46:57.250 回答