final
在我们实际编程中,出于效率、安全等原因,有时我们想要一个值无法被更改,这时就需要用到final关键字了。final表示“这部分是不允许修改的!”。final可修饰数据、方法和类。
final数据
final修饰的数据在使用时是无法被更改的,也就是我们常说的常量。常量对于程序而言是有很大作用的,它可以减少程序运行的消耗。常量可分为编译期常量和运行期常量。
编译期常量在类加载时便完成了初始化,因此在类加载之后是不能被更改的。编译器常量可以在编译器执行相应的计算的式子,对于编译器常量而言,只能使用基本的数据类型二期而且必须在最初定义时就进行初始化。
运行期常量可以根据对象的不同而表现不同,它既可以是基本的数据类型也可以是引用类型。对于基本数据类型而言,其不可变的是内容,而对于引用数据类型不可变的是其的引用,引用所指向的内容是可变的。
final方法
final修饰的方法是不能被继承和修改的,因此可以利用final关键字来防止子类对于方法的修改。也就是父类的final方法并被子类覆盖,子类不能存在一个与父类一样的方法,举例如下:
//父类
public class Test2 {
public final void show()
{
System.out.println("this is test2");
}
}
//子类
public class Test3 extends Test2 {
public void show()
{
System.out.println("this is test3");
}
public static void main(String[] args) {
Test3 t=new Test3();
t.show();
}
}
这样子类将报错,删除final关键字则可以正常运行(此时相当于子类重写了父类的方法,将输出“this is test3”)。除此之外,添加了final关键字的方法在调用时将会减少一定的调用的开销。
final类
final修饰类则表明这个类是一个最终类,最终类不允许偶其他类来继承它,而且不允许这个类存在任何变化。final类中的方法是默认final类型的,成员变量可以是final也可以是非final的。
final参数
在实际编程中,我们还可以用final来修饰参数,这样这个参数的值是不可改变的,如果在使用中尝试修改这个值则会报错。
总结:
1)final关键字可以修饰类、方法、属性和局部变量。
2)final修饰的属性初始化可以在编译器也可以在运行期,初始化之后不可改变。
3)final修饰的属性如果是基本数据类型,则后续不能改变;如果修饰的是引用类型,则该引用不可更改,但是引用所指向的值可以改变,因为该final只将这个引用设置为常量。
4)final修饰的方法不可被更改,但是如果该方法不是private类型的话,可以被子类所调用。final修饰的类不可被继承。
static和final联合使用
1)使用范围为二者的交集:成员变量、方法和类
2)修饰成员变量时一旦复制则不可被更改,可以通过类名直接调用
3)修饰方法时不可被重写,可通过类名直接调用。
4)修饰类时不可被继承。