结论:
final
修饰的类不能被继承- final修饰的方法不能被重写
- final修饰的方法可以被重载
- final修饰的变量
- 基本类型不能更改值
- 对象数据类型不能修改指向,但是可以修改内容
-
final
修饰的类不能被继承验证public class FinalTest { public static void main(String[] args){ Parent parent = new Son(); System.out.println(parent.getAge()); } static final class Parent { private int age; public final int getAge() { return age; } } static class Son extends Parent { } }
结果:编译不通过
java: 无法从最终FinalTest.Parent进行继承
-
final修饰的方法不能被重写
static class Parent { private int age; public final int getAge() { return age; } } static class Son extends Parent { @Override public int getAge() { return super.getAge(); } }
结果:编译不通过
java: FinalTest.Son中的getAge()无法覆盖FinalTest.Parent中的getAge() 被覆盖的方法为final
补充:final修饰的方法能否被重载
public class FinalTest { public static void main(String[] args){ Parent parent = new Parent(3); System.out.println(parent.getAge()); System.out.println(parent.getAge(5)); } static class Parent { private int age; public Parent(int age) { this.age = age; } public final int getAge() { return age; } public final int getAge(int age) { return age; } } }
结果:可以
3 5
-
final修饰的变量:
-
基本类型不能更改值
public class FinalTest { public static void main(String[] args){ final int a = 5; a = 10; } }
结果:不行
java: 无法为最终变量a分配值
-
对象数据类型不能修改指向,但是可以修改内容
public class FinalTest { public static void main(String[] args){ final int[] a = {1,2,3}; a = new int[5]; } }
结果:不行
java: 无法为最终变量a分配值
public class FinalTest { public static void main(String[] args){ final int[] a = {1,2,3}; a[0] = 5; System.out.println(Arrays.toString(a)); } }
结果:可以修改内容
[5, 2, 3]
-
综上所述,其实final只是表示一种不可变的语义。对于对象来说,只是说指向对象的指针不能变,但是通过指针修改内容是可以的
那么其实就有意思了,很多人说String只是因为value
通过final
修饰了,所以不可变。
其实在effective java
有介绍过,如果真的想要实现属性不可变。
- 把属性设置为
final
- 不要对外提供任何可以修改该属性的方法
其实这2点加起来,才是String
实现不可变的原因。