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);
    }
}
相关推荐
罗超驿21 分钟前
22.深入剖析JDBC架构:从原生API到企业级数据交互核心
java·数据库·mysql·面试
桀人22 分钟前
C++——模板初阶(收录在专栏C++入门到精通)
开发语言·c++
一直有一个ac的梦想30 分钟前
cmu15445 2025fall lec 18 transactions with two-phase lock
java·开发语言·数据库
九皇叔叔30 分钟前
Spring-Ai-Alibaba [04] 04-llm-platform-custom-demo
java·人工智能·spring
技术路上的探险家33 分钟前
Sa-Token 单点登录(SSO)三种模式大白话详解:告别重复登录
java·sa-token·单点登录·sso
JAVA社区44 分钟前
Java进阶全套教程(四)—— SpringMVC框架详解
java·开发语言·spring·面试·职场和发展
ㄣ知冷煖★44 分钟前
统一网关架构实践:从 Token 鉴权到路由、策略与凭证池转发全链路解析
java·服务器·架构
Lumbrologist1 小时前
【C++】零基础入门 · 第 2 节:变量、基本数据类型与输入输出
java·开发语言·c++
GISer_Jing1 小时前
Three.JS渲染架构解读
java·javascript·架构
绝知此事1 小时前
Netty实战:从零构建高性能TCP通信服务(含心跳检测)
java·网络·spring boot·网络协议·tcp/ip