1. 代码块
代码块定义:使用“{}”定义的一段代码。
根据代码块定义的位置以及关键字,又可分为以下四种:
- 普通代码块
- 构造块
- 静态块
- 同步代码块
1.1 普通代码块
普通代码块:定义在方法中的代码块。
public class Test1{
public static void main(String[] args)
{
{
//普通代码块
int a=20;
System.out.println(a);
}
int a=10;
System.out.println(a);
}
}
由于int a = 20
中a的作用域是普通代码块
{
//普通代码块
int a=20;
System.out.println(a);
}
中,当出了这个{}包含的地方a将不再有效,此时在定义int a =10
是可以的。一般如果方法中代码过长,为避免变量重名,使用普通代码块。
代码是否可以这样写????:
public class Test1{
public static void main(String[] args)
{
int a=10;
{
//普通代码块
int a=20;
System.out.println(a);
}
System.out.println(a);
}
}
不可以!!!
写代码时要注意变量作用域的问题!!!!
1.2 构造块
构造块: 定义在类中的代码块(不加修饰符)
class Person{
//定义在类中,不加任何修饰符
{
System.out.println("Person类的构造块!");
}
//构造函数
public Person(){
System.out.println("Person类的构造函数!");
}
}
public class Test1{
public static void main(String[] args)
{
new Person();
new Person();
}
}
通过上述代码我们发现:构造块优先于构造方法执行,每产生一个新的对象就调用一次构造块。
所以构造块可以进行简单的逻辑操作(在调用构造方法之前)。
1.3 静态代码块
静态代码块: 使用static定义的代码块。
根据静态块所在的类不同又可分为以下两种类型:
- 在非主类中的静态代码块
- 在主类中的静态代码块
1.3.1 在非主类中的静态代码块
class Person{
//构造块
{
System.out.println("Person类的构造块!");
}
//构造函数
public Person(){
System.out.println("Person类的构造函数!");
}
//静态块
static
{
System.out.println("Person类的静态代码块!");
}
}
public class Test1{
public static void main(String[] args)
{
System.out.println("*******start*********");
new Person();
new Person();
System.out.println("*********end*********");
}
}
通过以上代码,我们可以发现:
- 在非主类中的静态代码块,在类加载时执行(什么时候用到这个类就是类加载),优先于构造块执行。
- 无论产生多少实例化对象,静态块都只执行一次。
静态块的主要作用是为static属性进行初始化!!!!!
1.3.2 在主类中的静态代码块
public class Test1{
//构造块
{
System.out.println("Test1类的构造块!");
}
//构造函数
public Test1(){
System.out.println("Test1类的构造函数!");
}
//静态块
static
{
System.out.println("Test1类的静态代码块!");
}
public static void main(String[] args)
{
System.out.println("*******start*********");
new Test1();
new Test1();
System.out.println("*********end*********");
}
}
在主类中定义的静态块,优先于主方法(main)执行!!,在JVM启动时执行
public class Test{
public Test()
{
//构造方法
System.out.println("主类的构造方法");
}
{
//构造块
System.out.println("主类的构造块");
}
static {
//静态块
System.out.println("主类的静态代码块");
}
public static void main(String[] args)
{
}
}
当编译执行时JVM会首先加载主类,此时主类中的静态代码块就被执行。