系列文章目录
Java中的类和对象系列
目录
一、代码块的概念及分类
使用{}定义的一段代码称为代码块。根据代码块定义的位置以及关键字,又可分为以下四种
- 普通代码块
- 构造块
- 静态块
- 同步代码块(后面讲多线程再谈)
今天我们主要讲构造块和静态块。
1.普通代码块
这里,我们还是先提一嘴普通代码块:
public Class Main{
public static void main(String[] args) {
{
int x = 10;
System.out.println(“这是一个普通代码块”);
}
System.out.println(x);//报错
}
}
普通代码块仅仅起到一个限制变量作用域的问题。
2.构造代码块
也叫实例代码块,定义在类中,不加修饰符,一般用于初始化实例成员变量。
public class Student {
private String name;
private int num;
private String sex;
private static int Class = 1;
public Student() {
System.out.println("这是构造方法的第一句!");
this.num = 21;
}
public Student(int num) {
System.out.println("这是构造方法的第一句!");
this.num = num;
}
{
this.name = "Janssen";
//this.num = 21;
this.sex = "man";
System.out.println("这是一个构造块!");
}
public String toString(){
return "name:"+this.name+" num:"+this.num+" sex:"+this.sex+" class:"+ Class;
}
public static void main(String[] args) {
Student a = new Student();
Student b = new Student();
System.out.println(a);
System.out.println(b);
}
}
如下是输出结果:
这是一个构造块!
这是构造方法的第一句!
这是一个构造块!
这是构造方法的第一句!
name:Janssen num:21 sex:man class:1
name:Janssen num:22 sex:man class:1
由输出结果我们不难看出,构造块优先于构造方法先执行,因为在编译完成后,编译器会将构造块中的代码拷贝到每一个构造方法的第一条语句前!
因此,构造块的意义在于简化多个构造方法的冗余量,简化重复代码量。构造代码块只有在创建对象时才会执行。
3.静态代码块
如果说构造块是用来初始化实例成员变量的,那么静态代码块就是用来初始化静态成员变量的。
代码块我们也用static来修饰:
public class Student {
private String name;
private int num;
private String sex;
private static int Class = 1;
public Student() {
System.out.println("这是构造方法的第一句!");
}
{
this.name = "Janssen";
this.num = 21;
this.sex = "man";
System.out.println("这是一个构造块!");
}
static{
Class = 2;
System.out.println("这是一个静态代码块!");
}
public static int getclass(){
return Class;
}
public String toString(){
return "name:"+this.name+" num:"+this.num+" sex:"+this.sex+" class:"+ Class;
}
public static void main(String[] args) {
Student a = new Student();
System.out.println(a);
}
}
这是一个静态代码块!
这是一个构造块!
这是构造方法的第一句!
name:Janssen num:21 sex:man class:2
由输出结果我们可以看出:
- 静态代码块在虚拟机加载类的时候就会加载执行,它优先于构造块
- 而且不管生成多少个对象,静态代码块都只执行一次!
- 如果静态变量已经初始化,静态代码块可以对其重新赋值(除非final定义)