第15讲 静态代码块、局部代码块和构造代码块

静态代码块(重要)

作用:数据初始化,且只执行一次

格式:static{ ... }

执行时机:随着类的加载而加载,并且自动触发只执行一次

使用场景:在类加载的同时,对某些数据初始化。

为什么选择静态代码块初始化?
main函数可以被手动调用,如果在main函数内初始化变量,调用main函数时会导致反复初始化,影响效率。

import java.util.ArrayList;
import java.util.Scanner;

public class Demo {
    //静态只能访问静态,所以集合要用静态修饰
    static ArrayList<Administrators> list = new ArrayList<>();

    //静态代码块:数据初始化,且只执行一次
    static {
        list.add(new Administrators("zhangsan", "10001"));
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请登录");
        System.out.println("用户名:");
        String name = sc.next();
        System.out.println("工号:");
        String id = sc.next();
        for (int i = 0; i < list.size(); i++) {
            if (list.get(i).getName().equals(name) && list.get(i).getId().equals(id)) {
                System.out.println("登陆成功");
            } else {
                System.out.println("登陆失败");
            }
        }
    }
}

//管理员类
class Administrators {
    private String name;
    private String id;

    public Administrators() {
    }

    public Administrators(String name, String id) {
        this.name = name;
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }
}

局部代码块(已淘汰)

作用:提前结束变量的生命周期,回收内存

public class Demo {
    public static void main(String[] args) {
        {
            int num = 10;
        }	//到这里,num的生命周期已经结束,内存已被回收
        
        System.out.println(num); //报错,
    }
}

构造代码块(不够灵活)

作用:把构造方法中的重复代码写在一起

​ 局限性:如只需要Student()Student(String name)需要执行该代码块,

​ 而Student(String name, int age)不需要执行的情况,就无法用构造代码块实现。

执行时机:在创建本类对象时,会先执行构造代码块,再执行构造方法

//使用场景:无论使用哪种构造创建对象,我都想让他执行一句话:"对象已创建",这时就可以使用构造代码块
public class Demo {
    public static void main(String[] args) {
        System.out.println("Student()构造");
        Student s1 = new Student();

        System.out.println("Student(String name)构造");
        Student s2 = new Student("小明");

        System.out.println("Student(String name, int age)构造");
        Student s3 = new Student("小明", 28);
        //局限:如只需要Student()和Student(String name)需要执行该代码块,
        //     而Student(String name, int age)不需要执行的情况,就无法用构造代码块实现。
    }
}

class Student {
    private String name;
    private int age;
    
    {
        System.out.println("对象已创建");
    }
    
    public Student() {}
    
    public Student(String name) {
        this.name = name;
    }
    
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
}
/*运行结果
Student()构造
对象已创建
Student(String name)构造
对象已创建
Student(String name, int age)构造
对象已创建
*/

可以用this关键字调用本类的其他构造解决上述构造代码块的局限

public class Demo {
    public static void main(String[] args) {
        System.out.println("Student()构造");
        Student s1 = new Student();

        System.out.println("Student(String name)构造");
        Student s2 = new Student("小明");

        System.out.println("Student(String name, int age)构造");
        Student s3 = new Student("小明", 28);
    }
}

class Student {
    private String name;
    private int age;
    
    public Student() {
        this(null); //调用Student(String name)构造
    }
    
    public Student(String name) {
        System.out.println("对象已创建");
        this.name = name;
    }
    
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
}
/*运行结果
Student()构造
对象已创建
Student(String name)构造
对象已创建
Student(String name, int age)构造
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值