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

  • final修饰的类不能被继承
  • 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修饰的变量:

    1. 基本类型不能更改值

      public class FinalTest {
          public static void main(String[] args){
              final int a = 5;
              a = 10;
          }
      }
      

      结果:不行

      java: 无法为最终变量a分配值

    2. 对象数据类型不能修改指向,但是可以修改内容

      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. 不要对外提供任何可以修改该属性的方法

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

你可能感兴趣的:(Java,java,开发语言)