都是为了提高系统性能,好像没什么区别啊,感觉static更方便,不需要写额外的东西,
语言本身就支持,不需要考虑多线程的问题!既然如此还要单例干嘛!

解决方案 »

  1.   

    同意,单例能做到的,用static也能做到。
    不过,我觉得单例更符合OO思想。
    另外,如果有static变量,必须考虑多线程的问题。
      

  2.   

    static的对象一样可以被重定向啊,而单例除了static的引用外啊,最主要的是单例的构造器是private的啊,这样其他人都不可以new它了,不可以new这才是单例的核心思想所在吧。就是任何时候都只有一个,static虽然你可以随时使用,但是还是有被人new的可能。
    private 构造器让人不可以new,通过get获取static对象的引用,这样可以保证任何时候都只有一个该对象的实例。
    而static只是一个静态的对象,使用方便而已,并没有对那个对象任何的限制。和单例模式差了很多
    以上纯个人理解
      

  3.   

    举个例子,你是个程序员,你希望任何时候有一个class A的实例就可以了,所以你在你的class B里封装了一个A的对象
    class B
    {
    static A a = new A();
    }
    这样以后所有代码大家都可以使用B.a来调用A里的方法。很方便,可是没几个月你走了,换我接手
    我想使用A里的方法,可是也许我根本就没有你的API,我不知道B里已经有了一个static的A,因此我在我的class C里
    class C
    {
    public void getA
    {
     A a =new A();//这个时候整个工程下出现了2个A的对象已经违背了你当初的设计,以后可能还会有更多的人new A();
    //但是如果你当时把A设计成的单例,就不会出现这样尴尬的局面了
    }
    }
      

  4.   

    单例是只能有一个实例。共用一个实例。
    static和实例没关系。只是不需要创建实例再调用,直接使用类就可以调用。
    两者还是有很大区别的。
      

  5.   

    单例主要保证只有一个对象存在,我觉得有点类似文件的只读属性。
    而static修饰的是全局的,任何地方都可以修改了。
      

  6.   

    都可以保证一个对象存在,但是static实现说明你的对象在类创建的时候就已经存在了,占系统资源。
    而单列这是在你实际使用该对象的时候才new出一个来。
    同时static 安全性低。
      

  7.   

    用static模式的话,无法实现接口和继承。
      

  8.   

    用了static之后只能引用不能跨类调用
      

  9.   

    不同的概念
    只能说static是实现单例模式最方便的途径
      

  10.   

    单例和static的区别就有些变量和属性的区别了,单例更面向对象。。简单的举个单例强于static的例子:有一个N大的集合。要做单例,如果你用static就必须前置加载,使用单例就可以后置加载。。public class CollectionDataTable
    {
      public static tbs=new  CollectionDataTable();
      
      private CollectionDataTable()
      {}
    }public class CollectionDataTable
    {
      private object obj=new object();  
      private CollectionDataTable  tbs
      private CollectionDataTable()
      {}  public CollectionDataTable Tbs
      {
          if(obj!=null)
             tbs=new CollectionDataTable (); 
        
          return tbs;
      }
    }
    //一个在于程序启动时就new 对象一个在第一次使用时才new,很有可能这个对象牛大,并且N多用户的情况是不使用到该对象的。所以他们没必要实例化。
    这样的话,单例就强于static很多
      

  11.   

    使用单例模式可以限制对象实例的个数,除了返回实例的操作之外不能被new出来。这在某些需要限制对象访问的场合下是有用的。
    使用static的话并不能限制对象实例的个数。
      

  12.   

    单例针对对象,static针对类(即在没有类实例的情况下也可以使用)
      

  13.   

    而static有还是有可能被new出多个实例的,而这多个实例在用完之后也许就没用了,还要等待立即回收机制来回收,所以效率自然不如单例。
      

  14.   

    LZ 严重错误, 再多多理解啥是单例吧.  (参考Spring IoC)
      

  15.   

    单例是可以延迟加载的,static是要无条件加载的
      

  16.   

    单例和Static的区别还是比较明显的:
    1.单例无论怎么说还是类实例,而类实例占用的内存空间是堆空间,而Class则被加载置方法区,包括所有的方法;
    2.单例是从设计模式层面讲的,是相对类的运行空间讲的,Spring容器也有单实例的概念,但它的“singleton”实例是容器创建的,并且无需满足“自行创建”的要求。因此单例是相对的,在Spring的项目中,是相对Spring容器,在需要“自行创建”的环境中,是相对JVM实例的,也就是一个运行中的Java程序,显然Static是绝对的概念;
    3.单例是类实例,从另一个角度看,首先是对事物的抽象,同时由于事物在现实环境中是单一的实体、资源等等,例如一个公司就一台打印机那样。从设计角度看,这个类需要抽象出事物的特性,同时由于是单例,是竞争资源,所以需要考虑互斥问题,否则就用Static得了,毕竟简单。
      

  17.   

    单例模式能保证整个jvm中,这个类只有一个实例。单靠static不能保证这一点
      

  18.   

    C# 有readonly , static变量可以用来做单例.但Java么... 就有点欠缺了
      

  19.   

    别争了, 看看MSDN这篇文章吧, 远古到C++, 现代到Java, C#, 
    还有考虑到线程安全. http://msdn.microsoft.com/en-us/library/ms954629.aspx
      

  20.   

    java codepackage edu.scit.singletion; public class Singletion { 
    public static Singletion singletion; //专用的构造器,防止客户机创建多个实例 
    private Singletion(){ } //设计唯一的访问接口 
    public static synchronized Singletion getInstance(){ 
    if(singletion== null){ 
    singletion = new Singletion(); 

    return singletion; 
    } public void print(){ 
    System.out.println("==========hello=========="); 

    public String toString(){ 
    return "king"; } 
      

  21.   


    你的理解是错误的,看一面代码:
    public class D {
    private D() {
    new A();
    }
    private static D inst;
    public static D getInst() {
    if (inst == null) {
    return new D();
    }
    return inst;
    }
    }
    public class E {
    private E() {
    new A();
    }
    private static E inst;
    public static E getInst() {
    if (inst == null) {
    return new E();
    }
    return inst;
    }
    }同样会出理多个A对象。