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中ArrayList和LinkedList有什么区别举例详解

《Java中ArrayList和LinkedList有什么区别举例详解》:本文主要介绍Java中ArrayList和LinkedList区别的相关资料,包括数据结构特性、核心操作性能、内存与GC影... 目录一、底层数据结构二、核心操作性能对比三、内存与 GC 影响四、扩容机制五、线程安全与并发方案六、工程

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

Spring AI集成DeepSeek的详细步骤

《SpringAI集成DeepSeek的详细步骤》DeepSeek作为一款卓越的国产AI模型,越来越多的公司考虑在自己的应用中集成,对于Java应用来说,我们可以借助SpringAI集成DeepSe... 目录DeepSeek 介绍Spring AI 是什么?1、环境准备2、构建项目2.1、pom依赖2.2

Spring Cloud LoadBalancer 负载均衡详解

《SpringCloudLoadBalancer负载均衡详解》本文介绍了如何在SpringCloud中使用SpringCloudLoadBalancer实现客户端负载均衡,并详细讲解了轮询策略和... 目录1. 在 idea 上运行多个服务2. 问题引入3. 负载均衡4. Spring Cloud Load

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

在 Spring Boot 中使用 @Autowired和 @Bean注解的示例详解

《在SpringBoot中使用@Autowired和@Bean注解的示例详解》本文通过一个示例演示了如何在SpringBoot中使用@Autowired和@Bean注解进行依赖注入和Bean... 目录在 Spring Boot 中使用 @Autowired 和 @Bean 注解示例背景1. 定义 Stud

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为

0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型的操作流程

《0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeekR1模型的操作流程》DeepSeekR1模型凭借其强大的自然语言处理能力,在未来具有广阔的应用前景,有望在多个领域发... 目录0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型,3步搞定一个应