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

news2024/11/24 15:44:27

文章目录

  • 一、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/478788.html

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

相关文章

【博学谷学习记录】超强总结,用心分享丨人工智能 AI项目 collate_fn函数理解与记录

目录 Dataloader取数据过程使用报错:默认collate_fn处理不同长度的数据自定义collate_fn伪代码示例 Dataloader取数据过程 取出大小等同于batch size的index列表;将列表列表中的index输入到dataset的getitem()函数中,取出该index对应的数据;对每个index…

一种基于坑位模版的分页方案

一. 概述 1.1 业务诉求 想象一个向用户展示数据的下拉列表,数据的来源有多种方式。支持在每一页都按固定的数据源类型及顺序展示。 1.2 业务场景 up主的主页展示带货商品列表 商品来源有多种:up主自选、官方推荐的、根据up主风格AI推荐用户推荐视频列表…

【编辑刷新数据-汽车品牌展示 Objective-C语言】

一、我们这个利用可重用cell展示汽车品牌案例,就说完了,然后我们再给大家说一个什么东西,就是这个刷新数据这个东西, 1.刷新数据这个东西,我们用的就是代理,再把代理相当于是再给大家复习一下,再把代理复习一下,顺便再说一下怎么刷新数据, 2.接下来,要实现一个什么功…

基于UDQ的并网单相逆变器控制【同步参考系下单相并网全桥正弦PWM逆变器闭环控制】(Simulink)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

day9 实现UDP通信

