当前位置: 首页 > article >正文

Java 基础进阶篇(二)—— static 静态关键字与单例模式

文章目录

  • 一、static 静态关键字
    • 1.1 静态成员变量与实例成员变量
    • 1.2 静态成员方法与实例成员方法
    • 1.3 static 访问注意事项
    • 1.4 内存使用情况
  • 二、工具类
  • 三、代码块
  • 四、单例模式
    • 4.1 饿汉单例
    • 4.2 懒汉单例


一、static 静态关键字

static:代表静态的意思,可以修饰成员变量,可以修饰成员方法。

static 修饰方法之后称为 静态方法(类方法),修饰成员变量之后称为 静态成员变量(类变量)

static 修饰后的成员变量,可以被类的所有对象共享 (访问、修改)


1.1 静态成员变量与实例成员变量

静态成员变量实例成员变量
概述有 static 修饰,属于类,与类一起优先被加载,内存中只有一份,可以被共享访问无 static 修饰,属于对象,每个对象中都存在一份实例成员变量
场景如果信息要被共享,只需要一份就用,如:系统在线人数。属于每个对象,且每个对象的该信息不同时,如:nameage,money…
访问规则在这里插入图片描述在这里插入图片描述

注意: 同一个类中,访问静态成员可以省略类名不写。


1.2 静态成员方法与实例成员方法

静态成员方法实例成员方法
概述有 static 修饰,属于类,与类一起优先被加载一次,可以被共享访问无 static 修饰,属于对象,必须用对象触发访问
场景如果该方法是以执行一个通用功能为目的,或者需要方便访问。如表示对象自己的行为的,且方法中需要直接访问实例成员。
访问规则在这里插入图片描述在这里插入图片描述

注意: 同一个类中,访问静态成员方法可以省略类名不写。


1.3 static 访问注意事项

静态方法只能访问静态的成员,不可以直接访问实例成员
实例方法可以访问静态的成员,也可以访问实例成员
另外,静态方法中是不可以出现 this 关键字的。

在这里插入图片描述

public class Test {
    // 静态成员
    public static int onlineNumber = 10;
    // 实例成员
    private String name = "heima";

    /**
     * 静态方法
     */
    public static void fun1(){
        // 静态成员方法可以访问 静态成员
        System.out.println(Test.onlineNumber);
        System.out.println(onlineNumber);
        // System.out.println(name); // 报错
        
        // 静态成员方法不可以直接访问实例成员
        Test test = new Test();
        System.out.println(test.name); // 间接访问
		// System.out.println(this); // 报错
    }

    /**
     * 实例方法
     */
    public void fun2(){
        // 实例方法可以访问 实例成员
        System.out.println(this.name);
        System.out.println(name);

        // 实例方法可以访问 静态成员
        System.out.println(Test.onlineNumber);
        System.out.println(this.onlineNumber); // 不推荐
    }
}

1.4 内存使用情况

  1. 访问静态成员变量:与类一起优先加载。
    在这里插入图片描述
    在这里插入图片描述

  2. 访问静态成员方法:与类一起优先加载。
    在这里插入图片描述
    在这里插入图片描述


二、工具类

工具类里面都是静态方法,可以完成一个共用功能。

好处: 一次编写,处处可调,提高代码的复用,提高开发的效率。
注意:建议把工具类的构造器私有化,因为工具类无需对外创建对象,它的方法都是静态方法,直接用类名访问即可。


三、代码块

类的 5 大成分:成员变量、成员方法、构造器、代码块、内部类。

静态代码块 实例代码块
格式static {…}{…}
特点属于类,与类一起优先加载,自动触发执行一次。属于对象的,每次调用构造器构建对象前都会执行一次,再执行构造器。
作用可以用于在程序启动时,进行静态资源的初始化操作。可以用于初始化实例资源。

四、单例模式

