Final是java最常用的修饰符之一,我总结了以下几点:
1.final 修饰类,不用说被修饰的该类不能被继承,最典型的就是String
2.final 修饰成员变量 ,那么该成员变量必须在声明的时候被赋值,或者在构造函数中赋值,否则编译是不会通过的。
public class A {
final int a = 1;
} 或者
public class A {
final int a;
public A() {
a = 1
}
}
其次final修饰的成员变量初始化后不能再被更改。
3.final 修饰方法,该类的final方法不能被子类重写。注意:抽象类中的abstract修饰的抽象方法是必须被继承重写,因此final是不能和abstract一起用的,相互矛盾。
abstract final void A(); 是错误的
4.final 修饰参数,这个很初学者可能没有注意到。分为两种情况,一种是修饰基本类型变量,一种是修饰引用变量
修饰基本类型变
public void A(final String a) {
a = "aaaa";//编译时通过不了的
}
修饰引用变量
public class B {
int i = 0;
}
----------
public void A(final B b) {
b.i = 5;//编译是通过的,因为修饰引用变量,只有改变引用指向的堆地址,才会报错,这里指向的还是b实例,改变了他成员变量的值而已。
}
public void A(final B b) {
b = new B();//编译通过不了!
}