首先它们之间的关系就像雷锋和雷峰塔的关系一样,压根没关系。之所以经常放在一起被问道是因为它们长的有点像,所以下面会分别进行分析。
1 final关键字
使用:final是Java里50个关键字的一个,final关键字可以用来修饰类、成员方法和成员变量。
final修饰类表示类不可被继承,如String类;
final class A{
}
// 编译器报错
class B extends A{
}
PS:String类为什么被设计成final可以看这篇介绍。
final修饰成员方法表示方法不可被重写,但可以被重载;
class A{
public final void method() {
}
public final void method(String num) {
}
}
class B extends A{
@Override
public final void method() {
} // 编译器报错
}
不可被重写是指子类不可声明与父类final方法一样的方法,除非父类final方法为private。
注意:子类重写父类方法,子类可以用final关键字修饰重写后的方法。
final修饰成员变量表示成员变量不可被修改
class A{
final int num = 2;
public void method() {
num = 3; // 编译器报错
final int number = 3;
number = 4; // 编译器报错
}
}
注意:
- 用final关键字修饰的成员变量在声明时必须完成初始化(为什么?),修饰局部变量时则没有要求。
class A{
final int num; // 编译器报错,建议初始化
public void method() {
final int number;
number = 4; // 编译通过
}
}
- 用final关键字修饰基本数据类型,表明变量的值不可改变,如java.lang.Math类中的PI和E是final成员,其值为3.141592653589793和2.718281828459045;final关键字修饰引用时,只能表明引用指向的对象不可变,但对象的内容可以变,如下面的示例:
class A{
int num;
public void method() {
final A a = new A();
a.num = 3;
a.num = 8;
a.num = 10; // 对象的内容可随意修改
a = new A(); // 因为指向新的对象,故编译不通过
}
}
- final修饰引用参数时,其值内容可以随意修改;
public class FinalTest {
public static void main(String[] args) {
A a = new A();
a.num = 1;
System.out.println("传引用前 :" + a