【问题标题】:Difference between initializing a class and instantiating an object?初始化类和实例化对象的区别?
【发布时间】:2013-02-11 00:23:51
【问题描述】:

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

有人能解释一下它们有何不同吗?

【问题讨论】:

  • 没有初始化类这样的事情。你的意思是初始化一个变量吗?
  • @Femaref - (和支持者)肯定有一些东西对应于初始化一个类,但我不记得这是否是“合法”术语。
  • JLS 8.3.1.1 “静态字段,有时称为类变量,在类初始化时体现(第 12.4 节)。”你不同意哪个术语??
  • (我认为你们应该向 OP 道歉……并撤销对他的问题的反对票,因为这显然不是“常识”。)
  • 问题是,你使用了一个完全合法的术语,但一些白痴认为它是错误的术语并跳到你身上。欢迎来到 SO!

标签: java


【解决方案1】:

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

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

有一组特定的术语用来指代类初始化,但我不记得具体的内容了。某些事情只有在类被初始化到特定点等之后才会发生。

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

【讨论】:

【解决方案2】:

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

实例化一个对象是通过调用它的构造函数来完成的,例如使用 new 关键字。届时将不会执行静态初始化块。

【讨论】:

  • 这是类初始化过程中发生的一小部分。
【解决方案3】:

与该主题相关的三个术语:声明、初始化和实例化。

从后到前。

实例化

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

初始化

这是将值放入分配的内存中的时间。这就是类的Constructor 在使用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
}

我还强烈建议阅读this article,了解 Java 如何处理传递变量的本质。

【讨论】:

  • 您能举一个例子,说明初始化和实例化同时发生吗?
  • @Leo 我更新了帖子...如果有帮助请告诉我!
  • 这不是正确的答案。类初始化确实存在。查看方法 Class.forName(String)。调用 Class.forName("X") 会导致初始化名为 X 的类。 docs.oracle.com/javase/7/docs/api/java/lang/…
  • @lachy,嗨,也许 arnold_palmer 不知道他问了什么。他询问了类初始化,但也许他只是想初始化一个变量。在这种情况下,您的答案是完美且非常详细的。 [这就是我没有降级您的答案的原因]。您很好地解释了初始化变量、实例化对象和声明变量之间的区别。然而类初始化是不同的。它将类加载到内存中(方法、启动静态字段)并实例化一个 Class 类型的对象。是的,可能 arnold_palmer 的意思是“初始化变量”
  • @Alex One 应该回答所提出的问题。 OP 自己的 cmets 表明您对此完全错了。
【解决方案4】:

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

矩形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.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-20
    • 1970-01-01
    • 2013-01-13
    • 2018-08-14
    • 2023-03-23
    • 2016-06-13
    • 2012-11-05
    • 1970-01-01
    相关资源
    最近更新 更多