java-单列模式-final-继承-多态

news2025/3/12 6:52:45

内存存储区域

引用变量和普通变量引用变量放在栈中,基本数据类型的内容是在堆内存中。
对象放在堆内存中,其引用变量放在栈中,指向堆内存存放对象的地址。
静态变量放在静态区中,静态变量在程序的执行始中中分配一次,但可改变值,常可作计数器用。
在这里插入图片描述

单例模式

什么是单例模式
      单例模式指的是在应用整个生命周期内只能存在一个实例。单例模式是一种被广泛使用的设计模式。他有很多好处,能够避免实例对象的重复创建,减少创建实例的系统开销,节省内存。

单例模式和静态类的区别
      首先理解一下什么是静态类,静态类就是一个类里面都是静态方法和静态field,构造器被private修饰,因此不能被实例化。Math类就是一个静态类。

Math类:
public static final double PI = 3.14159265358979323846;

知道了什么是静态类后,来说一下他们两者之间的区别:
1)首先单例模式会提供给你一个全局唯一的对象,静态类只是提供给你很多静态方法,这些方法不用创建对象,通过类就可以直接调用;

2)单例模式的灵活性更高,方法可以被override,因为静态类都是静态方法,所以不能被override;

3)如果是一个非常重的对象,单例模式可以懒加载,静态类就无法做到;

      那么时候时候应该用静态类,什么时候应该用单例模式呢?首先如果你只是想使用一些工具方法,那么最好用静态类,静态类比单例类更快,因为静态的绑定是在编译期进行的。如果你要维护状态信息,或者访问资源时,应该选用单例模式。还可以这样说,当你需要面向对象的能力时(比如继承、多态)时,选用单例类,当你仅仅是提供一些方法时选用静态类。
如何实现单例模式

  1. 饿汉模式
       所谓饿汉模式就是立即加载,一般情况下再调用getInstancef方法之前就已经产生了实例,也就是在类加载的时候已经产生了。这种模式的缺点很明显,就是占用资源,当单例类很大的时候,其实我们是想使用的时候再产生实例。因此这种方式适合占用资源少,在初始化的时候就会被用到的类。
class SingletonHungary {
    private static SingletonHungary singletonHungary = new SingletonHungary();
    //将构造器设置为private禁止通过new进行实例化
    private SingletonHungary() {

    }
    public static SingletonHungary getInstance() {
        return singletonHungary;
    }
}

懒汉模式
      懒汉模式就是延迟加载,也叫懒加载。在程序需要用到的时候再创建实例,这样保证了内存不会被浪费。针对懒汉模式,我们暂时给出了1种最简单实现方式,有线程安全的问题,我们在学习多线程后,在完善这里的写法:

class SingletonLazy1 {
    private static SingletonLazy1 singletonLazy;
    private SingletonLazy1() {
    }
    public static SingletonLazy1 getInstance() {
        if (null == singletonLazy) {
            singletonLazy = new SingletonLazy1();
        }
        return singletonLazy;
    }
}

      学到这里,你可能会对设计模式感到难以理解,单列模式其实就是一种最常用的设计模式。
      设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。
   现阶段的你,我的意见或者经验就是,不懂先记住,留待以后随着学习的知识越来越多,越来越深入后慢慢理解!

final,static关键字

      final表面意思就是不可更改的,恒量的意思;指的是无法改变的量,这与静态标量static是有区别的,静态变量指的是只有一份存储空间,值是可以改变的。使用final一定原因是出于软件设计的角度,因为别人看到final这个关键字就知道是什么意思,达到心领神会的效果,但也正是由于这种"语义"的存在,在程序设计中要谨慎使用,以免误用。

在Java中final修饰的就是常量,而且变量名要大写;
Math类:
public static final double PI = 3.14159265358979323846;
......java源码中好多变量都用final修饰

final的作用
final根据修饰位置的不同作用也不相同,针对三种情况:

  1. 修饰变量,被final修饰的变量必须要初始化,赋初值后不能再重新赋值。注意:局部变量不在我们讨论的范畴,因为局部变量本身就有作用范围,不使用private、public等词修饰。虽然final可以修饰局部变量,但是一般情况下,我们在实际应用中几乎不会这么干!没多大的意义!
  2. 修饰方法,被final修饰的方法代表不能重写。
  3. 修饰类,被final修饰的类,不能够被继承。
    注意:final修饰的类,类中的所有成员方法都被隐式地指定为final方法。

