final关键字

About Me

欢迎各位读者访问,大家一起学习。

优秀是一种习惯♡♡♡

做更好的自己!

本人见识有限,写到博客难免有错误或疏忽的地方,还望各位大佬多多指点,在此表示感激不尽。♡♡♡


一:final关键字

  1. final是什么?

    final是java中的一个关键字,用来修饰类,方法,变量。一旦使用final关键字修饰,将不能再次改变这个引用。final也被称为**最终的**,不可改变的。

  2. final的特点?

    1. final表示最终的,不可改变的。
    2. final修饰的局部变量,只能赋一次值。
      public static void main(String[] args) {
              //定义一个局部变量用final修饰
              final int i = 100; 
              //被final修饰的局部变量无法重新赋值
              //i = 300;     //报错
          }
      
            //使用final声明一个局部变量k
              final int k;
            //第一次给k赋值
              k = 100;   //编译成功
            //第二次给k赋值
            //k = 200;   //编译失败:因为使用final修饰的局部变量只能赋一次值
              System.out.println(k);
      
    3. final修饰的方法,无法被覆盖重写
      //定义一个父类A
      class A {
          //使用final修饰method方法
          public final void method() {
          }
      }
      //子类B继承父类A
      class B extends A {
      //   下面会报错,因为使用final修饰的方法无法被覆盖重写
      //    @Override
      //    public void method() {
      //        super.method();
      //    }
      }
      
    4. final修饰的,无法被继承。
      //定义一个父类A
      final class A {
      }
      //子类B继承父类A
      //会报错:因为父类使用final关键字修饰,所以子类无法继承父类
      //class B extends A {
      
      //}
      
    5. final修饰的引用,只能指向一个对象。

      使用final修饰的引用,永远只能指向一个对象,无法在指向其他对象,并且指向的对象不会被垃圾回收机制回收,直到方法结束才会释放空间。

      注意:虽然final指向的对象A后不能在指向其他对象,但是对象A内部的数据还是可以修改。

      public class FinalTest03 {
          public static void main(String[] args) {
              //创建一个person对象
              Person p  = new Person(20);
              //打印输出age
              System.out.println(p.age);  //20
              //创建一个Person对象使用final修饰
              final Person p1 = new Person(30);
              //编译报错,因为不管变量是引用变量还是成员变量只要被final修饰都只能赋值一次值
              //p1 = new Person(40); //编译报错
              //p1 = null;    //编译报错
              p1.age = 40;   //编译成功
              System.out.println(p1.age); //40
          }
      }
      //定义一个person对象
      class Person {
          int age;
          //无参构造
          Person(){
      
          }
          //有参构造
          Person(int age){
              this.age = age;
          }
      }
      

内存图理解:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LlInvYdA-1636361416778)(https://gitee.com/tornado010930/images/raw/master/image-20211108144914330.png)]

  1. final修饰的实例变量必须手动初始化,不能采用系统默认值。

    final修饰的实例变量,系统不负责赋默认值,程序员必须手动赋值。这个手动赋值在变量后面赋值可以,在构造方法中赋值也可以。

    class Hello{
        //使用final修饰的实例变量必须手动赋值
       final int a = 100;
       //可以在构造方法中赋值,但是必须赋值。
       final String b;
        Hello(){
            this.b = "HelloWorld";
        }
    }
    
  2. final修饰的实例变量一般和static联合使用,称为常量。

    使用final修饰的变量不能改变,如果要是创建100个对象,就会在堆内存中开辟100块空间,而其中被final修饰的值都是相同的。所以这样会耗费空间,所以使用static修饰之后就会随类的加载而加载。一个类中只有一份,所有的对象共有,存储在方法区,经常被称为常量。常量一般全部为大写字母,如果有多个字母可以使用下划线分割:例如 static final Double PI = 3.1415926;

    /**
     * @author Tornado
     * @date 2021/11/8 16:10
     */
    public class FinalTest05 {
        public static void main(String[] args) {
            //因为使用static修饰所以直接通过类名.调用
            String country = Person01.COUNTRY;
            System.out.println(country);    //中国
        }
    }
    class Person01{
        String name;
        int age;
        //使用static和final修饰属于常量
        static final String COUNTRY = "中国";
    }
    
    
    

不要在最能吃苦的年纪选择了安逸!!! — Tornado♥

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值