一、总体概览

- final是Java中的一个关键字
-
二、final修饰变量
2.1 final修饰局部变量

public class FinalTest01 {public static void main(String[] args) {final int i;i = 1;// 只能赋一次值!!!//i = 2; // Variable 'i' might already have been assigned to}}
2.2 final修饰实例变量

如果没有为实例变量手动赋初值,则系统会为其赋一个默认值
public class FinalTest01 {int i;public static void main(String[] args) {FinalTest01 finalTest01 = new FinalTest01();System.out.println(finalTest01.i); // 0}}
实例变量是在构造方法执行过程中赋值的,因此,对于final修饰的实例变量,系统不会为其赋初值,而是要求程序员手动赋值。可以在变量后面直接赋值,也可以利用构造方法为其赋值
class A{final int i;public A(){i = 0;}}
2.3 常量
final修饰的实例变量一般和static联合使用,这样的变量叫做常量,常量名全部大写,并用下划线分隔
- 为什么呢?因为实例变量是存储在堆中的,每个对象都有一份,既然已经使用final修饰实例变量了,那么就代表该变量是不可变的了,所以就没有必要一个对象一份了,而是将其同时使用static修饰,变成一个常量,这样做可以节省内存空间
- 实际上常量和静态变量都是存储在方法区中的,都是在类加载时初始化;唯一的区别就是:常量不可变;常量一般是public的
三、final修饰类
final修饰的类无法被继承!!! ```java final class A{
}
class B extends A{ // 该类无法通过编译,Cannot inherit from final ‘org.example.A’ // 不能从最后的’org.example.A’继承 }
<a name="uyR9h"></a># 四、final修饰方法final修饰的方法**无法重写**!!!```javaclass A{public final void f(){System.out.println("A.f()");}}class B extends A{public void f(){// 无法通过编译// 'f()' cannot override 'f()' in 'org.example.A'; overridden method is final}}
五、final修饰引用
final修饰的引用一旦指向了某个对象,则不能再指向其他对象,但是该引用指向的对象中的内部数据可以改变
public class FinalTest01 {
public static void main(String[] args) {
final A a = new A();
//a = new A(); // Cannot assign a value to final variable 'a'
a.i = 10;
System.out.println(a.i); // 10
}
}
class A{
int i = 0;
}
