繁体   English   中英

初始化类和实例化对象的区别?

[英]Difference between initializing a class and instantiating an object?

我尝试通过搜索引擎搜索这个问题,但可以找到一个主题来解释初始化类和实例化对象之间的区别。

有人可以解释它们的不同之处吗?

与此主题相关的术语有三部分:声明、初始化和实例化。

从后到前工作。

实例化

这是为对象分配内存的时候。 这就是new关键字所做的。 new关键字返回对所创建对象的引用。

初始化

这是将值放入分配的内存中的时间。 这就是类的构造函数在使用new关键字时所做的。

变量还必须通过将内存中某个对象的引用传递给它来初始化。

宣言

这是当您向程序声明将存在某种类型的对象以及该对象的名称时。

同一行的初始化和实例化示例

SomeClass s; // Declaration
s = new SomeClass(); // Instantiates and initializes the memory and initializes the variable 's'

将不同行上的变量初始化到内存的示例

void someFunction(SomeClass other) {
    SomeClass s; // Declaration
    s = other; // Initializes the variable 's' but memory for variable other was set somewhere else
}

我还强烈推荐阅读这篇关于 Java 如何处理传递变量的性质的文章

Point originOne = new Point(23, 94); -- 示例 1

Rectangle rectOne = new Rectangle(originOne, 100, 200); -- 例 2

1)声明:加粗的代码都是将变量名与对象类型相关联的变量声明。

2)实例化: new关键字是创建对象的Java操作符。

3) 初始化: new 运算符之后是对构造函数的调用,该构造函数初始化新对象。

参考: https : //docs.oracle.com/javase/tutorial/java/javaOO/objectcreation.html# :~: text=Instantiation%3A%20The%20new%20keyword%20is,which%20initializes%20the%20new%20object .

当 Java 类被“加载”到 JVM 中时,类表示必须以多种方式进行初始化。

  • 类的“常量池”扩展为运行时结构,并初始化其中的一些值。
  • 定位类的超类(通过常量池)并提取它的属性。
  • 为类的方法构造方法表。 个别方法被标记为“尚未验证”。
  • 在类表示上执行几个验证操作。
  • 静态字段被初始化。
  • 在第一次引用时,字符串字面量被“interned”并且被interned 的字符串指针被放置在常量池中
  • 第一个参考方法是“验证”的。
  • 等。

有一组特定的术语用于指代类初始化,但我不记得具体细节。 某些事情只能在类初始化到特定点等之后发生。

实例化一个对象只能在类被加载和初始化之后发生(尽管不需要验证所有的方法)。 对象的大小是从类中获取的,并且找到并归零了那么多堆。 对象头中填充了指向类的指针和用于管理类的其他字段。 然后调用该类的适当构造函数方法(并且它将调用任何 super 的构造函数)。

类的初始化是使用静态初始化块完成的。 (静止的 { })。 这不是一个方法,它是一个初始化程序。 它在第一次引用类本身时执行。

例如,通过调用其构造函数使用 new 关键字来实例化对象。 那时静态初始化块不会被执行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM