首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >初始化块阻塞构造函数?

初始化块阻塞构造函数?
EN

Stack Overflow用户
提问于 2015-05-02 21:07:24
回答 2查看 49关注 0票数 1

我试着测试Java中初始化代码块和构造函数的工作情况。创建对象时,首先执行init块;然后执行构造函数。如果未提供用户定义的构造函数,则编译器将提供默认构造函数。我已经尝试了以下代码:

代码语言:javascript
复制
class A
{int a;
 public static void main(String arr[])
{A a1=new A();
  System.out.println(a1.a);
}  }

这个程序的输出是0,这是非常明显的;但是,当我尝试以下程序时:

代码语言:javascript
复制
class A
    {int a;
//init block
{a=12; }
     public static void main(String arr[])
    {A a1=new A();
      System.out.println(a1.a);
   }  }

我得到了答案12,但是根据执行流程,初始化块(设置a=12)应该首先执行,然后是构造函数。在这里,默认构造函数应该在init块之后执行,并且a的值应该是0。为什么12的值是12?

EN

回答 2

Stack Overflow用户

发布于 2015-05-02 21:13:39

在创建A的新实例之后,您将在main方法中输出A的值。所以它已经设置好了(如果没有,你就不能访问“非创建”对象的变量,对吧?)

如果希望在创建过程中测试变量a的值,请运行以下代码

代码语言:javascript
复制
class A {

    public A(){
        System.out.println("The value of a in constructor is: " + a);
    }

    int a;
    {
        System.out.println(a);
        a = 12;
        System.out.println(a);
    }

    public static void main(String arr[]) {
        A a1 = new A();
    }
}

它有这样的输出:

代码语言:javascript
复制
0
12
The value of a in constructor is: 12
票数 0
EN

Stack Overflow用户

发布于 2015-05-02 21:15:56

初始化块在字段初始化后运行。因此,在设置了任何默认值或初始值之后,init块将始终看到字段值。Java不会在init代码运行后以某种方式设置字段值-这会使init块变得毫无意义。

构造函数在init块之后运行,但请注意,Java默认构造函数什么也不做。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30002665

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档