浅谈Java中final关键字
1.前言
final关键字是Java程序代码中常见的关键字,可理解为“最终的,最后的”。翻阅Java中String类源代码可见,String这个类就是用final修饰的。
那么这个关键字的作用是什么呢?请参考以下内容。
2.从以下三种方向去讨论final关键字
final | 结论 |
---|---|
final关键字修饰类 | 被final关键字修饰的类不能被继承 |
final关键字修饰方法 | 被final关键字修饰的方法不能被重写 |
final关键字修饰变量 | 被final关键字修饰的变量只能赋值一次 |
2.1 用final关键字修饰类
Java是面向对象的编程语言,“封装、继承、多态”是面向对象的三大特征。
被final关键字修饰的类,不能被继承。
例:
public class Test extends String {
//已知String类是用final关键字修饰,尝试采用此测试类继承String类
public static void main(String[] args) {
System.out.println("Hello World");
}
}
编译结果:
2.2 用final关键字修饰方法
被final关键字修饰的方法不能被重写。
例:
public class Test {
public static void main(String[] args) {
A a = new B();
a.m1();
}
}
class A {
public final void m1() {
System.out.println("A类的m1()方法执行了");
}
}
class B extends A{ // B继承A,重写m1()方法
public void m1() {
System.out.println("B类的m1()方法执行了");
}
}
编译结果:
2.3 用final关键字修饰变量
被final关键字修饰的变量只能被赋值一次。
2.3.1 final关键字修饰局部变量
赋值一次后,不能更改(即再次赋值)。
public class Test {
public static void main(String[] args) {
final int k = 20;
k = 30; // err
}
}
public class Test {
public static void main(String[] args) {
final int k;
k = 30; // 此次赋值是允许的
k = 20; // err
}
}
2.3.2 final关键字修饰实例变量
final修饰实例变量时,必须给实例变量手动初始化(赋值),不然编译报错。
public class Test {
final int k;
public static void main(String[] args) {
Test t = new Test();
}
}
public class Test {
final int k;
public Test(int k) {
this.k = k;
}
public static void main(String[] args) {
Test t = new Test(10);
}
}
上述使用构造方法给被final修饰的实例变量初始化是允许的。
public class Test {
final int k;
public Test(int k) {
this.k = k;
}
public static void main(String[] args) {
Test t = new Test(10);
t.k = 20; // err
}
}
3.final与static联合
在Java中,常用final和static联合修饰常量。
public static final double PI = 3.1415926;