这篇文章不是对private,public,protected进行说明,只要学过面向对象的程序设计,对以上三个关键再熟悉不过了。这里要说的是另外两个关键字---static和final。
1. static关键字
在我们创建一个类的实例时(对象),通常使用new方法,这样这个类的数据空间才会被创建,其方法才能被调用。
但是,有时候我们希望一个类虽然可以被创建n个对象(显然这n个对象的数据空间是不相同的),但这n个对象的某些数据是相同的,即不管这个类有多少的实例,这些数据对这些实例而言之有一份内存拷贝。还有这种情况,即有时希望某个方法不与包含它的类的任何实例(对象)联系在一起。即使没有创建对象,也能调用这个方法。
通过static就能实现这样两个目的,static关键字可以用于属性和方法。
下面是Thinking in java中对static的一段精辟阐述。
当声明一个事物是static时,就意味着这个数据或方法不会与包含它的那个类的任何对象实例关联在一起。所以,即使从未创建某个类的任何对象,也可以调用其static方法或访问其static数据。 |
例:对于静态属性
class StaticTest{ public static int i = 0; } |
对于上面这个类,即使我们不创建他的实例,也可以引用其i属性,引用方法很简单在另外一个地方使用StaticTest.i即可得到这个属性的值。
对于静态方法
class StaticFunc{ public static int incr(int i){ i++; return i; } } |
在外部,可以直接使用StaitcFunc.incr(8)的方式调用这个方法。需要说明的是在static方法中药使用外部变量时,这个外部变量也要为static类型(这点不难理解)。
2. final关键字
故名思义,final即最后的,最终的,不可改变的。实际上,在java中,final的作用也基本上是这样的,其原因可能是出于效率或设计。final关键字可以应用于属性,方法和类。当然在这三个方面的应用是有细微差别的。
(1)final数据
使用final数据,目的是想告诉编译器这个数据一经初始化就不会再改变。
对于基本类型,final使数值恒定不变,一个既是static又是final的字段只占据一段不能改变的存储空间;而对于对象引用,final使引用恒定不变。一旦引用被初始化指向一个对象,就无法在把他改为指向另一个对象,但对象自身是可改变的(同样适用于数组,其也是对象)。 |
带final的数据定义格式如下
public final int i = 0;
更一般的定义如下
public static final int VAL_STAT = 10;
对于如上的定义,要注意定义格式,带有恒定初始值(编译时刻变量,非运行时刻)的static final 基本类型全用大写字母命名,并且字与字之间用下划线隔开(这是规范)。
对于以上两种格式的定义,第二种更常用。
(1)final方法
使用final方法原因有两个。
第一,把方法锁定,任何继承类都不能修改它(不被覆盖)。
第二,效率。针对该方法的所有调用都转为内嵌调用。即在编译过程中,当编译器发现一个final方法调用时,它会以该final方法体中的实际代码的副本来代替方法调用,而不是传统的方法调用(本程序指针压栈,程序指针转向调用代码,执行后返回结果,原调用程序指针出栈)。
对于final方法,并不是很常用,所以这里不列出例子了。
(1)final类
使用final类的原因只有一个,就是你不打算继承该类,也不许其他人继承。这个类永远不需改变。
对于final方法和final类,最好慎用。即使你很牛,认为你的方法或类是万能的,不需继承修改。但你应该知道“应用是静止的,需求是变化的”
