Java基础13 面向对象~static关键字和单例模式

2024-09-04 20:38

本文主要是介绍Java基础13 面向对象~static关键字和单例模式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

超详细的Java知识点路线图


面向对象系列:
类和对象
封装
继承
多态
static关键字和单例模式
接口和内部类

前言

Hello,大家好,本章我们介绍两个知识点:static关键字和单例模式

static关键字

static的意思是静态,可以用来修饰类的属性和方法,一旦被static修饰的属性和方法,就会由类的所有对象共享,而不是属于某一个对象。

当某些属性和方法不想被对象调用时,就可以定义成静态的。

静态属性

语法:

static 类型 属性名;

静态属性的调用:

类名.属性名
也可以使用:对象名.属性
一般推荐使用类名调用静态成员

静态属性和非静态属性的区别

public class StaticTest {int count;public static void main(String[] args) {StaticTest t1 = new StaticTest();StaticTest t2 = new StaticTest();StaticTest t3 = new StaticTest();t1.count++;t2.count++;t3.count++;System.out.println(t1.count);System.out.println(t2.count);System.out.println(t3.count);}
}

输出结果都是1,如果将count定义为static的,输出结果为3,为什么?
总结:

  1. 静态的属性保存在方法区中,每个对象都共享这一个静态属性。
  2. 非静态的属性是由每个对象都有一个独立的副本。

非静态属性
在这里插入图片描述
静态属性
在这里插入图片描述

静态常量

开发过程中我们需要一些固定的数据,如:圆周率 3.1415926

public static final double PI = 3.1415926;

优点:

  1. 可读性高
  2. 提高数据的安全性
  3. 调用和维护方便

静态方法

定义:

public static 返回值类型 方法名(参数){
}

调用:

类名.方法名(参数)

注意:

  1. 静态方法中可以直接调用当前类的其它静态属性和方法
  2. 静态方法中不能直接调用当前类的非静态方法属性和方法
  3. 非静态方法中可以直接调用当前类的静态和非静态的属性和方法
  4. 静态方法中不能出现this和super关键字

Java中的各种工具类都大量使用静态方法,如:Arrays、Math等

静态代码块

语法:

static{代码块
}

作用:
对静态的成员进行初始化
特点:

  1. 静态代码块只执行一次
  2. 在类加载到内存后执行,是类中所有代码最先执行
  3. 在第一次使用类的使用调用

面试题:下面代码的执行结果

public class Test2 {//静态代码块static{System.out.println("这是静态代码块");}//非静态代码块{System.out.println("这是非静态代码块");}//构造方法public Test2(){System.out.println("这个构造方法");}public static void main(String[] args) {Test2 t1 = new Test2();Test2 t2 = new Test2();Test2 t3 = new Test2();}
}

在这里插入图片描述
执行顺序:

  1. 静态代码块(只执行一次)
  2. 非静态代码块(每个对象执行一次)
  3. 构造方法(每个对象执行一次)

静态导入

jdk1.5的特性,导入某个类的静态方法后,可以不通过类名直接调用

