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);
    }
}
相关推荐
serendipity_hky10 分钟前
互联网大厂Java面试故事:核心技术栈与场景化业务问题实战解析
java·spring boot·redis·elasticsearch·微服务·消息队列·内容社区
我真不会起名字啊10 分钟前
C、C++中的sprintf和stringstream的使用
java·c语言·c++
十点摆码12 分钟前
Spring Boot2 使用 Flyway 管理数据库版本
java·flyway·数据库脚本·springboo2·数据库脚本自动管理
毕设源码-钟学长29 分钟前
【开题答辩全过程】以 基于Javaweb的电动汽车充电桩管理系统为例,包含答辩的问题和答案
java·spring boot
多敲代码防脱发34 分钟前
为何引入Spring-cloud以及远程调用(RestTemplate)
java·开发语言
毕设源码-邱学长34 分钟前
【开题答辩全过程】以 基于JavaWeb的家庭理财管理系统的设计与实现为例,包含答辩的问题和答案
java
plmm烟酒僧40 分钟前
TensorRT 推理 YOLO Demo 分享 (Python)
开发语言·python·yolo·tensorrt·runtime·推理
sailing-data1 小时前
【SE】接口标准化
java·开发语言
t***p9351 小时前
idea创建springBoot的五种方式
java
+VX:Fegn08951 小时前
计算机毕业设计|基于springboot+vue的学校课程管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·课程设计