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

news2024/12/23 1:22:13

文章目录

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

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

相关文章

Java 基础进阶篇(六)—— 接口详解

文章目录 一、接口概述二、接口的基本使用三、接口从 JDK 8 开始新增的方法四、接口的注意事项(了解)补充:接口与接口的关系 一、接口概述 规范的基本特征是约束和公开。 接口就是一种规范,其约束别人必须干什么事情。 所以&…

【五一创作】Matlab 绘制风速、风向统计玫瑰花图【优化】

在之前,有个博客专门讲matlab 绘制风速、风向统计玫瑰花图;这里面存在不少细节问题,目前对该部分代码做了优化。以前的博客链接见下: Matlab 绘制风速、风向统计玫瑰花图 最近接了一个任务,需要绘制风速、风向的统计玫…

Java 基础进阶篇(五)—— 抽象类与模板方法设计模式

文章目录 一、抽象类、抽象方法概述二、抽象类的特征三、模板方法设计模式3.1使用场景3.2 实现步骤3.3 写作文案例 补充:final 和 abstract 是什么关系? 一、抽象类、抽象方法概述 在 Java 中 abstract 是抽象的意思,可以修饰类、成员方法。 abstract …

Java 基础进阶篇(七)—— 面向对象三大特征之三:多态

文章目录 一、多态的概述二、多态中成员访问特点 ★三、多态的优势与劣势四、多态下的类型转换4.2 自动类型转换(从子到父)4.2 强制类型转换(从父到子)4.3 instanceof 关键字 一、多态的概述 多态:是指执行同一个行为…

Java 基础进阶篇(四)—— 权限修饰符、final 关键字与枚举

文章目录 一、权限修饰符二、final 关键字2.1 final 作用2.2 final 修饰变量举例2.3 常量 三、枚举3.1 枚举的格式3.2 枚举的特征3.3 枚举的应用 一、权限修饰符 权限修饰符 用于约束成员变量、构造器、方法等的访问范围。 权限修饰符: 有四种作用范围由小到大 (p…

Java 基础进阶篇(三)—— 面向对象的三大特征之二:继承

文章目录 一、继承概述二、内存运行原理 ★三、继承的特点四、继承后:成员变量和方法的访问特点五、继承后:方法重写六、继承后:子类构造器的特点七、继承后:子类构造器访问父类有参构造器八、this、super 总结 一、继承概述 Jav…

机器学习之利用SMO算法求解支持向量机—基于python

大家好,我是带我去滑雪! 本期将讨论支持向量机的实现问题,我们知道支持向量机的学习问题可以化为求解凸二次规划问题。这样的凸二次规划问题具有全局最优解,并且有许多最优化算法可以用于这一问题的求解。但是当训练样本容量很大…

【C++】 探索程序 详细解读程序在运行过程中都发生了什么

目录 头文件-源代码 头文件重复包含 问题 解决方案 程序生成过程 预处理Preprocessi 编译Compilation 汇编Assembly 链接Linking 编译期-运行期 编译期确定 运行期确定 编译期错误 运行期错误 类和对象 宏 宏的其他用法 inline内联 头文件-源代码 头文件&…

Vue简介和常用指令

概述: MVVM思想:视图层数据和数据模型里面的数据发生变化都会影响到另一边的数据,通过ViewModel自动实现。 Vue入门案例 步骤: 上面提到了数据模型和试图层的数据是关联的,此处数据模型里面el的值就是选择了哪一个视…

jQuery引入----练习

jQuery引入----练习 html <!DOCTYPE html> <html><head><title>jQuery引入</title><!-- css样式引入 --><link rel"stylesheet" href"../css/a.css"><!-- jquery函数库引入 --><script type"tex…

Linux基础IO【深入理解文件系统】

✨个人主页&#xff1a; 北 海 &#x1f389;所属专栏&#xff1a; Linux学习之旅 &#x1f383;操作环境&#xff1a; CentOS 7.6 阿里云远程服务器 文章目录 &#x1f307;前言&#x1f3d9;️正文1、磁盘文件2、磁盘概念2.1、基本结构2.2、数据存储 3、磁盘信息3.1、分区意义…

【C++初阶】类与对象:6大默认成员函数------拷贝构造和赋值运算符重载

一.拷贝构造函数 A.概念 拷贝构造函数&#xff1a;只有单个形参&#xff0c;该形参是对本类类型对象的引用(一般常用const修饰)&#xff0c;在用已存在的类类型对象创建新对象时由编译器自动调用。 B.特性 1. 拷贝构造函数是构造函数的一个重载形式&#xff1b; 2. 拷贝构造函…

shell的基础学习二

文章目录 一、Shell 数组二、Shell 基本运算符三、Shell echo命令四、Shell printf 命令五、Shell test 命令总结 一、Shell 数组 数组中可以存放多个值。Bash Shell 只支持一维数组&#xff08;不支持多维数组&#xff09;&#xff0c;初始化时不需要定义数组大小&#xff08…

【五一创作】【Simulink】基于FCS-MPC的三相并网逆变器控制(Stateflow)

上次写了一篇【Simulink】基于FCS-MPC的三相并网逆变器控制&#xff08;Matlab Function&#xff09;&#xff0c;控制部分用 Matlab Function 写的&#xff0c;因实验室一般用 Stateflow&#xff0c;所以这篇把 Matlab Function 改成 Stateflow. 原理 电路原理图&#xff1a;…

如何批量查询快递的签收状态?

如果一次性网购大量快递&#xff0c;我们就得经常进入快递或网购平台查询物流&#xff0c;随时查看快递单号的物流状态。如果快递公司少&#xff0c;查询起来比较容易&#xff0c;但是如果快递公司很多&#xff0c;每次都要人工查询就是一件很麻烦的事情了。今天&#xff0c;小…

数据库相关知识

一.1 数据库 与Sybase不同&#xff0c;一个用户就对应于一个数据库。 create user CBMAIN identified by "sunline" default tablespace CBMAIN_DATA  -- 表空间 temporary tablespace CBMAIN_TEMP; -- 临时表空间 一.2 表空间 表空间由一个或多个物理文件组成&…

js使用splice方法删除数组元素可能导致的问题

splice() 方法通过删除或替换现有元素或者原地添加新的元素来修改数组&#xff0c;并以数组形式返回被修改的内容。此方法会改变原数组。 JavaScript 遍历数组并通过 splice 方法删除该数组符合某些条件的元素将会导致哪些问题&#xff1f; 导致的问题 当使用 splice 方法从 …

QT 中的多线程之继承 Thread

文章目录 1. 概述2. UML 类的关系图3. 代码&#xff1a;4. 运行结果及说明5. 结语 1. 概述 任何继承于QThread的线程都是通过继承 QThread 的run函数来实现多线程的&#xff0c;因此&#xff0c;必须重写QThread的run函数&#xff0c;把复杂逻辑写在QThread的run函数中。然后在…

effective c++ item40-44

item40:谨慎的使用多重继承 多重继承带来的符号的歧义性 #include <iostream> #include <vector> using namespace std; class A { public:void f() { cout << "A" << endl; } }; class B { private:void f(); }; class C : public A, publ…

5.5.1哈夫曼树

知识总览&#xff1a; 概念&#xff1a; 结点的权&#xff1a;有某种现实含义的数值&#xff08;如&#xff1a;表示结点的重要性&#xff09; 结点的带权路径长度&#xff1a;从树的根到该结点的路径长度&#xff08;经过的边数&#xff09;与该结点上权值的乘积。 就比如说要…