为了账号安全,请及时绑定邮箱和手机立即绑定

在Java中运行构造函数代码之前是否初始化了字段?

在Java中运行构造函数代码之前是否初始化了字段?

POPMUISE 2019-07-09 14:32:27
在Java中运行构造函数代码之前是否初始化了字段?有人能解释下程序的输出吗?我认为构造函数是在实例变量之前初始化的。所以我希望输出是“XZYY”。class X {     Y b = new Y();     X() {         System.out.print("X");     }}class Y {     Y() {         System.out.print("Y");     }}public class Z extends X {     Y y = new Y();     Z() {         System.out.print("Z");     }     public static void main(String[] args) {         new Z();     }}
查看完整描述

3 回答

?
哔哔one

TA贡献1854条经验 获得超8个赞

初始化的正确顺序是:

  1. 静态变量初始化器和静态初始化块(按文本顺序排列),如果类以前没有初始化的话。
  2. 函数中的超级()调用,无论是显式的还是隐式的。
  3. 实例变量初始化器和实例初始化块,按文本顺序排列。
  4. 在Super()之后保留构造函数体。

见各节§2.17.5-6的Java虚拟机规范.


查看完整回答
反对 回复 2019-07-09
?
郎朗坤

TA贡献1921条经验 获得超9个赞

如果您查看类文件的反编译版本

class X {
    Y b;

    X() {
        b = new Y();
        System.out.print("X");
    }}class Y {
    Y() {
        System.out.print("Y");
    }}public class Z extends X {

    Y y;

    Z() {
        y = new Y();
        System.out.print("Z");
    }

    public static void main(String args[]) {
        new Z();
    }}

您可以发现实例变量y在构造函数中移动,因此执行顺序如下

  1. 调用

    Z

  2. 的默认构造函数。

    X

  3. 第一行

    X

    构造器

    new Y()

    叫做。
  4. 打印Y
  5. 打印X
  6. 调用构造函数Z中的第一行

    new Y()

  7. 列印

    Y

  8. 打印Z

所有实例变量都是使用构造函数语句初始化的。


查看完整回答
反对 回复 2019-07-09
  • 3 回答
  • 0 关注
  • 545 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信