Java Static关键字 单例设计模式

类变量

  • 类变量(静态变量):有static修饰,属于类,在计算机中只有一份,被类的所有对象共享

    • 可以通过类名访问,也可以通过对象名访问,但是推荐用类名访问
    • 类变量一般用public修饰,表示完全公开
  • 实例变量:无static修饰,每个对象中的实例变量均独立

    • 只能使用对象名访问

执行原理:

02、面向对象高级一:static修饰成员变量、类变量应用场景_哔哩哔哩_bilibili

类方法

  • 类方法(静态方法):有static修饰,属于类

    • 访问方式与访问类变量一致
  • 实例方法(对象的方法):无static修饰,属于对象

    • 访问方式与访问实例变量一致
注意事项

实例方法中既可以访问类成员,也可以访问实例成员。而类方法中只能访问类成员(类成员包括类方法和类变量),不能访问实例成员,也不能出现this关键字

  • 类方法中可以直接访问类的成员,不可以直接访问实例成员
    • 因为每个对象的实例成员值是不同的,如果在类方法中访问会无法识别是哪个对象的
  • 实例方法中即可以访问类成员,也可以访问实例成员
  • 实例方法中可以出现this关键字,类方法中不可以出现this关键字

使用类方法作为工具类会提高代码复用和开发效率,并且避免浪费内存

案例:一个页面需要四位验证码,一个界面需要六位验证码,写一个类方法,参数是验证码的位数。

代码块

静态代码块

  • 格式:static{}
  • 特点:类加载时自动执行,由于类只加载一次,静态代码也只执行一次
  • 作用:完成类的初始化,例如:对类变量的初始化赋值

实例代码块

  • 格式:{}
  • 特点:每次创建对象时,都会执行实例代码块,并在构造器前执行
  • 作用:和构造器一样,都是用来完成对象的初始化,例如:对实例变量进行初始化赋值(但是一般不用,因为没有意义)。也可以用于将有参构造器和无参构造器中的重复代码放入实例代码块中,减少重复代码

执行顺序:静态代码块-实例代码块-构造器

单例设计模式

设计模式:解决某个问题的最优解法

单例设计模式概念:确保一个类只有一个对象

饿汉式单例设计模式

**饿汉式单例设计模式特点:**在获取类的对象时,对象已经创建好了

饿汉式单例设计模式写法:

  • 把类的构造器私有
  • 定义一个类变量记住类的一个对象
  • 定义一个类方法,返回对象
java 复制代码
public class mjz {

//    定义一个类变量记住类的一个对象
    private static mjz instance = new mjz();
//    定义一个私有的构造函数
    private mjz() {

    }
//    定义一个类方法,返回类对象
    public static mjz getInstance() {
        return instance;
    }


    public static void main(String[] args) {
        mjz obj1 = mjz.getInstance();
        mjz obj2 = mjz.getInstance();
        mjz obj3 = mjz.getInstance();
        System.out.println(obj1==obj2);
        System.out.println(obj2==obj3);

    }

}
  • 饿汉式单例设计模式应用场景

    • Runtime
    • 任务管理器:永远只会产生同一个任务管理器窗口对象
  • 饿汉式单例设计模式好处

    • 避免浪费内存

懒汉式单例设计模式

  • **懒汉式单例设计模式特点:**拿对象时,才开始创建对象

  • 懒汉式单例设计模式写法

    • 将类的构造器私有

    • 定义一个类变量用于存储对象

    • 提供一个类方法,保证返回的是同一个对象

java 复制代码
public class mtk {

    // 定义一个类变量用于存储对象
    private static mtk instance;
//    定义一个私有的构造函数
    private mtk() {

    }
//   定义一个类方法,保证返回的是同一个对象
    public static mtk getInstance() {
        if (instance == null) {
            instance = new mtk();
        }
        return instance;
    }

    public static void main(String[] args) {
        mtk obj1 = mtk.getInstance();
        mtk obj2 = mtk.getInstance();
        mtk obj3 = mtk.getInstance();
        System.out.println(obj1==obj2);
        System.out.println(obj2==obj3);
    }
}
相关推荐
风指引着方向6 小时前
自定义算子开发入门:基于 CANN op-plugin 的扩展实践
开发语言
人间打气筒(Ada)6 小时前
jenkins基于Pipeline发布项目
java·pipeline·jenkins·流水线·ci·cd·cicd
Fairy要carry6 小时前
面试-GRPO强化学习
开发语言·人工智能
爬山算法6 小时前
Hibernate(88)如何在负载测试中使用Hibernate?
java·后端·hibernate
自不量力的A同学6 小时前
Solon AI v3.9 正式发布:全能 Skill 爆发
java·网络·人工智能
Liekkas Kono6 小时前
RapidOCR Python 贡献指南
开发语言·python·rapidocr
张张努力变强6 小时前
C++ STL string 类:常用接口 + auto + 范围 for全攻略,字符串操作效率拉满
开发语言·数据结构·c++·算法·stl
万岳科技系统开发6 小时前
食堂采购系统源码库存扣减算法与并发控制实现详解
java·前端·数据库·算法
xyq20246 小时前
Matplotlib 绘图线
开发语言
独断万古他化6 小时前
【Spring 原理】Bean 的作用域与生命周期
java·后端·spring