目录 socket函数拓展 UDP通信实现过程 代码实现 socket函数拓展 send与recv函数: /*用于发送数据*/ ssize_t send(int sockfd, const void *buf, size_t len,int flags);/*用于接收数据*/ ssize_t recv(int sockfd, void *buf, size_t len,int flags);/*前三个…

无敌0代码ESP8266接入homeassistant的新方法,完美解决新版homeassistant无法自定义MQTT设备的问题

记得之前想要在homeassistant中添加MQTT设备只要在配置文件 configuration.yaml 中配置如下代码即可 但是现在这种方法已经行不通,设备也步显示出来,这给很多homeassistant的忠实粉丝带来巨大不便,作为粉丝的一份子,我绝步允许这种…

Python进阶篇(四)-- ICMP Ping服务程序框架

Ping是一个网络应用程序,用于测试某个主机在IP网络中是否可访问。它也用于测试计算机的网卡或测试网络延迟。Ping的实现通常使用ICMP协议。ICMP协议在协议族中的地位如下图所示: 通过本文,你将更好地理解因特网控制报文协议(ICMP&…

TCP协议的特性

目录 TCP协议的特性TCP的首部长度2.TCP如何实现可靠传输2.1 确认应答 2.2 超时重传3.建立连接3.1 三次握手3.2 四次挥手 4.滑动窗口5.流量控制6.拥塞控制7.延时应答8.捎带应答9.面向字节流10.异常情况1.进程关闭 /进程崩溃2.主机关机(正常流程关机)3.主机掉电 TCP协议的特性 TC…

预训练模型之BERT、Transformer-XL、XL-Net等

文章目录 预训练模型(Pre-trained Models, PTMs)前置知识BERTTransformer-XLXLNetTransformer-XL类似工作(Scalable Transformer)1. 《Scaling Transformer to 1M tokens and beyond with RMT》2. 《》 预训练模型(Pre…

IPsec中IKE与ISAKMP过程分析(主模式-消息5和消息6)

IPsec中IKE与ISAKMP过程分析(主模式-消息1)_搞搞搞高傲的博客-CSDN博客 IPsec中IKE与ISAKMP过程分析(主模式-消息2)_搞搞搞高傲的博客-CSDN博客 IPsec中IKE与ISAKMP过程分析(主模式-消息3)_搞搞搞高傲的博客…

XML解析

XML在以后更多的是用来作为配置文件的。 一. 配置文件 什么是配置文件 用来保存程序在运行时需要的一些参数。 当配置信息比较复杂的时候&#xff0c;我们就可以用XML。 二. XML概述 三. XML的创建、语法规则 根标签就是写在最外面的标签。 <?xml version"1.0&quo…

[已成功]在mac上安装FFmpeg,详细全过程

记录一次痛苦的在mac上安装ffmpeg的过程 前言在 mac 上下载安装ffmpeg的试探之路1、从官方网站下载FFmpeg软件包2、选择用于macOS 64位的静态构建。这将使你重定向到evermeet.cx网站。3、通过 Homebrew 安装 FFmpeg3.1、在使用 Homebrew 安装的过程中可能会出现的问题3.1.1 墙的…

【MySQL】初识MySQL

数据库的重要性相信不需要我在这里着重强调了,这个专栏重点介绍的就是MySQL数据库,我所使用的版本为5.6,大致思路是先介绍MySQL的操作,然后再深入了解其底层原理,那就开始吧 目录 1.数据库相关概念2.MySQL数据模型3.SQL语法3.1 通用语法3.2 SQL语法分类3.3 DDL语句3.3.1数据库…

python读取与写入tif图片的完整信息

一、导入gdal包 在anconda环境下&#xff1a; conda install gdal 在其他环境下&#xff0c;去这个网站下载gdal包&#xff0c;直接使用pip install gdal是不行的 注意&#xff1a; 对于liunx用户&#xff0c;建议使用conda安装&#xff0c;对于win用户两者都可以。 使用方…

ChatGPT提示词工程(一):Guidelines准则

目录 一、说明二、安装环境三、Guidelines准则一&#xff1a;写出明确而具体的说明方法1&#xff1a;使用分隔符清楚地表示输入的不同部分方法2&#xff1a;用结构化输出&#xff1a;如直接要求它以HTML或者JSON格式输出方法3&#xff1a;请模型检查是否满足条件方法4&#xff…

深入理解计算机系统1--理解编译器编译的过程

前言 大家在学习C语言的时候&#xff0c;相信对编译器这个词并不会感到陌生。我们也会知道编译器编译的过程是&#xff1a;预处理-》编译-》汇编-》链接。这篇文章主要介绍这四个过程中&#xff0c;编译器究竟做了那些工作&#xff0c;它是如何让一份高级程序转换成机器语言的…

[EDA]AMP®-Parkinson‘s Disease Progression Prediction

​ 翻译自&#xff1a;AMP - EDA Models 1.数据集观察 加载四个excel文件 import pandas as pd train_clinical_data pd.read_csv(input/train_clinical_data.csv) train_peptides pd.read_csv(input/train_peptides.csv) train_protiens pd.read_csv(input/train_prote…

蓝桥杯算法竞赛系列第四章——二分算法

欢迎回到&#xff1a;遇见蓝桥遇见你&#xff0c;不负代码不负卿&#xff01; 目录 引入&#xff1a;二分查找 题目描述 题解 代码执行 复杂度分析 例题一&#xff1a;搜索插入位置 题目描述 题解 代码执行 复杂度分析 例题二&#xff1a;寻找峰值 题目描述 题解 …

【五一创作】python 基础系列篇:八、熟练掌握推导式

python 基础系列篇&#xff1a;八、熟练掌握推导式 推导式特殊的元组推导式 推导式机制玩转推导式小结 推导式 在python提供的各种语法糖中&#xff0c;老顾最青睐的就是这个推导式&#xff0c;他大大减少了代码的书写量。 比如一个正常的&#xff0c;生成长度为5的列表&…

红黑树的概念与实现

目录 ​一、红黑树的概念 1.什么是红黑树 2.红黑树满足的性质 3.红黑树存在的意义 二、红黑树的实现 1.类的构建 2.插入函数 &#xff08;1&#xff09;插入一个节点 &#xff08;2&#xff09;调整节点 &#xff08;3&#xff09;旋转 三、红黑树的检验 一、红黑树…