调用constructor的时候发生了什么?
2008-02-23 09:27:40来源:互联网 阅读 ()
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的前面的话,错误就会消失了.这些都是对上述原则第二步的有力证明.^_^
上一篇: eclipse myeclipse mysql服务器tomcat
下一篇: 关于flecho (flash echo) 的设想,欢迎讨论
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash