关于这个问题,下面是一些同仁的观点:
观点一:(单例
)
单例模式比静态方法有很多优势:
首先,单例可以继承类,实现接口,而静态类不能(可以集成类,但不能集成实例成员);
其次,单例可以被延迟初始化,静态类一般在第一次加载是初始化;
再次,单例类可以被集成,他的方法可以被覆写;
最
后,或许最重要的是,单例类可以被用于多态而无需强迫用户只假定唯一的实例。举个例子,你可能在开始时只写一个配置,但是以后你可能需要支持超过一个配置
集,或者可能需要允许用户从外部从外部文件中加载一个配置对象,或者编写自己的。你的代码不需要关注全局的状态,因此你的代码会更加灵活。
观点二:(静态方法
)
静
态方法中产生的对象,会随着静态方法执行完毕而释放掉,而且执行类中的静态方法时,不会实例化静态方法所在的类。如果是用singleton,
产生的那一个唯一的实例,会一直在内存中,不会被GC清除的(原因是静态的属性变量不会被GC清除),除非整个JVM退出了。这个问题我之前也想几天,并
且自己写代码来做了个实验。
观点三:(
Good!
)
由于DAO的初始化,会比较占系统资源的,如果用静态方法来取,会不断地初始化和释放,所以我个人认为如果不存在比较复杂的事务管理,用singleton会比较好。个人意见,欢迎各位高手指正。
总结
:大家对这个问题都有一个共识:那就是实例化方法更多被使用和稳妥,静态方法少使用。
有时候我们对静态方法和实例化方法会有一些误解。
1、大家都以为“ 静态方法常驻内存,实例方法不是,所以静态方法效率高但占内存。
”
事实上,他们都是一样的,在加载时机和占用内存上,静态方法和实例方法是一样的,在类型第一次被使用时加载。调用的速度基本上没有差别。
2、大家都以为“ 静态方法在堆上分配内存,实例方法在堆栈上
”
事实上所有的方法都不可能在堆或者堆栈上分配内存,方法作为代码是被加载到特殊的代码内存区域,这个内存区域是不可写的。
方法占不占用更多内存,和它是不是static没什么关系。
因为字段是用来存储每个实例对象的信息的,所以字段会占有内存,并且因为每个实例对象的状态都不一致(至少不能认为它们是一致的),所以每个实例对象的所以字段都会在内存中有一分拷贝,也因为这样你才能用它们来区分你现在操作的是哪个对象。
但方法不一样,不论有多少个实例对象,它的方法的代码都是一样的,所以只要有一份代码就够了。因此无论是static还是non-static的方法,都只存在一份代码,也就是只占用一份内存空间。
同样的代码,为什么运行起来表现却不一样?这就依赖于方法所用的数据了。主要有两种数据来源,一种就是通过方法的参数传进来,另一种就是使用class的成员变量的值……
3、大家都以为“实例方法需要先创建实例才可以调用,比较麻烦,静态方法不用,比较简单
”
事实上如果一个方法与他所在类的实例对象无关,那么它就应该是静态的,而不应该把它写成实例方法。所以所有的实例方法都与实例有关,既然与实例有关,那么创建实例就是必然的步骤,没有麻烦简单一说。
当然你完全可以把所有的实例方法都写成静态的,将实例作为参数传入即可,一般情况下可能不会出什么问题。
从面向对象的角度上来说,在抉择使用实例化方法或静态方法时,应该根据是否该方法和实例化对象具有逻辑上的相关性,如果是就应该使用实例化对象 反之使用静态方法。这只是从面向对象角度上来说的。
如果从线程安全、性能、兼容性上来看 也是选用实例化方法为宜。
我们为什么要把方法区分为:静态方法和实例化方法 ?
如果我们继续深入研究的话,就要脱离技
术谈理论了。早期的结构化编程,几乎所有的方法都是“静态方法”,引入实例化方法概念是面向对象概念出现以后的事情了,区分静态方法和实例化方法不能单单
从性能上去理解,创建c++,java,c#这样面向对象语言的大师引入实例化方法一定不是要解决什么性能、内存的问题,而是为了让开发更加模式化、面向
对象化。这样说的话,静态方法和实例化方式的区分是为了解决模式的问题。
拿别人一个例子说事:
比如说“人”这个类,每个人都有姓名、
年龄、性别、身高等,这些属性就应该是非静态的,因为每个人都的这些属性都不相同;但人在生物学上属于哪个门哪个纲哪个目等,这个属性是属于整个人类,所
以就应该是静态的——它不依赖与某个特定的人,不会有某个人是“脊椎动物门哺乳动物纲灵长目”而某个人却是“偶蹄目”的。
相关推荐
Java 中的 final 和 static 关键字详解 final 关键字是 Java 中的一种访问修饰符,用于修饰类、方法和变量,以确保它们不能被修改或继承。下面是 final 关键字的详细解释: 1. final 类 final 类不能被继承,也...
在C++编程中,`static`关键字有着独特的用途,它主要用在变量和函数的声明上,以控制它们的存储方式、作用域和生命周期。以下是关于`static`变量和`static`函数的详细解释。 **一、static变量** 1. **静态局部变量...
Static和Const用的详解 static和const是C语言中两个非常重要的关键字,它们在程序设计中扮演着不同的角色。本文将详细介绍static和const的用法和特性。 static static是C语言中的一个存储类型限定符,主要用来...
在Java编程语言中,`final` 和 `static` 是两个非常重要的关键字,它们分别具有不同的含义和用法,但都对代码的结构和行为产生深远影响。本文将深入探讨这两个关键字,并结合实际示例来解释它们的应用场景。 首先,...
在JavaScript中,public、private和static这些概念并非原生关键字,但可以通过特定的编码模式来实现类似的功能。在C#等静态类型语言中,public、private和static是访问修饰符,用于控制类成员的可见性和作用域。而在...
在 C++ 编程中,static、const、static const 和 const static 是四个常见的概念,但它们的初始化方式却容易弄混淆。下面我们将对这四种成员变量的初始化方式进行总结和解释。 1. 类里的 const 成员初始化 在一个...
### extern和static的详细用法 #### 一、引言 在编程中,尤其是在C/C++这类语言中,`extern`和`static`是两个重要的关键字,它们在控制变量的作用域以及链接可见性方面扮演着关键角色。正确理解和运用这两个关键字...
`static`关键字在Java中主要用于创建静态成员,包括静态变量和静态方法。与普通成员不同,静态成员属于类级别,而不是实例级别。这意味着无论创建了多少个类的实例,静态成员只有一个副本存在于内存中。 #### 二、...
一种常见方法是结合使用Static控件和滚动条(SCROLLBAR)控件,通过监听滚动条的滚动事件,更新Static控件中的文本内容。在C++中,可以利用MFC(Microsoft Foundation Classes)库中的CStatic和CScrollBar类来实现这...
Java 中 final 和 static 的区别 final 关键字在 Java 中有多种用法,包括修饰变量、方法、类等。下面是 final 关键字的各种用法: 1. final 修饰变量:表示该变量一旦被初始化,程序无法修改变量的值,该变量变成...
### 如何使用Static的变量和方法 在Java编程语言中,`static`关键字是一个非常重要的概念,用于定义静态成员变量和方法。理解`static`如何工作对于任何Java开发者来说都是必不可少的,尤其是在处理多线程环境、单例...
java中final和static讲解及实例
理解IN、Inout、Out这三种不同的输入输出参数类型以及Static和Temp变量的用法对于编写高效且可靠的PLC程序至关重要。 1. IN参数:IN类型的变量作为单向输入变量,它只能被程序块内部读取,而不能被写入。这意味着在...
- 过度使用 "static" 可能会导致代码难以测试和维护,因为它可能导致隐含的依赖和全局状态。 综上所述,是否使用 "static" 应根据具体场景和需求来判断。在编写代码时,应充分考虑类的设计和对象的生命周期,以...
静态选项背后包含了多种技术,例如 Lightmap Static、Occluder Static、Occludee Static 和 Navigation Static。这些技术都是为了优化游戏性能和大小的。 Lightmap Static 是用于生成光照贴图,使场景进行优化。...
Java中的`final`和`static`关键字是编程中非常重要的两个修饰符,它们分别用于不同的场景,以确保代码的稳定性和高效性。 首先,`final`关键字主要用于表示不可变性。它可以用来修饰类、方法和变量。对于类,如果一...
Visdom 的正常运行依赖于这个 `/static/` 目录,因为它包含了所有用于构建用户界面的静态资源,如CSS样式表、JavaScript脚本和图片等。当您尝试启动 Visdom 并收到蓝屏或错误提示,这通常意味着缺少了这些必要的...
005.PIX使用一个公网IP做PAT和Static NAT
当定时器触发时,执行上述步骤3和4,更新Static Text的内容。记得处理`WM_TIMER`消息,这是定时器触发时发送到窗口的消息。 6. **处理退出和清理**:在程序关闭或控件不再需要显示时间时,记得使用`KillTimer`函数...
新特性二.defalut方法三.static方法 接口中的变量默认类型是public static final,也是就是说是 公有静态常量 。 而方法默认是public abstract,公有抽象方法,但是事实真的是这样吗? 一.新特性 Java 1.8对接口有两...