调用constructor的时候发生了什么?

本文是受论坛上一篇帖子的启发而作,相关源代码如下所示:

package cn.edu.hust.cm.test;

public class TestOrder
{
 private int k=getParam();
    public TestOrder(){
        System.out.println("In The Constructor");
        i++;
        System.out.println("i is "+i);
                      }
                     
    static{
        System.out.println("In The Static Block");
          }
    {
        System.out.println("In The Block");
    }
   
    public int getParam(){
     System.out.println("In The Method");
     i++;
     j++;
     k=j;
     return k;
        }
 public static void main(String[] args)
 {
  System.out.println("In The Main");
  TestOrder test=new TestOrder();
 }
    private int i=0;
    private int j=1;
  }

运行之,输出结果为:

In The Static Block
In The Main
In The Method
In The Block
In The Constructor
i is 1

        为什么会是这样的执行顺序呢?刚开始我也不是很能明白,后来查了相关资料后总算明白了.现将我个人的理解叙述如下:

        首先是静态的block,当我们运行java TestOrder的时候 ,TestOrder被载入内存,此时静态块就会被调用唯一的一次,因此首先输出"In The Static Block" ;接着,因为main方法是整个程序的入口,进入main方法,所以会紧接着输出In The Main,然后开始调用该类的构造方法,那么这个时候会有哪些操作或者说动作发生呢?

        第一步:将所有的域(包括静态域)置为它们的初始值;

        第二步:各个域的初始化语句以及non-static块按照它们在程序中出现的顺序依次被执行;

        第三步:执行构造方法中的语句.

        正是基于这样的原则,所以会有如上的输出.可以做几个小的验证来进一步证明.把 private int k=getParam()放到程序的最后一行,这时输出就变成:

In The Static Block
In The Main
In The Block
In The Method
In The Constructor
i is 2

        这是因为getParam()在块之后被调用的缘故.我们还可以做一个试验,在块中加入这样一条语句:System.out.println("i is "+i);这时编译出错,can't reference a field before it is defined.因为block先执行,而此时i还没定义,所以会出错.如果我们把private int i=0;放到block的前面的话,错误就会消失了.这些都是对上述原则第二步的有力证明.^_^

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值