一,final修饰类
fianl修饰符如果修饰类的话就代表该类不可以被继承,即不允许被继承;
public final class NoExtends{}
如此,NoExtends类就不可以被继承了,即下面的代码就会报错
public calss ExtendsTest extends NoExtends{} //这是不可以的
由于NoExtends类有了final的修饰而无法被调用。类似的比如Java中的String类也是final修饰的,也即String类不允许被继承不允许扩展其方法或属性。
二,final修饰成员变量
final修饰成员变量之后就意味着该成员变量不能够被修改,由于外界无法修改该成员变量的值,故而其创建时就需要被赋值或者在其构造方法处赋值。如果final变量没有被赋值则会报错,且只能赋值一次。
private final int FinalPara = 5;
三,final修饰静态变量
private final static double Final_Para_Static = 6.6;
// TODO 或者也可以在static代码块儿内赋值
//static{
// Final_Para_Static = 6.6;
//}
对于控制可见性的修饰符诸如private,protected,public都是在类,属性,方法最前的位置,而在用final时是在这些修饰符之后的第二个位置。
四,final不能用来修饰构造方法
构造方法的名字与类的名字是一样的,构造方法与别的方法不一样,其不存在覆盖的可能,且子类也没有去覆盖构造方法的诉求。
五,final用来修饰方法
修饰方法之后该方法无法被子类覆盖
public final void describe(){
System.out.println("这是一个final修饰的方法哦~不能被覆盖");
}
那么上述在父类中的行为方法就无法在子类中覆盖了,尽管它是public,尽管子类继承了父类。
比如下面的子类中的代码就会报错
public void describe(){
System.out.println("子类覆盖了父类的方法吗?");
super.describe();
}
六,final修饰形式参数
如果用final修饰了形式参数,那么形式参数在被实际参数赋值之后,就不能再被赋值了
private double buy(final int count){}
七,final修饰局部变量
final也可以修饰局部变量,当然也是必须赋值且只能赋值一次
八,final修饰引用
这是个重头戏:引用被final修饰之后,虽然不能再指向其他对象,但是它指向的对象的内容是可变的。
即虽然我们的这个应用不能再指向其它的对象了,但是该引用指向的这个对象的内容仍然是可以被修改的。比如下面的代码,
public void describe(){
System.out.println(setname);
}
FinalObj.describe();
FinalObj.setName("变化该对象的名字");
FinalObj.describe();
这样的话describe方法中对于setname的描述还是会变化的。
九,final修饰数组
其实final对于数组的修饰跟final对于引用的修饰是有点儿类似的,对于被final修饰的数组而言,不能让这个数组指向别的数组,但是是可以修改这个数组中的元素的值的。