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

news2024/11/24 9:24:35

文章目录

  • 一、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.coloradmin.cn/o/479290.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

KaliLinux安装burpsuite(超详细)

注意事项 1.注意linux位数 安装jdk之前先输出uname -a,看看kali linux是32位的还是64位,例如此处我的kali是32位的,因此需下载的是32位的jdk 2.jdk版本 jdk版本最好是oracle的,若使用的是openjdk很可能会出现burpsuite闪退现象…

远程访问本地jupyter notebook服务 - 无公网IP端口映射

文章目录 前言视频教程1. Python环境安装2. Jupyter 安装3. 启动Jupyter Notebook4. 远程访问4.1 安装配置cpolar内网穿透4.2 创建隧道映射本地端口 5. 固定公网地址 转载自远控源码文章:公网远程访问jupyter notebook【cpolar内网穿透】 前言 Jupyter Notebook&am…

【Linux】信号的保存信号的捕捉信号集零碎知识点总结

【Linux】信号的保存&信号的捕捉&信号集&零碎知识点总结 一、信号的保存1.1 信号几种概念1.2 信号在内核中的表示 二、信号的捕捉了解用户态和内核态2.1 捕捉过程2.2 信号的捕捉方法2.3 信号捕捉规则2.4 多信号屏蔽问题 三、信号集3.1 概念3.2 信号集(s…

【视频教程解读】Window上安装和使用autogluon V0.7

1.使用conda安装的python环境 教程使用的是极简版miniconda,由于我们的电脑中安装了anaconda,所以不需要进行进一步安装。python版本为3.9,博客里面有anaconda和python版本的对应关系。注意查看版本autogluon V0.4需要3.8或者3.9和3.10,pip版…

2023年第二十届五一数学建模B题:快递需求分析问题-思路详解

一、题目简析 今年的B题是一道较为综合的题目,包括了数据分析、综合评价、时间序列预测、最优化问题以及概率估计问题。考察范围广,但是整体看来题目背景简单,切入点多,难度适中。 二、逐问思路 1.问题1:附件1为该快…

私有GitLab仓库 - 本地搭建GitLab私有代码仓库并随时远程访问「内网穿透」

文章目录 前言1. 下载Gitlab2. 安装Gitlab3. 启动Gitlab4. 安装cpolar内网穿透5. 创建隧道配置访问地址6. 固定GitLab访问地址6.1 保留二级子域名6.2 配置二级子域名 7. 测试访问二级子域名 转载自远控源码文章:Linux搭建GitLab私有仓库,并内网穿透实现公…

迷你主机安装openwrt软路由系统(附启动盘制作教程+ISO、IMG镜像文件)

之前在迷你主机上刷了一个openwrt的软路由,安装过程分享给大家,镜像文件在文章末尾~ 一般需要做软路由系统的机器,是需要至少两个网口的,一个做wan口,一个做lan口 由于其他因素,不能直接将openwrt直接安装…

ChatGPT是什么?ChatGPT里的G、P、T分别指什么

文章目录 ChatGPT是什么GTP中的 生成式 是什么意思GTP中的 预训练 是什么意思GTP中的 变换模型 是什么意思 什么是Transformer什么是注意力机制 监督学Xi、无监督学Xi、强化学Xi ChatGPT是什么 GPT: Generative Pre-trained Transformer 生成式预训练变换模型 ChatGPT是由Ope…

学习RHCSA的day.02

目录 2.3常用简单命令 2.4使用Bash执行命令 2.5 命令帮助 2.3常用简单命令 常用系统工作命令 1、echo命令 echo命令用于在终端设备上输出字符串或变量提取后的值,语法格式为:“echo [字符串] [$变量]”。 这是在Linux系统中最常用的几个命令之一&am…

蒙蒂霍尔悖论

贝叶斯与频率主义对蒙蒂霍尔问题的解 在定义概率时,通常有两种思想流派:贝叶斯主义和频率主义。前者将概率视为我们对事件发生的信念程度,而后者则将其视为事件发生的相对频率。这篇文章介绍了使用贝叶斯和频率主义方法来解决著名的蒙蒂霍尔问…

C++每日一练:小艺照镜子(详解分治法)

文章目录 前言一、题目二、解题1.分析 总结 前言 大过节的,不想去看人后脑勺,就做点题来玩。挑了小艺照镜子,百分通过~ 提示:以下是本篇文章正文内容,下面案例可供参考 一、题目 题目名称: 小艺照镜子 …

【论文解读】(如何微调BERT?) How to Fine-Tune BERT for Text Classification?

文章目录 论文信息1. 论文内容2. 论文结论2.1 微调流程2.2 微调策略(Fine-Tuning Strategies)2.3 Further Pretrain 3. 论文实验介绍3.1 实验数据集介绍3.2 实验超参数3.3 Fine-Tuning策略探索3.3.1 处理长文本3.3.2 不同层的特征探索3.3.3 学习率探索(灾难性遗忘探…

Baumer工业相机堡盟相机如何使用ROI感兴趣区域功能( PARTIAL SCAN ROI功能的优点和行业应用)(C#)

项目场景 Baumer工业相机堡盟相机是一种高性能、高质量的工业相机,可用于各种应用场景,如物体检测、计数和识别、运动分析和图像处理。 Baumer的万兆网相机拥有出色的图像处理性能,可以实时传输高分辨率图像。此外,该相机还具…

利用 ChatGPT4 回复的 markdown 文本生成 ppt

本篇博文不涉及账号以及基础网络知识,大伙可以自动搜索。 比如我最近要分享一篇关于 TCP 的分享,那么我可以设置如下 Prompt 我最近要做一篇关于 tcp 入门的 ppt 分享,帮我列出大纲以及需要注意的事项? 接下来就是 ChatGPT4 给…

RocketMQ的学习历程(3)----RocketMQ部署(docker版)

RocketMQ部署(docker版) 1. 部署开始前的准备 一台linux机器。(我这里使用的是阿里云的一个centos7的服务器)docker环境以及相关的简单知识。一些计算机网络的简单知识。(可以帮你透彻了解为什么这么部署) docker部署十分简单快捷…

JAVA85-135

JAVA85-135 字符集详解解码与编码方法 字符流FileWriter 拷贝文件夹字节缓冲流拷贝文件(一次读写一个字节)字节缓冲流拷贝文件(一次读写一个字节数组) 字符缓冲流控制软件运行次数 序列化流反序列化流/对象操作输入流打印流字节打…

macOS Monterey 12.6.5 (21G531) OC 0.9.1 / Cl 5151 / PE 三分区原版黑苹果镜像

苹果近期发布了 macOS Big Sur 11.7.6 和 macOS Monterey 12.6.5 更新,本次更新重点修复了标记为 CVE-2023-28206 的漏洞,在 macOS 13.3.1 更新中已修复,推荐大家安装升级。 镜像下载: macOS Monterey 12.6.5 (21G531) 三分区原版…

【面试】嵌入式C语言题目整理

【面试】嵌入式C语言题目整理 描述内存四区。 内存四区分为:代码区、静态区、堆区、栈区 代码区就是用来存放代码的。 静态区用来存放全局变量、静态变量、常量(字符串常量、const修饰的全局变量)。 堆区中的内存是由程序员自己申请和释放的&…

《高性能MySQL》读书笔记

《高性能MySQL》 第一章 MySQL架构与历史第二章 MySQL基准测试第三章 服务器性能剖析第四章 Schema与数据类型优化第五章 创建高性能的索引第六章 查询性能优化第七章 MySQL高级特性第八章 优化服务器设置第九章 操作系统与硬件优化第十章 复制第十一章 可扩展的MySQL第十二章 …

sed进阶之多行命令

shell脚本编程系列 前面使用sed编辑器的基础命令时,所有的命令都是针对单行数据执行操作的。在sed编辑器读取数据流时,它会根据换行符的位置将数据分成行。sed编辑器会根据定义好的脚本命令,一次处理一行数据,然后移到下一行重复这…