//静态导入
import static java.util.Arrays.sort;public class Test3 {public static void main(String[] args) {int[] array = {3,5,7,8,2};//直接调用sort(array);for(int n : array){System.out.println(n);}}
}

单例模式

设计模式是前人针对不同的应用需求总结一套解决方案,常见的设计模式有23种,也称为GOF23。
单例模式属于GOF23中的创建性模式,作用是:保证一个类只能创建一个实例

单例模式的应用场景

  1. 某些业务场景,如:公司只有一个老板
  2. 减少大型对象对系统资源的消耗,如:连接池、线程池

如何实现单例模式

步骤:

  1. 将构造方法定义成private的
  2. 在单例类的内部定义一个该类的静态对象
  3. 定义一个静态方法用于返回静态对象

单例的分类

单例模式分为:饿汉式和懒汉式
区别是:

  • 饿汉式,一开始就创建对象
    优点:代码简洁
    缺点:如果方法没有调用,就浪费了内存
  • 懒汉式,开始不创建对象,当方法被调用后,再创建对象
    优点:内存的分配更高效
    缺点:有线程安全问题

饿汉式

/*** 单例*/
public class Singleton {//静态对象private static Singleton instance = new Singleton();//私有构造方法private Singleton(){}//返回对象public static Singleton getInstance(){return instance;}public static void main(String[] args) {Singleton s1 = Singleton.getInstance();Singleton s2 = Singleton.getInstance();Singleton s3 = Singleton.getInstance();System.out.println(s1 == s2);System.out.println(s2 == s3);}
}

懒汉式

//静态对象
private static Singleton instance = null;//返回对象
public static Singleton getInstance(){if(instance == null){instance = new Singleton();}return instance;
}

在这里插入图片描述

结束

好了,本文内容就是这么多,欢迎大家留言讨论


大家如果需要学习其他Java知识点,戳这里 超详细的Java知识点汇总

这篇关于Java基础13 面向对象~static关键字和单例模式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1136978

相关文章

Java数组初始化的五种方式

《Java数组初始化的五种方式》数组是Java中最基础且常用的数据结构之一,其初始化方式多样且各具特点,本文详细讲解Java数组初始化的五种方式,分析其适用场景、优劣势对比及注意事项,帮助避免常见陷阱... 目录1. 静态初始化:简洁但固定代码示例核心特点适用场景注意事项2. 动态初始化:灵活但需手动管理代

Java使用SLF4J记录不同级别日志的示例详解

《Java使用SLF4J记录不同级别日志的示例详解》SLF4J是一个简单的日志门面,它允许在运行时选择不同的日志实现,这篇文章主要为大家详细介绍了如何使用SLF4J记录不同级别日志,感兴趣的可以了解下... 目录一、SLF4J简介二、添加依赖三、配置Logback四、记录不同级别的日志五、总结一、SLF4J

将Java项目提交到云服务器的流程步骤

《将Java项目提交到云服务器的流程步骤》所谓将项目提交到云服务器即将你的项目打成一个jar包然后提交到云服务器即可,因此我们需要准备服务器环境为:Linux+JDK+MariDB(MySQL)+Gi... 目录1. 安装 jdk1.1 查看 jdk 版本1.2 下载 jdk2. 安装 mariadb(my

SpringBoot中配置Redis连接池的完整指南

《SpringBoot中配置Redis连接池的完整指南》这篇文章主要为大家详细介绍了SpringBoot中配置Redis连接池的完整指南,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以... 目录一、添加依赖二、配置 Redis 连接池三、测试 Redis 操作四、完整示例代码(一)pom.

Java 正则表达式URL 匹配与源码全解析

《Java正则表达式URL匹配与源码全解析》在Web应用开发中,我们经常需要对URL进行格式验证,今天我们结合Java的Pattern和Matcher类,深入理解正则表达式在实际应用中... 目录1.正则表达式分解:2. 添加域名匹配 (2)3. 添加路径和查询参数匹配 (3) 4. 最终优化版本5.设计思

Java使用ANTLR4对Lua脚本语法校验详解

《Java使用ANTLR4对Lua脚本语法校验详解》ANTLR是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件,下面就跟随小编一起看看Java如何使用ANTLR4对Lua脚本... 目录什么是ANTLR?第一个例子ANTLR4 的工作流程Lua脚本语法校验准备一个Lua Gramm

Java字符串操作技巧之语法、示例与应用场景分析

《Java字符串操作技巧之语法、示例与应用场景分析》在Java算法题和日常开发中,字符串处理是必备的核心技能,本文全面梳理Java中字符串的常用操作语法,结合代码示例、应用场景和避坑指南,可快速掌握字... 目录引言1. 基础操作1.1 创建字符串1.2 获取长度1.3 访问字符2. 字符串处理2.1 子字

Java Optional的使用技巧与最佳实践

《JavaOptional的使用技巧与最佳实践》在Java中,Optional是用于优雅处理null的容器类,其核心目标是显式提醒开发者处理空值场景,避免NullPointerExce... 目录一、Optional 的核心用途二、使用技巧与最佳实践三、常见误区与反模式四、替代方案与扩展五、总结在 Java

Android Mainline基础简介

《AndroidMainline基础简介》AndroidMainline是通过模块化更新Android核心组件的框架,可能提高安全性,本文给大家介绍AndroidMainline基础简介,感兴趣的朋... 目录关键要点什么是 android Mainline?Android Mainline 的工作原理关键

基于Java实现回调监听工具类

《基于Java实现回调监听工具类》这篇文章主要为大家详细介绍了如何基于Java实现一个回调监听工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录监听接口类 Listenable实际用法打印结果首先,会用到 函数式接口 Consumer, 通过这个可以解耦回调方法,下面先写一个