final修饰变量
      被final修饰的变量必须显示的初始化,初始化可以以三种方式:1)定义时初始化,2)在构造器中设置值,3)在非静态块中为final实例变量设置值。
      final修饰变量指的是:这个变量被初始化后便不可改变,这里不可改变的意思对基本类型来说是其值不可变,而对于对象变量来说其引用不可变,即不能再指向其他的对象。

public class FinalTest {
	     //直接赋值
		 final int x1= 10000;
		    final int x2;
		    final int x3;
		 //初始化块中  
		   {
		       x2 = 20000;
		    }
		  //构造器中  
		 public FinalTest() {
		    this.x3 = 3000;
		  }
	

}

在这里插入图片描述
final和static的区别
      static作用于成员变量用来表示只保存一份副本,而final的作用是用来保证变量不可变,看一下例子:

public class Test {
    public static void main(String[] args)  {
        MyClass myClass1 = new MyClass();
        MyClass myClass2 = new MyClass();
        System.out.println(myClass1.i);
        System.out.println(myClass1.j);
        System.out.println(myClass2.i);
        System.out.println(myClass2.j);
        //myClass1.i = 1233; //这里不可以改的
 
    }
}
class MyClass {
    public final double i = Math.random();
    public static double j = Math.random();
}
--------------------------------------------------------------------
//由于i是两个对象的成员,所以值不一样,并不是说它可以改final变量
//j是程序一加载到JVM中,只初始分配一次,后面不管创建多少对象,都是共享这一块内存
0.2356062719054033
0.7981894049184048
0.7240468555989844
0.7981894049184048

基于final和static的特性,我们往往在实际的程序开发中,需要要给全局范围内的常数,一般定义为:如

public static final int CHANGSHU=100;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2313623.html

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

相关文章

基于杀伤链的勒索软件控制框架

40s说清楚勒索软件如何工作 基于杀伤链的勒索软件控制框架开发了4种缓解策略(预防、阻止、检测&响应、重建),覆盖18个控制域90项控制措施,以正确管理与勒索软件攻击杀伤链各阶段相关的风险。 注:本文节选出自《基于杀伤链的勒索软件防御指…

Windows编程----结束进程

进程有启动就有终止,通过CreateProcess函数可以启动一个新的子进程,但是如何终结子进程呢?主要有四种方法: 通过主线程的入口函数(main函数、WinMain函数)的return关键字终止进程 一个应用程序只有一个入…

无标签数据增强+高效注意力GAN:基于CARLA的夜间车辆检测精度跃升

目录 一、摘要 二、引言 三、框架 四、方法 生成合成夜间数据 昼夜图像风格转换 针对夜间图像的无标签数据增强技术 五、Coovally AI模型训练与应用平台 六、实验 数据 图像风格转换 夜间车辆检测和分类 结论 论文题目:ENHANCING NIGHTTIME VEHICLE D…

SqlSugar 进阶之原生Sql操作与存储过程写法 【ORM框架】

系列文章目录 🎀🎀🎀 .NET开源 ORM 框架 SqlSugar 系列 🎀🎀🎀 文章目录 系列文章目录一、前言 🍃二、用法介绍三、方法列表四、使用案例五、调用存储过程六、in参数用法七、SqlServer带Go的脚…

NO.33十六届蓝桥杯备战|函数|返回值|声明|调用|引用|函数重载(C++)

返回值 我们在设计的函数的时候,函数在经过计算后,有时候需要带回⼀些计算好的数据,这时候往往使⽤return 来返回,这⾥我们就讨论⼀下使⽤ return 返回。 return 后边可以是⼀个数值,也可以是⼀个表达式,…

5G工业路由器赋能无人码头,港口物流智能化管理

全球贸易发展促使港口需提升运营效率,传统港口面临诸多难题,无人码头成为转型关键方向。5G 工业路由器为其提供有力通信支持,引领港口物流变革。 随着无人码头建设在全球兴起,如荷兰鹿特丹港、中国上海洋山港等。码头作业设备需实…

【Academy】OAuth 2.0 身份验证漏洞 ------ OAuth 2.0 authentication vulnerabilities

OAuth 2.0 身份验证漏洞 ------ OAuth 2.0 authentication vulnerabilities 1. 什么是 OAuth?2. OAuth 2.0 是如何工作的?3. OAuth 授权类型3.1 OAuth 范围3.2 授权代码授权类型3.3 隐式授权类型 4. OAuth 身份验证4.1 识别 OAuth 身份验证4.2 侦察OAuth…

