class="MsoNormal" style="text-indent: 18.0pt;">?
在语法定义上的区别:静态变量前要加static关键字,而实例变量(下面的变量包括一切静态【变量,方法,静态内部类】)前则不加。
?
在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。
上面这些事官方翻译过来的解释,很多人进入了一个误区,那就是静态方法和变量越多,程序运行占用的内存越大,程序效率越低,但实际上却不是这样
静态变量上面还有一个东西,叫做类,不知道大家有没有试过静态类
从上面可以看出,静态对类的修饰是非法的
,除非是内部类,内部类其实也可以看做是顶级类的一个变量
我们可以看出,静态的东西其实都是依附于普通类而存在的,系统为静态变量分配内存之前必须先为类分配一个内存
有些人都认为java会在一开始就为所有的类分配一个内存,但其实并不是这样
大家想想,我们做一个项目,第三方的jar包有多少,如果真的一开始就为所有的类分配一个内存的话那还得了?
那么何时为内分配内存呢?
在编程语言之中(汇编除外)都有引用这么一个概念,只有当我们引用这个类的时候jvm才会为该类分配内存,如import关键字,还有我们用类名.方法名(变量名)的时候
静态和非静态最大的区别其实还是在于内存分配上,静态变量从引用的时候开始分配内存,jvm至始至终都只会为静态成员分配一个内存空间,而一般成员则是在类加载的时候加载内存,因此并不是静态成员越多程序越垃圾。
在java之中的单例模式就是采用静态实例化的方式。
当然,也并非静态成员越多越好,因为静态成员的生命周期是从加载开始,当整个程序,所有的地方都没有引用他们的指针时才会被jvm回收,而非静态成员则有自己固定的生命周期,能够及时释放内存
一些不常用的东西,我们没有必要让他一直占着内存,但偏偏object之中finalize
方法并不能被我们手动调用释放内存,
这个方法其实只是告诉我们有这么一个东西,并不能被我们所掌控
因此在java之中,我们应该看情况使用静态还是非静态,合理利用内存,