单例模式: 可以保证系统中,应用该模式的这个类永远只有一个实例,即一个类永远只能创建一个对象。
例如:任务管理器对象我们只需要一个就可以解决问题了,这样可以节省内存空间。

4.1 饿汉单例

特点: 拿对象时,对象已经存在。
实现: ① 构造器私有 ② 定义静态成员变量存储一个对象。

/**
 * 使用 饿汉单例实现单例类
 */
public class SingleInstance {

    /**
     * 2. 饿汉单例是在获取对象前,对象已经提前准备好了一个
     *    这个对象只能是一个,所以定义静态成员变量记住。
     *    属于类,只被加载一次
     */
    public static SingleInstance instance = new SingleInstance();


    /**
     * 1. 必须把构造器私有化
     */
    private SingleInstance(){
    }
}

4.2 懒汉单例

特点: 要拿对象的时候,才开始创建一个对象。
实现: ① 构造器私有 ② 定义静态成员变量,暂时不存对象。

/**
 * 使用 懒汉单例实现单例类
 * 在真正需要该对象的时候,才去创建一个对象(延迟加载对象)
 */
public class SingleInstance2 {

    /**
     * 2. 定义一个静态的成员变量负责存储一个对象
     *    只加载一次,只有一份
     *    如果设置为 public 那么其他类可通过 SingleInstance2.instance 访问,访问结果是 null
     *    因此最好是私有化,避免挖坑
     */
    private static SingleInstance2 instance;

    /**
     * 3. 提供一个方法,对外返回单例对象
     */
    public static SingleInstance2 getInstance(){
        if(instance == null){
            instance = new SingleInstance2();
            return instance;
        }
        return instance;
    }

    /**
     * 1. 必须把构造器私有化
     */
    private SingleInstance2(){
    }
}

文章参考:Java入门基础视频教程,java零基础自学就选黑马程序员Java入门教程(含Java项目和Java真题)


http://www.kler.cn/news/17082.html

相关文章:

  • kafka 学习,笔记
  • Spring Boot参考指南-Spring Boot安装(Maven安装、Gradle安装)
  • Docker compose 常用指令
  • c++ 11标准模板(STL) std::vector (二)
  • 天气预报查询 API 提供个性化的天气服务的设计思路
  • 贪心刷题~
  • AI 时代,提示词便是生产力
  • ChatGPT AI使用成本
  • 【每日随笔】操控人性 ③ ( 懂领导的心思 | 办事的套路 | 管理学与权谋 | 人事谱系 )
  • HDU5552 Bus Routes(分治NTT)
  • 每天一道算法练习题--Day16 第一章 --算法专题 --- ----------哈夫曼编码和游程编码
  • SpringCloud:ElasticSearch之数据同步
  • 【实例展示通俗易懂】SQL中的内外连接、左右连接
  • Vue3+Element Plus环境搭建和一键切换明暗主题的配置
  • 【Latex】有关于Latex tabularray的一些很不错的教程、模板
  • LeetCode周赛复盘(第343场周赛)
  • isNotBlank 和isNotEmpty的区别
  • 网络安全 等级保护 网络设备、安全设备知识点汇总
  • Nachos系统的上下文切换
  • Latex 定理和证明类环境(amsthm)和(ntheorm)的区别
  • 每日一题142——最少操作使数组递增
  • 【Linux超强学习路线图】赶紧收藏学习!
  • 数据库管理-第七十二期 复盘(20230505)
  • 【TCP为什么需要粘包和拆包】
  • LeetCode_双指针_中等_24.两两交换链表中的节点
  • 使用dataFEED OPC Suite将西门子PLC数据转发至REST API
  • FL Studio21没有language选项?如何设置切换中文语言
  • 《论文阅读》开放域对话摘要(长文本|知识嵌入)
  • 《花雕学AI》31:ChatGPT--用关键词/咒语/提示词Prompt激发AI绘画的无限创意!
  • 题目:16版.饲养员喂养动物