这是一个常常被时时提出来的问题,不少时候咱们觉得理解了、懂了,但深究一下,咱们却发现并不懂。
方法是咱们天天都在写得,不少程序员大多都使用实例化方法,而不多使用静态方法,问缘由也说不出来因此然,或者简单的回答二者定义的区别,静态方法不须要new就可使用 实例化方法须要new了之后才可使用。。。。咱们真的理解了吗?
从实际项目开发提及,这里有开发项目的三种方式:
开发项目中把BLL和DAL分开,在BLL调用DAL的代码。
1、在DAL中使用静态方法,不建立实例直接调用(大概有不少人都使用这种方式开发 )
class DAL
{
public static string GetUserName(...);
}
在BLL中调用:
DAL.GetUserName();
2、在DAL中使用实例方法,采用静态成员模式(或Singleton)经过实例来调用:
class DAL
{
public static readonly DAL dal = new DAL();
public string GetUserName(...);
}
在BLL中调用:
DAL.dal.GetUserName();
3、在DAL中使用实例方法,每次调用以前先建立DAL对象的实例:
class DAL
{
public string GetUserName(...);
}
在BLL中调用:
DAL dal = new DAL();
dal.GetUserName();
---------------------------------------------------------------
开发方式一:我觉得在一些状况下(好比 调用多个数据库、GetUserName(...)内部处理操做部分)会出现线程安全的嫌疑。这种开发方式不用New出对象,因此很广泛。
开发方式二:应该可能是应用在cs模式下,DAL在整个项目只会有一个对象存在,若是出如今B/S 我想不能兼容多种问题状况。并且也有线程安全的问题。
开发方式三:应该是广泛使用的,可以兼容各类问题,也不会有线程不安全的嫌疑出现。
特别说明一下:在MS的pet3.0之前的版本 都采用了方式二,而到pet3.0和之后的版本 都采用了方式三,并且特别在开发说明文档中明确的解释了一下。我想应该是从兼容性上考虑的,从性能上方式二并不比方式三真正的高多少。
-------------------------------------------------------------------------
我特地以“你怎么理解并使用静态方法和实例化方法的?”这样的问题询问了多位程序员,他们开发的语言也不尽相同(c 、c++、java、c#)
如下是他们的回答:
海龙说:
公用的方法,并且是一些零散的 通常用静态方法
张伟说:
几乎没有区别,若是不须要实例化,就用静态方法;若是为了稳妥,就用实例方法,这样才可调用其余实例方法和变量 。
萧远山说:
静态方法比较少用,由于他在一启动就实例化了,比较占资源,固然,,配合单例模式仍是比较好用的
比较多的用在数据链接上,我避免使用的原则就是减小资源消耗。
张新波说:
静态方法意味着我在调用前不须要进行对其所属的类进行new操做,我主要会在工具类里面用到静态方法。
向详说:
静态就是类的,实例就是对象的。
静态方法和实例方法的区别之处还有一个地方:静态方法不须要依赖类当中的属性,能在这个方法中封闭的完成一个功能。实例方法更多的会使用到类当中的属性。
winson_张林说:
最大的区别在于内存。
静态方法在程序开始时生成内存,实例方法在程序运行中生成内存,
因此静态方法能够直接调用,实例方法要先成生实例,经过实例调用方法,静态速度很快,可是多了会占内存。
任何语言都是对内存和磁盘的操做,至因而否面向对象,只是软件层的问题,底层都是同样的,只是实现方法不一样。
静态内存是连续的,由于是在程序开始时就生成了,而实例申请的是离散的空间,因此固然没有静态方法快,
并且静态内存是有限制的,太多了程序会启动不了。
showlover说:
静态方法与实例方法各有本身的用处...
是定义成静态方法,仍是定义成实例方法,还要看具体状况,好比方法自己与类型没有太大的关系,能够定义成静态方法..
用实例方法,固然须要你先建立实例,才能调用实例方法,而静态方法则不须要..
从性能上说,静态方法效率要稍微高一些,可是它会常驻内存...
一些状况下使用静态方法是有好处的,由于对于静态方法不管你有多少个实例,
内存中要维护的一份拷贝。同时,某些方法,确实使用静态是比较恰当的..
Q.yuhen说:
这个问题牵扯到的东西比较多,诸如设计模式等等。简单点说,静态方法用来执行无状态的一个完整操做,实例方法则相反,它一般是一个完整逻辑的一部分,而且须要维护必定的状态值。
若是用内存和效率来区分使用Static Method、Instance Method 就回到过去结构化编程了。使用那种方法的根本出发点仍是围绕面向对象来进行的。
陈亮说:
静态方法和全局函数差很少的,实例方法是一个类里面的方法。
总结:你们对这个问题都有一个共识:那就是实例化方法更多被使用和稳妥,静态方法少使用。
有时候咱们对静态方法和实例化方法会有一些误解。
一、你们都觉得“ 静态方法常驻内存,实例方法不是,因此静态方法效率高但占内存。”
事实上,他们都是同样的,在加载时机和占用内存上,静态方法和实例方法是同样的,在类型第一次被使用时加载。调用的速度基本上没有差异。
二、你们都觉得“ 静态方法在堆上分配内存,实例方法在堆栈上”
事实上全部的方法都不可能在堆或者堆栈上分配内存,方法做为代码是被加载到特殊的代码内存区域,这个内存区域是不可写的。
方法占不占用更多内存,和它是否是static没什么关系。
由于字段是用来存储每一个实例对象的信息的,因此字段会占有内存,而且由于每一个实例对象的状态都不一致(至少不能认为它们是一致的),因此每一个实例对象的因此字段都会在内存中有一分拷贝,也由于这样你才能用它们来区分你如今操做的是哪一个对象。
但方法不同,不论有多少个实例对象,它的方法的代码都是同样的,因此只要有一份代码就够了。所以不管是static仍是non-static的方法,都只存在一份代码,也就是只占用一分内存空间。
一样的代码,为何运行起来表现却不同?这就依赖于方法所用的数据了。主要有两种数据来源,一种就是经过方法的参数传进来,另外一种就是使用class的成员变量的值……
三、你们都觉得“实例方法须要先建立实例才能够调用,比较麻烦,静态方法不用,比较简单”
事实上若是一个方法与他所在类的实例对象无关,那么它就应该是静态的,而不该该把它写成实例方法。因此全部的实例方法都与实例有关,既然与实例有关,那么建立实例就是必然的步骤,没有麻烦简单一说。
固然你彻底能够把全部的实例方法都写成静态的,将实例做为参数传入便可,通常状况下可能不会出什么问题。
从面向对象的角度上来讲,在抉择使用实例化方法或静态方法时,应该根据是否该方法和实例化对象具备逻辑上的相关性,若是是就应该使用实例化对象 反之使用静态方法。这只是从面向对象角度上来讲的。
若是从线程安全、性能、兼容性上来看 也是选用实例化方法为宜。
咱们为何要把方法区分为:静态方法和实例化方法 ?
若是咱们继续深刻研究的话,就要脱离技术谈理论了。早期的结构化编程,几乎全部的方法都是“静态方法”,引入实例化方法概念是面向对象概念出现之后的事情了,区分静态方法和实例化方法不能单单从性能上去理解,建立c++,java,c#这样面向对象语言的大师引入实例化方法必定不是要解决什么性能、内存的问题,而是为了让开发更加模式化、面向对象化。这样说的话,静态方法和实例化方式的区分是为了解决模式的问题。
拿别人一个例子说事:
好比说“人”这个类,每一个人都有姓名、年龄、性别、身高等,这些属性就应该是非静态的,由于每一个人都的这些属性都不相同;但人在生物学上属于哪一个门哪一个纲哪一个目等,这个属性是属于整我的类,因此就应该是静态的——它不依赖与某个特定的人,不会有某我的是“脊椎动物门哺乳动物纲灵长目”而某我的倒是“偶蹄目”的。