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)简单定义-什么是

Redis Cluster模式配置

《RedisCluster模式配置》:本文主要介绍RedisCluster模式配置,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录分片 一、分片的本质与核心价值二、分片实现方案对比 ‌三、分片算法详解1. ‌范围分片(顺序分片)‌2. ‌哈希分片3. ‌虚

SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志

《SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志》在SpringBoot项目中,使用logback-spring.xml配置屏蔽特定路径的日志有两种常用方式,文中的... 目录方案一:基础配置(直接关闭目标路径日志)方案二:结合 Spring Profile 按环境屏蔽关

Java使用HttpClient实现图片下载与本地保存功能

《Java使用HttpClient实现图片下载与本地保存功能》在当今数字化时代,网络资源的获取与处理已成为软件开发中的常见需求,其中,图片作为网络上最常见的资源之一,其下载与保存功能在许多应用场景中都... 目录引言一、Apache HttpClient简介二、技术栈与环境准备三、实现图片下载与保存功能1.

SpringBoot排查和解决JSON解析错误(400 Bad Request)的方法

《SpringBoot排查和解决JSON解析错误(400BadRequest)的方法》在开发SpringBootRESTfulAPI时,客户端与服务端的数据交互通常使用JSON格式,然而,JSON... 目录问题背景1. 问题描述2. 错误分析解决方案1. 手动重新输入jsON2. 使用工具清理JSON3.

java中long的一些常见用法

《java中long的一些常见用法》在Java中,long是一种基本数据类型,用于表示长整型数值,接下来通过本文给大家介绍java中long的一些常见用法,感兴趣的朋友一起看看吧... 在Java中,long是一种基本数据类型,用于表示长整型数值。它的取值范围比int更大,从-922337203685477

java Long 与long之间的转换流程

《javaLong与long之间的转换流程》Long类提供了一些方法,用于在long和其他数据类型(如String)之间进行转换,本文将详细介绍如何在Java中实现Long和long之间的转换,感... 目录概述流程步骤1:将long转换为Long对象步骤2:将Longhttp://www.cppcns.c

SpringBoot集成LiteFlow实现轻量级工作流引擎的详细过程

《SpringBoot集成LiteFlow实现轻量级工作流引擎的详细过程》LiteFlow是一款专注于逻辑驱动流程编排的轻量级框架,它以组件化方式快速构建和执行业务流程,有效解耦复杂业务逻辑,下面给大... 目录一、基础概念1.1 组件(Component)1.2 规则(Rule)1.3 上下文(Conte

SpringBoot服务获取Pod当前IP的两种方案

《SpringBoot服务获取Pod当前IP的两种方案》在Kubernetes集群中,SpringBoot服务获取Pod当前IP的方案主要有两种,通过环境变量注入或通过Java代码动态获取网络接口IP... 目录方案一:通过 Kubernetes Downward API 注入环境变量原理步骤方案二:通过

Springboot整合Redis主从实践

《Springboot整合Redis主从实践》:本文主要介绍Springboot整合Redis主从的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言原配置现配置测试LettuceConnectionFactory.setShareNativeConnect