有关Java中的多线程

学习目标 ● 掌握线程相关概念 ● 掌握线程的基本使用 ● 掌握线程池的使用 ● 了解解决线程安全方式 1.为什么要学习线程? ● 从1946年2月14日世界上第一台计算机在美国宾夕法尼亚大学诞生到今天,计算和处理的模式早已从单用户单任务的串行模式发展到了多用户多…

【eNSP实战】配置交换机端口安全

拓扑图 目的:让交换机端口与主机mac绑定,防止私接主机。 主机PC配置不展示,按照图中配置即可。 开始配置之前,使用PC1 ping 一遍PC2、PC3、PC4、PC5,让交换机mac地址表刷新一下记录。 LSW1查看mac地址表 LSW1配置端…

LLMs基础学习(一)概念、模型分类、主流开源框架介绍以及模型的预训练任务

文章目录 LLM基础学习(一)一、大语言模型(LLMs)的简单介绍定义与基本信息核心特点局限性参考的模型 二、大语言模型(LLMs)名称后 “175B”“60B”“540B” 等数字的含义数字代表模型参数数量具体示例参数数…

软件IIC和硬件IIC的主要区别,用标准库举例!

学习交流792125321,欢迎一起加入讨论! 在学习iic的时候,我们经常会遇到软件 IC和硬件 IC,它两到底有什么区别呢? 软件 IC(模拟 IC)和硬件 IC(外设 IC)是两种实现 IC 总线通信的方式…

4个 Vue 路由实现的过程

大家好,我是大澈!一个喜欢结交朋友、喜欢编程技术和科技前沿的老程序员👨🏻‍💻,关注我,科技未来或许我能帮到你! Vue 路由相信朋友们用的都很熟了,但是你知道 Vue 路由…

git文件过大导致gitea仓库镜像推送失败问题解决(push failed: context deadline exceeded)

问题描述: 今天发现gitea仓库推送到某个镜像仓库的操作几个月前已经报错终止推送了,报错如下: 首先翻译报错提示可知是因为git仓库大小超过1G限制。检查本地.git文件,发现.git文件大小已达到1.13G。确定是.git文件过大导致&…

怎么利用DeepSeek进行PCB设计?

最近在琢磨利用Deepseek改善PCB的细节设计,毕竟立创EDA里面没有集成DS,因此,如何让DS能识别图片成了重中之重。所幸最近腾讯元宝里面集成了R1的满血版,这个版本可以上传图片,于是让DS识别图片就可能了。 在原理图设计…

详细介绍 Jupyter nbconvert 工具及其用法:如何将 Notebook 转换为 Python 脚本

nbconvert 是 Jupyter 提供的一个非常强大的工具,允许用户将 Jupyter Notebook 文件(.ipynb)转换成多种格式,包括 Python 脚本(.py)、HTML、PDF、LaTeX 等。你可以通过命令行来运行 nbconvert,也…

windows上传uniapp打包的ipa文件到app store构建版本

uniapp是一个跨平台的框架,使用windows电脑也可以开发ios软件,因为uniapp的打包是在云端实现的,本地电脑无需使用mac电脑即可完成打包。 但是打包后的ipa文件需要上架到app store的构建版本上,没有mac电脑,又如何上架…

PySide(PyQT),QGraphicsItem的pos()和scenePos()区别

在QGraphicsItem中,pos()和scenePos()是两个重要的方法,用于描述图形项的位置,但它们的含义和用途有所不同。理解它们的区别对于正确操作和管理QGraphicsItem的位置至关重要。 1. pos()方法 • 定义:pos()返回的是QGraphicsItem在…

消防设施操作员考试备考:以技巧为翼,翱翔知识天空​

消防设施操作员考试的备考过程中,掌握实用技巧能让学习事半功倍。以下为您介绍一系列备考技巧,助您在知识的天空中自由翱翔。​ 记忆技巧:化繁为简​ 消防知识众多,记忆难度较大。可以采用多种记忆方法,如口诀记忆法…

物联网商业模式

物联网商业模式是一种战略规划,它融合了物联网技术来创造价值并获取收入。它与传统商业模式的不同之处在于,它利用互联设备来改善运营、提升客户体验以及优化服务项目。在当今由科技驱动的世界中,这种商业模式通过利用实时数据来提供创新服务…