概念及总结

final 在 Java 中是一个保留的关键字,可以声明成员变量、方法、类以及本地变量。一旦你将引用声明作 final,你将不能改变这个引用了,编译器会检查代码,如果试图将变量再次初始化的话,编译器会报编译错误

定义:Java 中,final 表示最终的,final 可以用来修饰的结构:类、方法、变量

  • final 用来修饰类:此类不能被其他类所继承。比如:String 类、System 类、StringBuffer 类
  • final 修饰方法:表明此方法不能被子类重写。比如:Object 类中的 getClass()
  • final 修饰变量:既可以修饰成员变量,也可以修饰局部变量,此时的”变量”其实就变成了”常量”,意味着一旦赋值,就不可更改
    • final 修饰成员变量
      • 可以考虑赋值的位置有:显式初始化、代码块中初始化、构造器中初始化
    • final 修饰局部变量:一旦赋值就不能修改
      • 方法内声明的局部变量:在调用局部变量前,一定需要赋值。而且一旦赋值,就不可更改
      • 方法的形参:在调用此方法时,给形参进行赋值。而且一旦赋值,就不可更改
  • static final 用来修饰属性:全局常量

final 修饰属性,可赋值位置示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class AA {

final int a = 1;
final int b;
final int c;

{
b = 2;
}

public AA() {
c = 3;
}
}

练习题

final 修饰 x,就不能再修改操作,++x 对 x 进行了自增,改变了 x ,如果改成 return x + 1 就是正确的,因为 x + 1 并未对 x 进行操作,只是返回一个数值

1
2
3
4
5
6
public class Something {
public int addOne(final int x) {
return ++x;
// return x + 1;
}
}

final 是针对 o 的,o.i++ 不影响,但是如果 o = new Othor() 就会错误,因为改变了 o

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Something {
public static void main(String[] args) {
Other o = new Other();
new Something().addOne(o);
}
public void addOne(final Other o) {
// o = new Other();
o.i++;
}
}
class Other {
public int i;
}