开始写这个是由于昨天看到一个大牛在简书写的文章,其中分门别类提了不少问题,我发现对于java我竟如此陌生,所以打算经过写文的方式来记录对这些问题的解答和理解,以此来加深我对Java的认识。java
首先,固然要附上该文的连接——http://www.jianshu.com/p/ba0fdee47cb4c++
而后,开始对问题进行解(bai)答(du)吧!编程
StaticAndNon-static.pngc#
首先仍是从我的感受仍是说吧,彻底度娘谷哥涯妹简叔未免太没有诚意了。安全
2.在同一个类中,实例方法内部 能够直接使用静态方法,可是静态方法中则没法直接调用这个实例方法(编译没法经过,一样也没法直接访问非静态的成员变量),我的推测是由于两种方法的加载机制有差别,由于在类内部直接调用类持有的实例方法时,默认带有this关键字,this关键字只带当前类的对象,可是静态方法在加载时,类尚未实例化,由于不能调用实例方法函数
3.介于实例方法和静态方法的修饰符有差别,这也算是一种不同吧。另外,实例方法属于对应类的实例的行为,而静态方法是属于类的行为(其实每个类都是Class类的对象,那静态方法是否是Class的实例方法呢,表示不懂);工具
4.静态方法多用做工具类的方法。性能
以上就是我我的的理解,也许漏洞百出吧,接下来是网搜整理时间。this
network.pngspa
摘自:http://blog.csdn.net/biaobiaoqi/article/details/6732117
一、你们都觉得“** 静态方法常驻内存,实例方法不是,因此静态方法效率高但占内存。**”
事实上,他们都是同样的,在加载时机和占用内存上,静态方法和实例方法是同样的,在类型第一次被使用时加载。调用的速度基本上没有差异。
二、你们都觉得“ 静态方法在堆上分配内存,实例方法在堆栈上”
事实上全部的方法都不可能在堆或者堆栈上分配内存,方法做为代码是被加载到特殊的代码内存区域,这个内存区域是不可写的。
方法占不占用更多内存,和它是否是static没什么关系。 由于字段是用来存储每一个实例对象的信息的,因此字段会占有内存,而且由于每一个实例对象的状态都不一致(至少不能认为它们是一致的),因此每一个实例对象的全部字段都会在内存中有一分拷贝,也由于这样你才能用它们来区分你如今操做的是哪一个对象。 但方法不同,不论有多少个实例对象,它的方法的代码都是同样的,因此只要有一份代码就够了。所以不管是static仍是non-static的方法,都只存在一份代码,也就是只占用一分内存空间。 一样的代码,为何运行起来表现却不同?这就依赖于方法所用的数据了。主要有两种数据来源,一种就是经过方法的参数传进来,另外一种就是使用class的成员变量的值……
三、你们都觉得“实例方法须要先建立实例才能够调用,比较麻烦,静态方法不用,比较简单”
事实上若是一个方法与他所在类的实例对象无关,那么它就应该是静态的,而不该该把它写成实例方法。因此全部的实例方法都与实例有关,既然与实例有关,那么建立实例就是必然的步骤,没有麻烦简单一说。
固然你彻底能够把全部的实例方法都写成静态的,将实例做为参数传入便可,通常状况下可能不会出什么问题。
从面向对象的角度上来讲,在抉择使用实例化方法或静态方法时,应该根据是否该方法和实例化对象具备逻辑上的相关性,若是是就应该使用实例化对象 反之使用静态方法。这只是从面向对象角度上来讲的。
若是从线程安全、性能、兼容性上来看 也是选用实例化方法为宜。
咱们为何要把方法区分为:静态方法和实例化方法 ?
若是咱们继续深刻研究的话,就要脱离技术谈理论了。早期的结构化编程,几乎全部的方法都是“静态方法”,引入实例化方法概念是面向对象概念出现之后的事情了,区分静态方法和实例化方法不能单单从性能上去理解,建立c++,java,c#这样面向对象语言的大师引入实例化方法必定不是要解决什么性能、内存的问题,而是为了让开发更加模式化、面向对象化。这样说的话,静态方法和实例化方式的区分是为了解决模式的问题。
上面的文字,更可能是解释了不少对实例方法和静态方法理解的误区,同时也侧面反映了一些静态方法与实例方法的差别化。
对于实例方法来讲,他是针对于对象的,也就是这一类型的不一样个体,不一样的个体能够有不一样的属性,虽然是相同的行为(即实例方法,同时入参相同),可是不一样的属性可能致使不一样的结果;
对于静态方法来讲,是无视个体差别的,同时静态方法内没法访问非静态成员属性,而静态成员属性相对于类来讲永远只有一份,这样一来,相同的行为下结果必然是稳定不受其余因素影响的,所以更适合来作工具类这种全局函数。
想来想去,从静态方法到实例方法,也许就是从结构化到面向对象的一个缩影吧~