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修饰来保证不会发生指向改变。

  • 25
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值