代码块
1 代码块的概念及其分类
概念:使用 {} 定义的一段代码称为代码块。
分类:代码块有以下四种:
普通代码块
构造块/实例代码块
静态代码块
同步代码块(后续会讲)
本篇文章主要讲解实例代码块和静态代码块。
2 实例代码块
2.1 概念及其定义方式
概念:定义在类中的代码块(不加修饰符)称之为实例代码块。
class Student{ int age; String name; { } }
上面那段代码的第五行就定义了一个实例代码块,实例代码块可用于初始化实例成员。
例如:
class Student{ int age; String name; { age = 18; name = "李四"; } public void fun(){ System.out.println(name+" "+age); } } public class Test1 { public static void main(String[] args) { Student student = new Student(); student.fun(); } }
上段代码在实例代码块中对成员变量age和name进行了初始化并打印。
注意:实例代码块只有在创建对象时才会执行。
3 静态代码块
3.1 概念及其定义方式
概念:使用static定义的代码块称为静态代码块。
定义方式:静态代码块可以通过以下方式定义:
class Student{ int age; String name; static String classes; static { classes = "三班"; System.out.println(classes); } } public class Test1 { public static void main(String[] args) { Student student = new Student(); } }
下面的6-9行段代码(如下)就定义了一个静态代码块。
static { classes = "三班"; System.out.println(classes); }
注意:
1.静态代码块可用于初始化静态成员变量,但是不能访问非静态成员。例如:
class Student{ int age; String name; static String classes; static { classes = "三班"; System.out.println(classes); age = 18; } } public class Test1 { public static void main(String[] args) { Student student = new Student(); } }
这段代码的第8行就会报错。
2.若一个类中含有多个静态代码块,则按其定义的先后顺序执行。
class Student{ int age; String name; static String classes; static { System.out.println("这是第一个静态代码块"); } static { System.out.println("这是第二个静态代码块"); } } public class Test1 { public static void main(String[] args) { Student student = new Student(); } }
执行结果如下:
4 用法注意点:
注意:
1.当一个类中同时出现了静态代码块,实例代码块,构造方法,那么这三者的执行顺序是:静态代码块>实例代码块>构造方法,与其定义的前后顺序无关。
例如:
class Student{ int age =18; String name = "李四"; public void set(int age,String name) { this.age = age; this.name =name; } static { System.out.println("这是第一个静态代码块"); } { System.out.println("这是一个实例化代码块"); } public Student(int age) { System.out.println("这是一个打印年龄的构造方法"); } } public class Test1 { public static void main(String[] args) { Student student = new Student(17); } }
运行结果:
当我们改变这三者的定义的前后顺序,我们会发现,其运行结果相同。
2.静态成员变量是类的属性,因此是在JVM加载类时开辟空间并初始化的。
3.静态代码块不管生成多少个对象,其只会执行一次。
例如:
class Student{ int age =18; String name = "李四"; public void set(int age,String name) { this.age = age; this.name =name; } static { System.out.println("这是第一个静态代码块"); } static{ System.out.println("这是二个静态代码块"); } { System.out.println("这是一个实例化代码块"); } { System.out.println("这是二个实例化代码块"); } public Student(int age)// { this("李四");//用于调用另一个构造方法 System.out.println("这是一个打印年龄的构造方法"); } public Student(String name){ System.out.println("这是一个打印名字的构造方法"); } } public class Test1 { public static void main(String[] args) { Student student = new Student(17); Student student1 = new Student(17); } }
运行结果:
当我们第一次创建对象时,两个静态代码块的内容都执行了,但是,当我们第二次创建对象时,并没有再次执行静态代码块中的内容,可见:静态代码块不管生成多少个对象,其只会执行一次。
本章的内容就到这里啦,若有不足,欢迎评论区指正,最后,希望大佬们多多三连吧,下期见!