论坛首页 Java企业应用论坛

讨论:单例和静态方法的深入讨论

浏览 14181 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (3)
作者 正文
   发表时间:2011-01-14  
我来讲讲我的想法吧:
单例的存在是为了什么?静态方法与静态变量又是什么?
单例中一定存在静态变量与静态方法,所以可以认为单例只是静态变量与静态方法的一种使用方式;进一步的可以讨论一下静态变量与静态方法。
静态变量,即类成员变量,它的意义在于这个类下的所有成员都共享该变量,为什么要共享?这是需求决定的!java只是提供了这么一种机制。好的,再说说静态方法,也就是类方法,方法的目的在于提供一个功能,即输入什么,再输出什么,同样的我们知道静态方法能操作的只能是静态变量,这是显然的,类方法没有办法从它的某个实例取得实例的某个状态或成员变量。再讲讲它们的储存,静态变量与普通变量,静态变量是类的,所有实例包括这个类所共享的,它储存在对应的Class对象中;普通变量是实例独享的,是储存在自己的对象的状态中的。那么方法呢,我们都知道方法都是存在方法区的,不管是静态的还是普通的,所以这点上看,静态方法与普通方法在储存上并没有差别;我们的重点可以转回到静态变量与普通变量。当然这也解决了楼主的一些问题,static的方法,即一些共具类的方法,普通的与static的并没有差别。
0 请登录后投票
   发表时间:2011-01-14  
接着上面的讲
静态变量是储存在类对象中的,相对于实例变量来说,静态变量只有一个,实例变量是一个实例一个,选择什么?看需求!如果你只是想调用某个与实例变量没有关系的方法,如果方法是普通的,则必须构造一个对象,再调用,这显然有些浪费,因为这个实例变量你用不着,即这个实例对象也是用不着的,还好jvm会很好的回收这些东西,这时如果考虑静态的,完全不用new一个实例对象出来,直接使用该方法就ok了,当然了,你是在无意间与对应的Class对象打交道;再考虑单例,这时是存在一个实例的,这个实例与普通的实例实质上没有差别,只是它只能存在一个罢了;这样在实例内部你可以有状态,且修改这些状态,这看你需求了;而如果把这些状态变为静态变量,相当于从实例对象移到类对象中,这从储存的角度上讲,没差别
0 请登录后投票
   发表时间:2011-01-14  
buptwhisper 写道
接着上面的讲
静态变量是储存在类对象中的,相对于实例变量来说,静态变量只有一个,实例变量是一个实例一个,选择什么?看需求!如果你只是想调用某个与实例变量没有关系的方法,如果方法是普通的,则必须构造一个对象,再调用,这显然有些浪费,因为这个实例变量你用不着,即这个实例对象也是用不着的,还好jvm会很好的回收这些东西,这时如果考虑静态的,完全不用new一个实例对象出来,直接使用该方法就ok了,当然了,你是在无意间与对应的Class对象打交道;再考虑单例,这时是存在一个实例的,这个实例与普通的实例实质上没有差别,只是它只能存在一个罢了;这样在实例内部你可以有状态,且修改这些状态,这看你需求了;而如果把这些状态变为静态变量,相当于从实例对象移到类对象中,这从储存的角度上讲,没差别



静态对象和实例对象只是生命周期不同,除了原生类型以外,都是对象实例。

变量是元信息,通过反射得到,比如字段、方法和构造器,他们是动静之分的。只有数据的范围不同而已。

0 请登录后投票
   发表时间:2011-01-14  
mercyblitz 写道
buptwhisper 写道
接着上面的讲
静态变量是储存在类对象中的,相对于实例变量来说,静态变量只有一个,实例变量是一个实例一个,选择什么?看需求!如果你只是想调用某个与实例变量没有关系的方法,如果方法是普通的,则必须构造一个对象,再调用,这显然有些浪费,因为这个实例变量你用不着,即这个实例对象也是用不着的,还好jvm会很好的回收这些东西,这时如果考虑静态的,完全不用new一个实例对象出来,直接使用该方法就ok了,当然了,你是在无意间与对应的Class对象打交道;再考虑单例,这时是存在一个实例的,这个实例与普通的实例实质上没有差别,只是它只能存在一个罢了;这样在实例内部你可以有状态,且修改这些状态,这看你需求了;而如果把这些状态变为静态变量,相当于从实例对象移到类对象中,这从储存的角度上讲,没差别



静态对象和实例对象只是生命周期不同,除了原生类型以外,都是对象实例。

变量是元信息,通过反射得到,比如字段、方法和构造器,他们是动静之分的。只有数据的范围不同而已。


是的,如果是对象,那么储存的只是地址,相应的对象是在堆中的其它对象中储存的

0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics