一、普通代码块
直接在一个方法中出现的{}就称为普通代码块,例子程序如下:
public class CodeDemo01{
public static void main(String[] args){
//普通代码块
{
int x = 10;
System.out.println("x=" + x);
}
int x = 100;
System.out.println("x=" + x);
}
}
二、构造代码块
直接在类中定义的没有加static关键字的代码块{}称为构造代码块,例子程序如下:
public class CodeDemo02{
public CodeDemo02(){
System.out.println("========这是构造方法=========");
}
//这是构造代码块,而且在new对象时,构造代码块优先构造方法执行
{
System.out.println("=========这是构造块!=========");
}
public static void main(String[] args){
new CodeDemo02();
new CodeDemo02();
}
}
三、静态代码块
使用static关键字声明的代码块称为静态代码块,静态块的主要目的是用来为静态属性初始化,例子程序如下:
public class CodeDemo03
{
static{
System.out.println("这是主类中的静态代码块!");
}
public static void main(String[] args){
new Demo();
new Demo();
new Demo();
}
}
class Demo
{
static{
System.out.println("这是Demo类中的静态代码块!");
}
{
System.out.println("这是Demo类中的构造块!");
}
public Demo(){
System.out.println("这是构造方法!");
}
}
静态块优先于主方法的执行,静态块优先于构造方法的执行,而且只执行一次!
四、同步代码块
同步代码块主要出现在多线程中。
下面是相关例子:
public class Main{
{
System.out.println("构造块");
}
static{
System.out.println("静态代码块");
}
public Main(){
System.out.println("构造函数");
}
public static void main(String args[]){
Main m;
}
}
执行结果为:
静态代码块
为什么呢,程序里面只是申请了一个引用,但是并没有实例化,这说明构造方法和构造块都是在实例化时调用的,而静态代码块不是,分析内存知道,静态的并不属于对象,而是属于类,不论实例化多少对象,静态的内存只有一个,在出现声明引用的时候即分配内存!
再看下面例子:
public class Main{
{
System.out.println("构造块");
}
static{
System.out.println("静态代码块");
}
public Main(){
System.out.println("构造函数");
}
public static void main(String args[]){
Main m=new Main();
}
}
这个程序跟上面那个比较只是实例化了一个对象,为对象分配了内存,那么看执行结果:
静态代码块
构造块
构造函数
这个说明了一个问题:在程序执行过程中,静态代码块优于构造块,构造块优于构造函数执行。
再看下面代码:
public class Main{
{
System.out.println("构造块");
}
static{
System.out.println("静态代码块");
}
public Main(){
System.out.println("构造函数");
}
public static void main(String args[]){
Main m=new Main();
Main m1=new Main();
}
}
此代码与上面代码相比较是实例化了两个对象,那么看执行结果:
静态代码块
构造块
构造函数
构造块
构造函数
此结果足以说明一个问题:静态代码块不论实例化多少对象,只调用一次!而其他的执行多次!
注:静态代码块是在main方法执行之前执行的!
转载自: http://blog.sina.com.cn/s/blog_6730a3aa0100wmv0.html
转载自:http://www.cnblogs.com/end/archive/2012/12/21/2827554.html