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

Java 初始化类和实例化对象之间的区别?,java,Java,我试图通过搜索引擎来搜索这个问题,但是可以找到一个主题来解释初始化类和实例化对象之间的区别 有人能解释一下它们之间的区别吗?当Java类“加载”到JVM中时,类表示必须以几种方式初始化 该类的“常量池”被扩展为运行时结构,其中的一些值被初始化 类的超类被定位(通过常量池)并提取其属性 为类的方法构造一个方法表。个别方法标记为“尚未验证” 在类表示上执行多个验证操作 静态字段已初始化 在第一次引用时,字符串文本被“插入”,插入的字符串指针被放置在常量池中 首先,对参考方法进行“验证” 等 有一

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

有人能解释一下它们之间的区别吗?

当Java类“加载”到JVM中时,类表示必须以几种方式初始化

  • 该类的“常量池”被扩展为运行时结构,其中的一些值被初始化
  • 类的超类被定位(通过常量池)并提取其属性
  • 为类的方法构造一个方法表。个别方法标记为“尚未验证”
  • 在类表示上执行多个验证操作
  • 静态字段已初始化
  • 在第一次引用时,字符串文本被“插入”,插入的字符串指针被放置在常量池中
  • 首先,对参考方法进行“验证”
有一组特定的术语用来指代类初始化,尽管我不记得具体细节。某些事情只能在类初始化到特定点之后发生,等等


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

使用静态初始化块初始化类。(静态{})。它不是一个方法,它是一个初始值设定项。它在第一次引用类本身时执行


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

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

从后面到前面工作

实例化

这是为对象分配内存的时间。这就是
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如何处理传递变量的本质例1

Rectangle rectOne=新矩形(originOne,100200);--例2

1)声明:粗体代码集是将变量名与对象类型关联的所有变量声明

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

3)初始化:新操作符后面是对构造函数的调用,构造函数初始化新对象


引用:。

没有初始化类这样的事情。你的意思是初始化一个变量吗?@Femaref-(和upvorters)肯定有一些东西对应于初始化一个类,尽管我不记得这是否是“合法”术语。JLS 8.3.1.1“一个静态字段,有时称为类变量,是在初始化类时体现的(§12.4)。“你不同意哪个术语?”??(我认为你们应该向OP道歉……并取消对他的问题的否决票,因为这显然不是“常识”。)问题是,你使用了一个完全合法的术语,但一些白痴认为它是错误的术语,并跳到了你身上。欢迎这么做!你能举一个例子说明初始化和实例化不会同时发生吗?@Leo我更新了帖子…如果有帮助,请告诉我!这不是正确的答案。类初始化确实存在。看在Class.forName(String)方法中。调用Class.forName(“X”)会导致名为X的类被初始化。@lachy,嗨,也许arnold_palmer不知道他问了什么。他问了关于类初始化的问题,但可能他只是想初始化一个变量。在这种情况下,您的答案是完美的,非常详细。[这就是为什么我没有降级你的答案]。你很好地解释了初始化变量、实例化对象和声明变量之间的区别。但是类初始化是不同的。它将类加载到内存中(方法、初始化静态字段)并实例化一个Class类型的对象。是的,arnold_palmer的意思可能是“初始化变量”@Alex One应该回答被问到的问题。OP自己的评论表明你在这方面完全错了。这是正确的答案。类初始化确实存在。请参阅此处的Class.forName方法,这是类初始化过程中发生的一小部分。