目录
一.局部代码块
只在方法中出现,当作正常的代码看待即可,使用大括号括起来的代码。
局部代码块的优点:使用完毕及早释放,提高内存的使用率。
public class Test1 { public static void main(String[] args) { { int a = 10; System.out.println(a); } // System.out.println(a); } } 局部代码块运行完毕时及早释放,所以外部读取不到变量a。
二.构造代码块
-
位置: 类中方法外定义
-
特点: 每次构造方法执行的时侯,都会执行该代码块中的代码,并且在构造方法执行前执行
-
作用: 将多个构造方法中相同的代码,抽取到构造代码块中,提高代码的复用性
ublic class Test1 { public static void main(String[] args) { //每new一次对象都会执行一遍构造代码块,之后再执行一遍构造方法 Student stu1 = new Student(); Student stu2 = new Student(10); } } class Student { { System.out.println("好好学习"); } public Student(){ System.out.println("空参数构造方法"); } public Student(int a){ System.out.println("带参数构造方法"); } }输出结果:
好好学习
空参数构造方法
好好学习
带参数构造方法
三.静态代码块
-
位置: 类中方法外定义
-
特点: 需要通过static关键字修饰,随着类的加载而加载,并且只执行一次
-
作用: 在类加载的时候做一些数据初始化的操作
public class Test1 { public static void main(String[] args) { Person p1 = new Person(); Person p2 = new Person(10); } } class Person { static { System.out.println("我是静态代码块, 我执行了"); } public Person(){ System.out.println("我是Person类的空参数构造方法"); } public Person(int a){ System.out.println("我是Person类的带参数构造方法"); } } 输出结果: 我是静态代码块, 我执行了 我是Person类的空参数构造方法 我是Person类的带参数构造方法
四.理解代码块执行顺序
//局部代码块、构造代码块、静态代码块 class Demo { //无参构造方法 Demo() { System.out.println("Demo无参构造方法"); } //构造代码块 { int x = 200; System.out.println(x); } //静态代码块 static { int w = 99; System.out.println(w); } } public class CodeDemo { CodeDemo() { System.out.println("CodeDemo无参构造方法"); } { int q = 500; System.out.println(q); } static { int r = 700; System.out.println(r); } public static void main(String[] args) { { int a = 100; System.out.println(a); } int a2 = 300; System.out.println(a2); { int b = 200; System.out.println(b); } Demo d = new Demo(); System.out.println("------------------"); CodeDemo codeDemo = new CodeDemo(); } }输出结果:700
100
300
200
99
200
Demo无参构造方法
------------------
500
CodeDemo无参构造方法解释:
运行程序,JVM会将class文件和静态成员加载到方法区中。JVM会先执行CodeDemo的静态代码块r,再把main方法加载到栈里面,执行main方法里面的 a➡a2➡b;之后调用无参构造方法为Demo创建对象d,执行w➡x➡Demo无参构造方法;最后调用无参构造方法为CodeDemo创建对象codeDemo,执行q➡y。 注意:这里没有r,由于静态代码块在被执行过一次之后,再次调用不执行。
五.有继承关系执行代码块顺序
执行顺序:
父类的静态代码块和静态属性->父类的构造代码块->父类的构造方法->子类的静态代码块和静态属性->父类的构造代码块->父类的构造方法->子类的构造代码块->子类的构造方法
class Fu{ static { System.out.println("父类的静态代码块"); } { System.out.println("父类的构造代码块"); } public Fu(){ System.out.println("父类的无参构造方法"); } } class Zi extends Fu{ static { System.out.println("子类的静态代码块"); } { System.out.println("子类的构造代码块"); } public Zi(){ //隐含了super() System.out.println("子类的无参构造方法"); } } public class Test { public static void main(String[] args) { new Fu(); new Zi(); } }输出结果:
父类的静态代码块
父类的构造代码块
父类的无参构造方法
子类的静态代码块
父类的构造代码块
父类的无参构造方法
子类的构造代码块
子类的无参构造方法