Java中final关键字(final修饰的方法能否被重载?)

本来想试试final能不能被重载,后来想想还是都整理一下吧。

  1. 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进行继承
  2. 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
  3. 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有介绍过,如果真的想要实现属性不可变

  1. 把属性设置为final
  2. 不要对外提供任何可以修改该属性的方法

其实这就是String实现不可变的原因,没有提供任何可以修改的方法,并且本身使用final修饰来保证不会发生指向改变。

经验分享 程序员 微信小程序 职场和发展