关于与单例与采用静态变量引用一个对象的区别

超声波雾化驱动设计:专用芯片FM8118替代MCU的工程实践 超声波雾化是一种基于压电陶瓷谐振原理的高频能量转换技术,其核心在于在1.6–2.4MHz频段精准激励雾化片以实现高效水分子破碎。传统采用通用MCU配合分立MOSFET的方案受限于PWM频率上限、栅极驱动能力不足及EMI控制困难,导致雾化效率低、温升高、可靠性差。专用雾化芯片(如FM8118)通过集成2.1MHz振荡器、零电压开关(ZVS)控制与过流/过热双重保护,从架构层面解决高频功率驱动的本质约束,显著提升驱动效率(达83.7%)与系统鲁棒性。该技术广泛适用于桌面加湿器、医疗雾化器、农业微喷等对体积、功耗 阅读详情


这里要说明的是,即将讨论的是单例模式获取一个对象与定义一个静态变量而创建一个对象,这两种方式的区别。

看如下代码

//方式一:单例模式
package
{
    public class Singleton
    {
        private static var instance:Singleton;
        public function Singleton(pClass:PClass)
        {
            if(pClass == null)
                throw new Error("单例,禁用构造函数创建对象.");
        }
        public static function getInstance():Singleton
        {
            if(instance == null)
                instance = new Singleton(new PClass());
            return instance;
        }
        /*<------------------------------------------->*/
        public var num:int = 0;
        public function traceNum():void
        {
            trace(num);
        }
    }
}
class PClass{}


//方式二:定义普通类的静态变量:

package
{
    public class Sample
    {
        public var num:int = 0;
        public function Sample()
        {

        }
        public function traceNum():void
        {
            trace(num);
        }
    }
}
//然后定义一个该类的静态变量
public static varmeSample:Sample = new Sample();

有朋友跟我交流,问这两种写法到底有什么区别。看起来实现的效果都一样。这两种方式的区别到底是什么,有时新手面试时可能会被问到,这里做个总结。

     要分辨两者之间的区别,要来看看两者的一些基本特点。

单例的特点:

1.      保证某类只存在唯一实例。

2.      该类本身完成自身的初始化。

3.      获取该唯一实例的方式非常明确,可以通过该类本身定义的静态方法getInstance()获取该类的唯一实例引用。

静态变量定义某类的实例引用特点:

1.   该类的实例引用的静态变量可定义在任何文档类当中。

2.   获取该类的实例引用的静态变量,可以通过定义该静态变量的类名通过点语法进行访问该引用。

3.   任何位置可以对该静态变量进行重新赋值。

通过这两者方式的特点,我们可以很明显的看出两者之间的区别。(这一切都是基于某类只需要存在一个实例对象的前提来讨论)

首先静态变量方式不能确保某类的实例的唯一性,这样在项目中,可能因为在某个文档类中对该静态变量进行再次赋值,存不可意料的风险(这种风险可以规避)。同样的,因为静态变量的定义的位置不确定,所以需要协议商定,这些静态变量分类别进行定义在一个固定的位置(比如说某个专门存放静态变量方式的某类的对象的引用的文档类当中)。

而单例模式也就是静态变量方式创建一个类的实例引用所带来的缺陷的改善。首先解决引用的唯一实例可能被重新赋值的问题,单例模式中的getInstance()静态方法实现时,采用懒汉式创建一个对象(当然这只是创建方式的一种),规避了这一风险,无则创建,有则跳过创建。其次,getInstance()静态方法定义在该类的内部,获取该类对象的引用位置非常明确,无需额外的沟通商定,团队成员拿起即用。最后一个区别并不是很明显,声明一个静态变量,实际上,我们会直接对其进行初始化赋值,这样,在内存占用上,所占用的内存为该初始化赋值对象实际的内存。而单例模式可以通过懒汉创建法延迟该内存的占用,要知道,当一个静态变量只进行声明,而不进行初始化时,实际的内存占用只有4个字节(笔者个人推测,这四个字节只是一个指针地址所占用的内存空间)。

 

