代码块:就是用{}扩起来的代码。
根据位置和关键字的不同分为普通代码块、构造块、静态代码块、同步代码块(与线程有关,在线程里面分析)。
1、普通代码块:就是直接在方法或语句中定义的代码块。
public class CodeDemo01 {
public static void main(String[] args) {
// TODO Auto-generated method stub
{
int num=1;
System.out.println("这是普通代码块,里面的局部变量为:"+num);
}
int x=100;
System.out.println("这是普通代码之外,之外的局部变量为:"+x);
}
}
//结果:
//这是普通代码块,里面的局部变量为:1
//这是普通代码之外,之外的局部变量为:100
2、构造块:直接写在类中的代码块。
public class CodeDemo02 {
public static void main(String[] args) {
// TODO Auto-generated method stub
new Code02();
new Code02();
}
}
class Code02{
{
System.out.println("这是构造代码块——写在类中的代码块");
}
public Code02() {
System.out.println("实例化时调用");
}
}
//结果:
/*这是构造代码块——写在类中的代码块
实例化时调用
这是构造代码块——写在类中的代码块
实例化时调用*/
构造代码块优于构造方法执行
在此代码里面实例化对象时就会执行构造代码块,可以被执行多次。
3、静态代码块:用static关键字声明的代码块。
public class CodeDemo03 {
static {
System.out.println("在Main()所在类定义静态代码块");
}
public static void main(String[] args) {
// TODO Auto-generated method stub
{
System.out.println("这是普通代码块");
}
new Code03();
new Code03();
}
}
class Code03{
static {
System.out.println("用static修饰的静态代码块");
}
{
System.out.println("这是构造块");
}
public Code03() {
System.out.println("调用无参构造方法时被执行");
}
}
/*在Main()所在类定义静态代码块
这是普通代码块
用static修饰的静态代码块
这是构造块
调用无参构造方法时被执行
这是构造块
调用无参构造方法时被执行*/
静态代码块随着字节码加载也加载进了JVM,此时main方法还没有执行,因为方法需要JVM调用。即静态代码块优于Main()执行。
Main()所在类的静态代码块优于Main()执行,在类中定义的静态代码块优于构造块执行,构造块优于构造方法执行。
即,从快到慢为:
Main()所在类的静态代码块(且只执行一次)<——Main()
静态代码块(只执行一次)<——Main()
类中的静态代码块<——构造块<——构造方法