请问java 单例类 与 静态类 有何不同?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请问java 单例类 与 静态类 有何不同?相关的知识,希望对你有一定的参考价值。

他们都是在程序中只有一个实例,那么为他们有什么区别呢?

参考技术A 它们有自己的作用,灵活运用即可
简单说明:
单例类
Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。
在很多操作中,比如建立目录 数据库连接都需要这样的单线程操作。
最显而易见的好处是,节约开销,比如数据库链接单例的好处是,每次你只要去获取那个数据库的实例就好,不用每次去创建一个实例。

静态类
在一个类中创建另外一个类,叫做成员内部类。这个成员内部类可以静态的(利用static关键字修饰),也可以是非静态的。由于静态的内部类在定义、使用的时候会有种种的限制。所以在实际工作中用到的并不多。
  在开发过程中,内部类中使用的最多的还是非静态地成员内部类。不过在特定的情况下,静态内部类也能够发挥其独特的作用。

静态类和单例类设计模式有啥区别? [复制]

【中文标题】静态类和单例类设计模式有啥区别? [复制]【英文标题】:What is the difference between static class and singleton class desgin pattern? [duplicate]静态类和单例类设计模式有什么区别? [复制] 【发布时间】:2011-10-03 17:24:05 【问题描述】:

可能重复:Difference between static class and singleton pattern?

我无法理解黑白静态类和单例类的区别。

在单吨类中,我们确保只创建一个对象,并且不再创建更多对象。

在静态类中也不需要创建对象,我们可以直接使用静态类名调用属性和方法。

这里看起来都一样,所以使用创建单吨类有什么用。

对此的任何帮助都会很棒。

【问题讨论】:

【参考方案1】:

在静态类中,没有对象。你直接调用静态类的方法。

在单例中,有一个对象,但是它只能有一个实例。

单例在有条件地创建资源密集型对象时很有用。例如,您的应用程序可能需要连接到远程数据库。您可能希望将其设置为单例以限制连接数并确保仅在需要时创建它。

静态类和方法更像是可以在需要时调用的实用函数。

【讨论】:

【参考方案2】:

显然,不同之处在于,一方面,您在静态上下文中工作,另一方面,您处理的是普通对象实例。我想说这样做的主要后果是因为静态成员不是继承的,静态类不能从继承或多态中受益,而单例可以。通过在静态上下文中工作,您将失去很多 Java 的面向对象特性。

【讨论】:

看起来他使用的是 C#,而不是 Java。 糟糕,我的错。我一定没有打开 java 过滤器。【参考方案3】:

使用单例,我们可以确保只创建一个类(对象)的实例。当对象的创建成本很高并且只需要一个时,这非常有用。

另一方面,静态类不能创建该类的实例。当方法不低于给定对象而是作用于现有对象时,这是合适的。

【讨论】:

【参考方案4】:

首先让我们看一个例子来解释静态/实例(代码是as3,但任何语言都一样)

class Blob 
   private var i:int=0;

   public function Blob() 
      i++;
      trace("I value : " + i);
   

new Blob();
new Blob();

------
output
I 1
I 1

您有 2 个 Blob 类实例,并且每次都会创建 i var。

class StaticBlob 
  private static var i:int =0;

  public function StaticBlob() 
    i++;
    trace("I value : " + i);
  

new StaticBlob();
new StaticBlob();

--------
output

I 1
I 2

您的 StaticBlob 类也有 2 个实例,但 i var 只创建一次并为所有实例“保留在内存中”

现在更容易理解 Singleton。 单例保证您只有一个类的实例(因为它使用静态属性来保留实例的引用并返回它)。 所以它可以用来实例化一个对象(例如,如果你的对象消耗了太多的资源来创建)

【讨论】:

【参考方案5】:

单例类与静态类有很大不同,单例类可以包含静态和非静态成员/属性/方法。

所以单例对象可以像普通的非静态对象一样持久化信息/状态。最重要的是,单例被设计为线程安全的,即它有一个同步根对象(通常),可用于阻止试图做同样事情的线程。

静态类只能包含静态成员/属性/成员,因此无法保持线程安全,您不能锁定静态对象。

【讨论】:

您可以拥有线程安全的静态成员。您只有一个静态只读私有字段,其中包含要锁定的对象。

以上是关于请问java 单例类 与 静态类 有何不同?的主要内容,如果未能解决你的问题,请参考以下文章

单例类与静态方法和字段? [复制]

单例类和静态类的区别? [复制]

单例模式

《JAVA与模式》之单例模式

《JAVA与模式》之单例模式

《JAVA与模式》之单例模式