[SDIO] SD card 初始化及常用命令解析(附波形,uboot代码) 目录 初始化 1.cmd 0 2.cmd8 3.cmd55 4.acmd41 5.cmd2 6.cmd3 7.cmd9 8.cmd13 9.cmd7 10.ACMD51 11.CMD6 12.CMD16 13.CMD17 14.CMD18 15.CMD12 tuning CMD19 DW_SDHCI的tuning流程 初始化 1.cmd 0 /* Reset the Card */ err = mmc_go_idle(mmc... 阅读详情

相关推荐

支持找回微信删除好友!一款人人可用的全能微信数据分析工具

找回删除好友、查看删除记录、恢复聊天信息....

1725

静态变量和实例变量的区别?

可以看到,静态变量只有一个副本,可以通过类名直接访问。实例变量每个实例都有自己的副本,必须通过实例对象访问。当修改静态变量时,所有实例都会受到影响。当修改实例变量时,只有该实例会受到影响。2.静态变量只有一个副本,无论类被实例化多少次,它始终是相同的。实例变量每个实例都有自己的副本。3.静态变量可以直接从类中访问,无需实例化。实例变量必须通过实例化对象后才能访问。1.静态变量属于类,而不是类的任何实例。实例变量属于类的实例。

Blue92120的博客 794

数据分析—用户行为数据分析

一般价值用户(R高F高M低):用户处于购买活跃期,感兴趣的商品多,购买次数少 → 针对该部分客户,目的就是要让他们购买,所以可以和运营部门沟通,降低利润,给出有力折扣促进购买,进而转为重要价值用户。重要价值用户(R高F高M高)维护:用户处于购买活跃期,感兴趣的商品多,购买次数也多 → 针对兴趣产品,保持一定频率的触达,持续维护。

m0_74091312的博客 1418

单例模式与静态变量的区别

单例的特点: 保证某类只存在唯一实例。 该类本身完成自身的初始化。 获取该唯一实例的方式非常明确,可以通过该类本身定义的静态方法getInstance()获取该类的唯一实例引用。 静态变量定义某类的实例引用特点: 该类的实例引用的静态变量可定义在任何文档类当中。 获取该类的实例引用的静态变量,可以通过定义该静态变量的类名通过点语法进行访问该引用。 任何位置可以对该静态变量进行重新赋值。 通过这两者方

探戈就是趟啊趟着走,三步一回头啊... 1665

告别以太网瓶颈:手把手教你为AI训练集群搭建InfiniBand网络(以NVIDIA DGX A100/H100为例)

本文详细指导如何为AI训练集群搭建InfiniBand网络,解决以太网瓶颈问题,特别针对NVIDIA DGX A100/H100系统。通过硬件选型、网络架构设计和性能调优,显著提升多机多卡训练效率,适用于大规模模型训练场景。

weixin_30336061的博客 310

详解TCP/IP五层模型

TCP/IP模型是一个网络通信体系结构,由五层组成,每一层都有其特定的功能。应用层传输层网络层数据链路层物理层每一层都有不同的责任,通过这种层次结构,网络通信可以更有效地进行。

2201_75437633的博客 1万+

面向对象-静态变量与单例设计模式

1. Static 1.1 什么是Static static:静态的 static可以用来修饰:方法、属性、代码块、内部块 1.2 Static的使用 1.2. 1static修饰属性:静态变量; 属性:按是否使用static修饰,又分为静态变量 vs 非静态变量 实例变量:当我们创建了类的多个对象,每个对象都独立的拥有一套类中的非静态属性,当修改其中一个对象中的非静态属性时,不会导致其它对象中同样的属性值修改 静态变量:我们创建了类的多个对象,多个对象共享同一个静态变量,当通过某一个对

weixin_53120322的博客 689

Windows 11下Dify安装部署实战指南

本文详细介绍在Windows 11环境下部署开源LLM应用开发平台Dify的完整流程。涵盖环境准备(WSL 2启用、Docker Desktop安装配置)、源码获取、Docker容器化部署、数据库初始化、服务启动验证等核心步骤。包括环境变量配置、性能优化、安全加固、端口冲突解决、数据库连接故障排查等关键技术要点。为开发者提供从零到一的Dify本地化部署实战指南

weixin_44269410的博客 851

单例模式的类和静态方法的类的区别和使用场景

可以通过依赖注入的方式将单例对象注入到需要使用的类中,从而在测试时使用模拟对象替代真实的单例对象。静态方法难以进行模拟和替换,因为它们是类级别的,无法通过依赖注入的方式进行替换。综上所述,单例模式的类更灵活,适合需要管理状态和资源的场景,而静态方法的类更简单,适合提供无状态的工具方法。适用于需要全局唯一实例,并且需要管理状态和资源的场景,如数据库连接、日志记录器等。静态方法的类将所有方法和属性都声明为静态的,不需要创建实例即可调用。单例类可以被继承,子类可以重写父类的方法,实现多态。

haoxuhong的博客 876

【Python机器学习】决策树与随机森林:解释性与鲁棒性的平衡

本文深入探讨了决策树和随机森林在解释性与鲁棒性之间的权衡。决策树以其完美的可解释性、快速的推理速度和无需特征标准化等优势,在许多场景中仍然是首选算法。一个经过合理剪枝的决策树,其每个决策路径都可以转化为业务规则,这在金融风控、医疗诊断等对透明度有严格要求的领域无可替代。然而,单棵决策树的高方差和容易过拟合的特性限制了其泛化能力。随机森林通过集成学习的思想,巧妙地解决了这个矛盾。它维持了相对较好的解释性(通过特征重要性、OOB估计等方式),同时通过多棵树的投票或平均,大幅降低了模型的方差。

nmdbbzcl的博客 626

泛微OA提交流程到下一个节点

泛微OA后端接口强制流程归档

CXYCMY的博客 2246

单例和静态类的区别

单例和静态类的区别

qwertyunb的博客 823

光电二极管探测器电流信号处理与指令输出系统

本文提出了一种基于Python的光电二极管电流信号处理系统设计方案。该系统能够实时采集、处理光电二极管输出的电流信号,并根据预设阈值输出控制指令。系统采用模块化架构,包含数据采集、信号处理、阈值检测、指令生成等核心模块。其中数据采集模块提供了模拟器实现和硬件接口框架,支持噪声模拟和脉冲信号生成。系统设计考虑了实时性、可靠性和可扩展性,适用于光强测量、光电检测等多种应用场景。

huanghm88的专栏 1180

单例与采用静态变量引用一个对象的区别

单例的特点: 1.保证某类只存在唯一实例。 2.该类本身完成自身的初始化。 3.获取该唯一实例的方式非常明确,可以通过该类本身定义的静态方法getInstance()获取该类的唯一实例引用。 静态变量定义某类的实例引用特点: 1.该类的实例引用的静态变量可定义在任何文档类当中。 2.获取该类的实例引用的静态变量,可以通过定义该静态变量的类...

weixin_30808575的博客 127

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

性能优化专题二--虚引用和弱引用的区别、枚举优化、对象池

问题一:虚引用和弱引用的区别 虚引用:该对象在回收前和回收后都无法通过虚引用获取到这个,在该对象被回收掉时会将对象部分信息存储到虚引用回收队列中,仅仅是拿到一个对象被回收掉的通知; 弱引用:在该对象被回收前可以通过弱引用获取到该对象,回收后无法获取到这个对象,在该对象被回收掉时会将对象部分信息存储到弱引用回收队列中,可以拿到一个对象被回收掉的通知; 下面通过程序我们来看下实验结果: 虚引用:一般没有什么用处,使用场景是要做一些系统跟踪工具,例如打log要看看GC什么时候来过,打印这些GC信息时

王温暖的博客 1378

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

【JVM】如何判断堆上的对象没有被引用?

终结器引用指的是在对象需要被回收时,终结器引用会关联对象并放置在Finalizer类中的引用队列中,在稍后由一条由FinalizerThread线程从队列中获取对象,然后执行对象的finalize方法,在对象第二次被回收时,该对象才真正的被回收。,软引用相对于强引用是一种比较弱的引用关系,如果一个对象只有软引用关联到它,当程序内存不足时,就会将软引用中的数据进行回收。,JVM中默认引用关系就是强引用,即是对象被局部变量、静态变量等GC Root关联的对象引用,只要这层关系存在,普通对象就不会被回收。

dhdhd78273的博客 1606

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

spring 单例 获取多例的位_Spring学习之路——单例模式和多例模式

在Spring中,bean可以被定义为两种模式:prototype(多例)和singleton(单例)singleton(单例):只有一个共享的实例存在,所有对这个bean的请求都会返回这个唯一的实例。prototype(多例):对这个bean的每次请求都会创建一个新的bean实例,类似于new。Spring bean 默认是单例模式。实战演示:代码详见上一篇文章中的代码。在配置文件中,...

weixin_39746869的博客 108

java对象引用变量_引用&的真正理解-变量引用、函数引用、对象引用

php的引用,就是在变量或者函数、对象等前面加上&符号最重要就是 删除引用的变量 ,只是引用的变量访问不了,但是内容并没有销毁 在PHP 中引用的意思是:不同的名字访问同一个变量内。变量的引用两个变量来指向同一个内容。如:$a="ABC";$b =&$a;echo $a;//这里输出:ABCecho $b;//这里输出:ABC$b="EFG";echo $a;//这里$a的值变为E...

weixin_36292971的博客 472

php函数引用变量的值,php 函数引用、变量引用、对象引用的区别

php 函数引用、变量引用、对象引用的区别1.变量的引用$y =1;$x = $y;$x = 2; //变量的赋值操作相当于复制$y的内存地址指向另一个变量$x,互不影响echo $x,$y;$z = &$y;$z = 5;echo $y; //结果是5,$z和$y指向同一内存地址,修改值相互影响2.函数引用返回值function &testfucc(){static ...

weixin_39929254的博客 110

成员变量与局部变量、静态变量的区别总结

JAVA的局部变量 局部变量声明在方法、构造方法或者语句块中; 局部变量在方法、构造方法、或者语句块被执行的时候创建,当它们执行完成后,变量将会被销毁; 访问修饰符不能用于局部变量; 局部变量只在声明它的方法、构造方法或者语句块中可见; 局部变量是在栈上分配的。 局部变量没有默认值,所以局部变量被声明后,必须经过初始化,才可以使用。 JAVA的实例变量 实例变量声明在一个类中,但在方...

zhangc 528

C++中类的静态变量在哪初始化

C++中类的静态变量在哪初始化

ken2232的博客 1556

局部变量、全局变量、静态变量

局部变量 定义:局部变量指在程序中只在特定过程或函数中可以访问的变量。换言之,在一个函数内部定义的变量是内部变量,它只在本函数范围内有效,也就是说只有在本函数内才能使用它们,在此函数以外时不能使用这些变量的,它们称为局部变量。 全局变量 定义:在函数外定义的变量是外部变量,外部变量就是全局变量,全局变量可以为本文件中其它函数所共用,它的有效范围从定义变量的位置开始到本源文件结束。 局部变量与全局变...

weixin_45380951的博客 7148

【iOS】单例、通知、代理

单例模式在整个工程中,相当于一个全局变量,就是不论在哪里需要用到这个类的实例变量,都可以通过单例方法来取得,而且一旦你创建了一个单例类,不论你在多少个洁面中初始化调用了这个单例方法取得对象,它们所有的对象都是指向的同一块内存的存储空间(即单例类保证了该类的实例对象是唯一存在的一个)KVO/通知 -------> 观察者模式KVC --------> KVC模式单例模式代理模式1. 代理和通知的区别效率:代理比通知高;delegate是强关联,委托和代理双方互相知道。

zdsey的博客 1006

java引用与指针的区别_Java引用与C指针的区别

Java引用与C指针的区别2009-11-02eNet&Ciweek首先, 在Java中, 不存在引用传递(也就是地址传递)一说, 全部都是值传递, 自然, 在使用对象时实际上都是使用的引用Java语言明确说明取消了指针,因为指针往往是在带来方便的同时也是导致代码不安全的根源,同时也会使程序的变得非常复杂难以理解,滥用指针写成的代码不亚于使用早已臭名昭著的"GOTO"语句。Java放弃指针...

weixin_26806355的博客 312

java new一个对象的过程

文章来源:https://www.cnblogs.com/JackPn/p/9386182.html 完全拷贝,防止源链接文章丢失 java在new一个对象的时候,会先查看对象所属的类有没有被加载到内存,如果没有的话,就会先通过类的全限定名来加载。加载并初始化类完成后,再进行对象的创建工作。 我们先假设是第一次使用该类,这样的话new一个对象就可以分为两个过程:加载并初始化类和创建对象。 一、类加载过程(第一次使用该类)   java是使用双亲委派模型来进行类的加载的,所以在描述类加载过程前,我们

qq_37258792的博客 2113

Java的引用实际上是指针吗_Java引用与C指针的区别

首先, 在Java中, 不存在引用传递(也就是地址传递)一说, 全部都是值传递, 自然, 在使用对象时实际上都是使用的引用 Java语言明确说明取消了指针,因为指针往往是在带来方便的同时也是导致代码不安全的根源,同时也会使程序的变得非常复杂难以理解,滥用指针写首先, 在Java中, 不存在引用传递(也就是地址传递)一说, 全部都是值传递, 自然, 在使用对象时实际上都是使用的引用Java语言明确说...

weixin_31632529的博客 1121
下一篇: ActionScript3.0与JavaScript之间的函数互调
陈苏熙
博客等级 码龄17年 38粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值