我知道对于每个类初始化,每个类都会扩展对象类。这是否意味着JVM将为自定义类和Object
该类创建一个对象?谁能非常清楚地解释这个类的初始化过程。
编辑 :
那么如果我将任何超类扩展到子类,这个超类是否占用子类的相同内存?
我知道对于每个类初始化,每个类都会扩展对象类。这是否意味着JVM将为自定义类和Object
该类创建一个对象?谁能非常清楚地解释这个类的初始化过程。
编辑 :
那么如果我将任何超类扩展到子类,这个超类是否占用子类的相同内存?
这是否意味着JVM将为自定义类和Object类创建对象?
不,它只会为自定义类创建一个对象,但这个对象包含Object
类成员(以及所有其他超类的成员)。
从概念上讲,您可以认为自定义类的一个实例的内存布局如下所示:
+============+
|Members of |
|Object |
+------------+
|Members of |
|other super |
|classes |
| ... |
+------------+
|Members of |
|Custom class|
+============+
本质上,将分配一块内存,其大小与自定义类(包括 Object
所有其他超类)的大小相同,并且通过调用每个超类的构造函数,将初始化超类的成员。
也可以看看
它不会创建 2 个对象,它只会创建一个自定义类对象。调用超类构造函数来初始化超类的字段,因为根据定义,必须初始化超类才能构造子类。但请记住,创建的对象是自定义类和java.lang.Object
.
阅读JLS 12.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
}
如您所见,只有一个新的字节码意味着在堆中只创建了一个对象。
只会创建一个对象,CustomClass
而不是Object
类。
假设你有一堂课CustomClass
。调用new CustomClass()
将创建 的实例CustomClass
。该过程如下。
CustomClass
被调用的默认无参数构造函数。super
构造函数的默认调用,在这种情况下,Object 类无参数构造函数。CustomClass
.CustomClass
超级无参数构造函数完成后运行的初始化块。CustomClass
完成并CustomClass
创建实例。这就是继承的工作原理:您只创建一个从父对象继承属性的对象。因此,您创建了一个对象,它具有从Object
类和自定义类中获取的相同属性。
例如,您同时拥有Person
和Student
类,它们都从Object
. 学生类也扩展了Person
一个。Person
有它的属性,如名字,姓氏..Student
该类的 Appart 有它自己的属性,如大学代码,平均分数..
创建时会创建一个具有's 和' 属性Student
的单个。Student
Object
Person
Object
--Person (name, surname1, surname2)
--Student (college number, average mark)
您可以查看英文 Wikipedia 的Inheritance(面向对象编程)文章,了解更多关于继承的信息,而不仅仅是 Java 语言。
当您使用 new 运算符时,它将为该类创建对象。对于父类属性,它将初始化创建对象空间内的变量。
问题是当一个类被初始化时会发生什么,而不是当这个类的实例是用 new 创建时发生的。
例如:
class Foo {
static void bar() { .... }
... // other members
}
Foo.bar()
此类在被调用时被初始化(但未实例化) 。
而且我认为如果发生这种情况,Class<Foo>
则会创建一个对象,与您通过的对象相同Foo.class
。