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);
    }
}
相关推荐
Chen不旧4 分钟前
java基于reentrantlock/condition/queue实现阻塞队列
java·开发语言·signal·reentrantlock·await·condition
laplace012317 分钟前
Part 3:模型调用、记忆管理与工具调用流程(LangChain 1.0)笔记(Markdown)
开发语言·人工智能·笔记·python·langchain·prompt
寒水馨18 分钟前
com.github.oshi : oshi-core 中文文档(中英对照·API·接口·操作手册·全版本)以6.4.0为例,含Maven依赖、jar包、源码
java·后端
0和1的舞者26 分钟前
SpringBoot日志框架全解析
java·学习·springboot·日志·打印·lombok
风送雨35 分钟前
八周Python强化计划(七)
开发语言·python
ππ很开心66638 分钟前
DAY 32 函数专题2:装饰器
开发语言·python
小毅&Nora40 分钟前
【Java线程安全实战】② ConcurrentHashMap 源码深度拆解:如何做到高性能并发?
java·安全·多线程
Knight_AL43 分钟前
阿里《Java 开发手册》下的对象构建与赋值规范实践
java·开发语言
lsx20240644 分钟前
SQL LIKE 操作符详解
开发语言
微爱帮监所写信寄信1 小时前
微爱帮监狱寄信写信工具照片高清处理技术架构
开发语言·人工智能·网络协议·微信·php