关于JVM创建对象的解读

JAVA 实例化的过程

           --RayC 2009-08-31

         以下情况发生一个新的 class 被显示的创建:

1.  一个 class 创建的语句创建了一个新的 class class 名字在语句中声明了。

2.  调用 Class new Instance 的方法创建了一个 class 的实例

以下情况发生一个 class 的实例被隐式创建:

1.       加载一个 class 或者 一个 interface 包含了一个 String literal ( literal 代表原生类型的源代码,比如 Null literal , String literal ) 可能导致创建一个表示那个 literal  String 的对象。当这个 String 对象已经被创建或者 String.intern 方法已经被一个代表一样的 literal String 对象所调用十,则上述情况可能不发生。

2.       字符串的连接操作,并且不是常量表达式的一部分,有时会创建一个新的代表字符传连接操作结果的 String 对象。 字符串的连接操作可能也因为一些原声类型的值而创建了一些临时的包装对象。

每一个这样的情况识别了一个专有的将用不同参数调用的构造函数作为 class 实例化的创建过程。

无论什么时候一个新的 class 被创建,内存空间将被分配给所有在 class 类型中声明的实例化的变量和所有父类型中实例化的变量,包括所有隐藏的变量。假如没有足够的空间可以分配给这个对象,将会报一个 OutOfMemoryError 的错误。而且,所有在创建的对象中的变量值包括父类型中的变量将会初始化为它们的默认值。

 

在引用作为结果返回的新创建的对象前,被指定的构造函数将继续执行以下步骤来初始化一个新对象:

1.       为这次调用把参数赋值给新创建的参数变量(形参)

2.       如果这个构造函数以一个在同一个 class 中的其它显式的构造函数开头,评估参数并使用这 5 个步骤递归的执行的调用构造函数。如果构造函数异常地结束,那么这个过程也就以同样的原因异常的结束。否则执行步骤 5

3.       如果这个构造函数没有以一个在同一个 class 中的其它显式的构造函数开头,并且在一个 class 而不是一个 Object ,那么这个构造函数将会显式或隐式地调用一个父类的构造函数。使用同样的 5 个步骤递归的执行的调用构造函数。如果构造函数异常地结束,那么这个过程也就以同样的原因异常的结束。否则执行步骤 4

4.       用变量的初始化器初始化所有变量,并以它们出现在类源代码中从左到右的顺序把它们的值赋给对应的实例变量。如果有任何一个初始化器初始化时有异常,初始化过程将不继续下去,而是以相同的异常终止。否则,继续步骤 5 。(在早期的版本中, 编译器错误的忽略了初始化一些与默认值等值的常量的代码。这是一个 Bug.

5.       执行剩余的构造函数的函数体。如果有异常,将以相同的异常终止这个过程。否则,将完成这个过程。

在创建一个类的实例过程中,不象 C++ Java 编程语言没有指定方法分发的改变规则 。假如在初始化的对象中,调用被子类覆盖的方法,即使在新的对象被完整的创建之前,将调用覆盖的方法。

 

 

 

注:

         红色为有疑义处。

 

译自 JVM SPECIFICATION 2.17.6 Creation of New Class Instances

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值