1.final应用场景:
1.1 一个永不改变的编译时常量。
1.2 一个运行时被改变的值,并且不希望其值被改变。
2.final修饰变量、方法和类
2.1 final修饰变量:修饰基本类型变量时,变量的值无法改变。修饰引用变量时,变量的指向地址无法改变,但变量指向的对象是可以改变的。
2.2 final修饰方法:只有在想明确禁止覆盖时,才将方法设置为final的。private默认为final的,显式添加没有任何意义。
2.3 final修饰类:此时不容许类被继承,标志该类方法不可以被覆盖。
package extends1.one;
class Sub extends Sup{
public void funSup(){
System.out.println("sub funSup...");
}
public void finalPrivate(){
System.out.println("sub finalPrivate...");
}
public void fun(){
System.out.println("sub fun...");
}
}
public class Sup{
public void funSup(){
System.out.println("sup funSup...");
}
//该方法不能在Sup子类中覆盖,否则编译报错
public final void finalSup(){
System.out.println("sup finalSup...");
}
//子类中可以有与该方法相同的方法,但是两个方法是没有任何关系的,
//private方法对外部而言可以看做不存在包括其子类
private void finalPrivate(){
System.out.println("sup finalPrivate...");
}
public static void main(String[] args) {
Sup s=new Sub();
s.funSup();
//private方法是无法与外部方法之前有任何联系的,
//即使子类中含有finalPrivate()方法,但和父类方
//法没有任何关系,对父类而言该方法没有被覆盖。
s.finalPrivate();
//The method fun() is undefined for the type Sup
//s.fun();
((Sub)s).fun();
((Sub)s).finalPrivate();
/* Output:
* sub funSup...
* sup finalPrivate...
* sub fun...
* sub finalPrivate...
*/
}
}
3.用final来修饰引用类型的意义不大,因为在使用时控制的只是引用指向地址不变,并不能控制引用指向对象保持不变。
。