对于static你到底理解了多少
曾今我对static非常难以理解,因为我有一个同事把所有的的类方法都加了static,上层调用只需直接类名加方法名就OK了,如果有幸看到这文章,你可以去看下你的程序应该也可以用这种方式去做(一般使用spring ioc)的话基本都可以。为什么,当初我就想,为什么大家宁愿去new一个对象去调用下层代码,而不愿意去加static更方便调用。现在工作两年过去了,我终于知道了结果。归根结底,java是面向对象编程而不是面向过程。对于static的理解你到下面那一层了呢?
理解一
对于方法:加了static那么方法就变成了类的静态方法,可以用 (类名.方法) 来实现调用。
对于变量:加了static那么变量就变成了类的成员变量。可以用 类名.变量)来实现调用。
理解二
对于方法:加了static和不加static都是存放在内存的方法区,无论你是否使用了static对于内存
而言没有任何变化,除非当类被释放,也就是jvm full gc回收。
对于变量:没加static每次new一个对象都会开辟内存来存放数据,加了static无论你new多少个
对象永远只会有一块区域来共享它
理解三
既然方法加了static对于内存没有什么区别,而加static之后调用如此方便,还不需要new对
象。那么为什么我们经常使用的是:A a=new A(); a.doSome();这种形式而是不是做成
A.doSome()呢。(前提没有成员变量)。
原因:一:面向对象思想,当你把方法变成static之后,你A类的子类将无法覆盖其父类的
doSome方法。
二:你无法再将doSome方法中的一些变量,变成只属于该对象的变量。比如一个类里
面都有个a变量,如果你三个方法都是static的话,你三个方法都需要传递a参数。
让你的代码越加复杂
理解四
那么我们每次都要去调用这个方法都要new一个对象,这样会对jvm回收会加剧,写起来很麻
烦,创建和销毁对象是很消耗cpu的,那么就有了设计模式-单例模式。
理解五
为什么很多公司都使用spring ioc的模式,因为他解决以下几个问题,你不用每次都去为类
创建一个个单例对象(static带来的方便),第二它又非常容易扩展(面向对象的优点)。所以我上
文提到使用 spring ioc基本都可以把方法变成static来供上层调用。所以我对ioc的理解为:它为
我们节省了自己去创建单例的时间,并且让我们以面向对象的思想来调用和扩展代码。
当然对于一些不需要扩展或者变更不大的比如util类 它就非常适合使用static。面向对象让整个程序看起来更加合理,更加方便,更加容易理解。