代码块概述

在Java中,使用 { } 括起来的代码被称为代码块

代码块分类

  • 局部代码块

    • 位置: 方法中定义
    • 作用: 限定变量的生命周期,及早释放,提高内存利用率
    • 示例代码

      1. public class Test {
      2. /*
      3. 局部代码块
      4. 位置:方法中定义
      5. 作用:限定变量的生命周期,及早释放,提高内存利用率
      6. */
      7. public static void main(String[] args) {
      8. {
      9. int a = 10;
      10. System.out.println(a);
      11. }
      12. // System.out.println(a);
      13. }
      14. }
  • 构造代码块

    • 位置: 类中方法外定义
    • 特点: 每次构造方法执行的时,都会执行该代码块中的代码,并且在构造方法执行前执行
    • 作用: 将多个构造方法中相同的代码,抽取到构造代码块中,提高代码的复用性
    • 示例代码
      ```java public class Test { /* 构造代码块:
      1. 位置:类中方法外定义
      2. 特点:每次构造方法执行的时,都会执行该代码块中的代码,并且在构造方法执行前执行
      3. 作用:将多个构造方法中相同的代码,抽取到构造代码块中,提高代码的复用性
      */ public static void main(String[] args) { 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关键字修饰,随着类的加载而加载,并且只执行一次 
   -  作用: 在类加载的时候做一些数据初始化的操作 
   -  示例代码  
```java
public class Test {
    /*
        静态代码块:
            位置:类中方法外定义
            特点:需要通过static关键字修饰,随着类的加载而加载,并且只执行一次
            作用:在类加载的时候做一些数据初始化的操作
     */
    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类的带...........参数构造方法");
    }
}

黑马信息管理系统使用代码块改进

  • 需求
    使用静态代码块,初始化一些学生数据
  • 实现步骤
    1. 在StudentDao类中定义一个静态代码块,用来初始化一些学生数据
    2. 将初始化好的学生数据存储到学生数组中
  • 示例代码
    StudentDao类

    public class StudentDao {
     // 创建学生对象数组
     private static Student[] stus = new Student[5];
    
     static {
         Student stu1 = new Student("heima001","张三","23","1999-11-11");
         Student stu2 = new Student("heima002","李四","24","2000-11-11");
    
         stus[0] = stu1;
         stus[1] = stu2;
     }
    
     // 添加学生方法
     public boolean addStudent(Student stu) {
    
         // 2. 添加学生到数组
         //2.1 定义变量index为-1,假设数组已经全部存满,没有null的元素
         int index = -1;
         //2.2 遍历数组取出每一个元素,判断是否是null
         for (int i = 0; i < stus.length; i++) {
             Student student = stus[i];
             if(student == null){
                 index = i;
                 //2.3 如果为null,让index变量记录当前索引位置,并使用break结束循环遍历
                 break;
             }
         }
    
         // 3. 返回是否添加成功的boolean类型状态
         if(index == -1){
             // 装满了
             return false;
         }else{
             // 没有装满, 正常添加, 返回true
             stus[index] = stu;
             return true;
         }
     }
     // 查看学生方法
     public Student[] findAllStudent() {
         return stus;
     }
    
     public void deleteStudentById(String delId) {
         // 1. 查找id在容器中所在的索引位置
         int index = getIndex(delId);
         // 2. 将该索引位置,使用null元素进行覆盖
         stus[index] = null;
     }
    
     public int getIndex(String id){
         int index = -1;
         for (int i = 0; i < stus.length; i++) {
             Student stu = stus[i];
             if(stu != null && stu.getId().equals(id)){
                 index = i;
                 break;
             }
         }
         return index;
     }
    
     public void updateStudent(String updateId, Student newStu) {
         // 1. 查找updateId, 在容器中的索引位置
         int index = getIndex(updateId);
         // 2. 将该索引位置, 使用新的学生对象替换
         stus[index] = newStu;
     }
    }