局部代码块

局部代码块是定义在方法或语句中
demo:

  1. public class BlockDemo {
  2. public static void main(String[] args) {
  3. //局部代码块:存在于方法中,控制变量的生命周期(作用域)
  4. {
  5. for(int x = 0;x < 10;x++) {
  6. System.out.println("我爱Java");
  7. }
  8. int num = 10;
  9. }
  10. //System.out.println(num);//无法访问num,超出num的作用域范围
  11. }
  12. }

构造代码块

构造代码块是定义在类中成员位置的代码块
demo:

  1. package com.itheima_04;
  2. class Teacher {
  3. String name;
  4. int age;
  5. // 构造代码块
  6. {
  7. for(int x = 0;x < 10;x++) {
  8. System.out.println("我爱Java");
  9. }
  10. System.out.println("我爱Java");
  11. }
  12. public Teacher() {
  13. System.out.println("我是无参空构造");
  14. }
  15. public Teacher(String name,int age) {
  16. System.out.println("我是有参构造");
  17. this.name = name;
  18. this.age = age;
  19. }
  20. }

静态代码块

静态代码块是定义在成员位置,使用static修饰的代码块
demo:

  1. class Teacher {
  2. String name;
  3. int age;
  4. //静态代码块:随着类的加载而加载,只加载一次,加载类时需要做的一些初始化,比如加载驱动
  5. static {
  6. System.out.println("我爱Java");
  7. }
  8. public Teacher() {
  9. System.out.println("我是无参空构造");
  10. }
  11. public Teacher(String name,int age) {
  12. System.out.println("我是有参构造");
  13. this.name = name;
  14. this.age = age;
  15. }
  16. }

每种代码块特点

局部代码块:

以”{}”划定的代码区域,此时只需要关注作用域的不同即可
方法和类都是以代码块的方式划定边界的

构造代码块

优先于构造方法执行,构造代码块用于执行所有对象均需要的初始化动作
每创建一个对象均会执行一次构造代码块。

静态代码块

它优先于主方法执行、优先于构造代码块执行,当以任意形式第一次使用到该类时执行。
该类不管创建多少对象,静态代码块只执行一次。
可用于给静态变量赋值,用来给类进行初始化。

执行顺序

  1. package com.itheima_04;
  2. /*
  3. * BlockTest静态代码块执行 --- BlockTest的主函数执行了 --- Coder静态代码块执行 --- Coder构造代码块执行 --- Coder无参空构造执行
  4. * Coder构造代码块执行 --- Coder无参空构造执行
  5. *
  6. */
  7. public class BlockTest {
  8. static {
  9. System.out.println("BlockTest静态代码块执行");
  10. }
  11. {
  12. System.out.println("BlockTest构造代码块执行");
  13. }
  14. public BlockTest(){
  15. System.out.println("BlockTest无参构造执行了");
  16. }
  17. public static void main(String[] args) {
  18. System.out.println("BlockTest的主函数执行了");
  19. Coder c = new Coder();
  20. Coder c2 = new Coder();
  21. }
  22. }
  23. class Coder {
  24. static {
  25. System.out.println("Coder静态代码块执行");
  26. }
  27. {
  28. System.out.println("Coder构造代码块执行");
  29. }
  30. public Coder() {
  31. System.out.println("Coder无参空构造执行");
  32. }
  33. }
  1. BlockTest静态代码块执行
  2. BlockTest的主函数执行了
  3. Coder静态代码块执行
  4. Coder构造代码块执行
  5. Coder无参空构造执行
  6. Coder构造代码块执行
  7. Coder无参空构造执行

JAVA中静态块、静态变量加载顺序

如果类是第一次加载:

  1. 先执行父类的静态代码块和静态变量初始化,并且静态代码块和静态变量的执行顺序只跟代码中出现的顺序有关。
  2. 执行子类的静态代码块和静态变量初始化。 并且静态代码块和静态变量的执行顺序只跟代码中出现的顺序有关。
  3. 执行父类的代码块
  4. 执行父类的实例变量初始化 。
  5. 执行父类的构造函数
  6. 执行子类的代码块
  7. 执行子类的实例变量初始化
  8. 执行子类的构造函数
  9. 如果类已经被加载:

则静态代码块和静态变量就不用重复执行,再创建类对象时,只执行与实例相关的代码块、变量初始化和构造方法。
**

demo

  1. public class Parent {
  2. static {
  3. System.out.println("parent 执行static代码块!");
  4. }
  5. {
  6. System.out.println("parent 执行局部代码块!");
  7. }
  8. public Parent(){
  9. System.out.println("parent 执行构造函数!");
  10. }
  11. }
  12. public class Child extends Parent{
  13. static {
  14. System.out.println("child 执行static代码块!");
  15. }
  16. {
  17. System.out.println("child 执行局部代码块!");
  18. }
  19. public Child(){
  20. System.out.println("child 执行构造函数!");
  21. }
  22. }
  23. public class Main {
  24. public static void main(String[] args) {
  25. // write your code here
  26. Child child1 = new Child();
  27. Child child2 = new Child();
  28. }
  29. }

parent 执行static代码块!

child 执行static代码块!

parent 执行局部代码块!

parent 执行构造函数!

child 执行局部代码块!

child 执行构造函数!

parent 执行局部代码块!

parent 执行构造函数!

child 执行局部代码块!

child 执行构造函数!