根据代码块出现的位置不同,可以分为三类:
局部代码块:写在方法里面。作用一般是提前结束变量的生命周期。
构造代码块:写在方法外面,类里面,即写在成员位置。
静态代码块:加上 static 进行修饰。
局部代码块
局部代码块写在方法里面。作用一般是提前结束变量的生命周期。
这个功能最本质的作用就是节约内存,变量用不到了就立马让它消失。因为现在电脑已经不缺这点内存了,这个功能现在已经几乎用不上了。
构造代码块
构造代码块写在方法外面,类里面,即写在成员位置。
作用是把多个构造方法中重复的代码提取出来。执行时机为:在创建本类对象时,先执行构造代码块,再执行构造方法。这个技术现在也渐渐地被淘汰了,就是因为这种写法不够灵活。
构造代码块使用案例:
下面的 Javabean 类中,两个构造方法中有相同的语句,比较繁琐,可以提取出来形成构造代码块。
修改之前的代码:
public class Student {
String name;
int age;
public Student() {
System.out.println("开始创建对象了。");
System.out.println("空参构造");
}
public Student(String name, int age) {
System.out.println("开始创建对象了。");
System.out.println("有参构造");
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
修改之后的代码:
public class Student {
String name;
int age;
{
System.out.println("开始创建对象了。");
}
public Student() {
System.out.println("空参构造");
}
public Student(String name, int age) {
System.out.println("有参构造");
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
测试类:
public class Test {
public static void main(String[] args) {
Student s = new Student();
}
}
执行结果:
开始创建对象了。
空参构造
虽然测试类没有调用打印语句,但是执行测试类,还是会输出内容。根据输出内容也能看出来构造代码块是在构造方法之前执行的,先执行构造代码块再执行构造方法。
这个技术不够灵活,例如,我现在有一个带部分参数的构造方法,且执行这个构造方法时,我不想执行构造代码块,那么是无法做到的,因为构造代码块一定会执行且一定在构造方法执行之前执行。
Javabean 类:
public class Student {
String name;
int age;
{
System.out.println("开始创建对象了。");
}
public Student() {
System.out.println("空参构造");
}
public Student(String name, int age) {
System.out.println("有参构造");
this.name = name;
this.age = age;
}
// 带部分参数的构造方法
public Student(String name) {
System.out.println("带部分参数的构造方法");
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
测试类:
public class Test {
public static void main(String[] args) {
Student s = new Student();
Student s1 = new Student("xiaoming", 23);
Student s2 = new Student("xiaoming");
}
}
执行结果:
开始创建对象了。
空参构造
开始创建对象了。
有参构造
开始创建对象了。
带部分参数的构造方法
解决方案:将多个构造方法的重复的代码写在其中一个构造方法中,在别的构造方法中,用 this 调用这个写了重复语句的构造方法。
例如:
上图中,由于不知道应该给 name 和 age 赋值多少,因为是空参构造,所以 this 方法中传递的实参就是默认初始化的值,即 string 类型给 null,age 类型给 0。
另一种方法:将重复的代码抽取成一个方法,在构造方法中调用这个方法即可。例如:
如此一来,构造代码块也就不需要用了,只要见到了能认出来用到了构造代码块这个方法就行了。
静态代码块
静态代码块需要加上 static 进行修饰。就是在局部代码块前面加 static,形式为:static {}
静态代码块是重点,需要掌握,以后会用到。
静态代码块的特点是用 static 关键字进行修饰,随着类的加载而加载,并且自动触发,只执行一次。
构造代码块是每一次创建对象都会执行一次。但是静态代码块只执行一次。当这个类的代码加载到内存中时,静态代码块里面的代码就会自动执行一次。
静态代码块的使用场景:在类加载的时候,做一些数据初始化的时候使用。
Javabean 类:
public class Student {
String name;
int age;
static {
System.out.println("执行静态代码块");
}
public Student() {
System.out.println("执行空参构造方法");
}
public Student(String name, int age) {
System.out.println("执行带全部参数的构造方法");
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
测试类:
public class Test {
public static void main(String[] args) {
Student s1 = new Student();
Student s2 = new Student("xiaoming", 23);
}
}
执行结果:
执行静态代码块
执行空参构造方法
执行带全部参数的构造方法
应用场景:例如数据的初始化,比如学生管理系统,每一次开始都是空的,都要先添加学生信息,可以用静态代码块的方式使得程序在刚开始运行时就有一些初始化的数据。
静态代码块里面只能调用静态的方法或变量,即 static {}
里面只能用被 static 修饰的方法或变量。