分析一段代码:
public class Test1 {
publicstatic Test1 t1=new Test1();
publicstatic Test1 t2=new Test1();
{
System.out.println("构造块");
}
static{
System.out.println("静态块");
}
public static void main(String[] args)throws IOException{
Test1t=new Test1();
}
}
输出结果:
构造块
构造块
静态块
构造块
main方法是一个程序的入口,平时自己分析时只用到下面的四个栈、堆、静态域和常量池。这里也只针对下面四个存储区域进行分析
栈主要是存放基本类型的变量数据和对象的引用,就是一些变量,比如t1、t2;堆就是存放所有new出来的对象;静态域是存放静态成员(static定义的); 常量池是存放字符串常量和基本类型常量(public static final)。平时分析也可以将静态域和常量池放在一个地方分析。
现在分析一下本程序:
执行顺利是静态代码块>构造代码块>构造方法。其中静态属性>静态方法。程序运行,加载Test1类,首先将静态属性public static Test1 t1=new Test1();放入静态域,然后通过new在堆中产生一个对象,对象中只有构造代码块。可以把构造代码块理解成跟构造方法一样,自动加载。所以打印"构造块",然后执行public static Test1 t2=new Test1();打印"构造块"、最后执行静态代码块,打印"静态块"。然后执行静态方法,main,打印"构造块"。
可能分析的并不是很好,欢迎大家发言