java中的final关键字

本文深入解析Java中的final关键字,涵盖其修饰类、方法、局部变量及成员变量的四种主要用法,强调final带来的不可变性及其对编程的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

final关键字

final关键字代表最终、不可改变的

常见的四种用法:

  1. 可以用来修饰一个类
  2. 可以用来修饰一个方法
  3. 可以用来秀是一个局部变量
  4. 可以用来修饰一个成员变量

我们将逐一分析这四种用法!

1. final关键字用来修饰类

1.1 格式:

public final class 类名称{
    //....
}

1.2 含义:当前这个类不能有任何的子类。(太监类)

1.3 注意:

  1. 太监类不可以有子类,但是可以有父类
  2. 太监类的所有方法都不能被覆盖重写,因为没有子类

2. final关键字用来修饰成员方法

2.1 格式:

修饰符 final 返回值类型 方法名称(参数列表){
    //方法体
}

2.2 含义:当final关键字用来修饰一个方法的时候,这个方法就是最终方法,也就是不能被覆盖重写。

2.3 代码演示:不能重写父类中的 final 方法

  • 2.3.1 来个父类

    public class Fu {
        //final 修饰过的方法
        public final void methodFinal(){
            System.out.println("这可是最终方法");
        }
    }
    
  • 2.3.2 再来个子类

    public class Zi extends Fu {
        /*错误写法,子类不能重写父类中的 final 方法,强写灰飞烟灭
        @Override
        public void methodFinal(){
            System.out.println("我偏要重写");
        }
        */
    }
    

2.4 注意:对于类和方法来说,abstract和final关键字是不能被同时使用的,因为自相矛盾,abstract修饰的方法是抽象方法,子类必须覆盖重写抽象方法才行,可如果加上了final后,该方法又不能被覆盖重写了,那我是覆盖好,还是不覆盖好呢?编译器报错之后,就什么都不用想了。

3. final关键字用来修饰一个局部变量

一旦使用final来修饰局部变量,那么这个变量就不能进行更改了

记住:“一次赋值,终身不变”

3.1 对于基本类型而言(int、double、float…)

只要保证有一次赋值即可,并且赋值之后再也不改变

对于基本类型而言,不可改变的是变量当中的数据不可改变

写法1final int num1;
num1 = 3; //正确

写法2final int num2 = 3; //

3.2 对于引用类型而言(除开基本类型,其它的都可叫引用类型)

对于引用类型而言,不可变的是变量中的地址值不可改变

代码演示:什么叫地址值不可改变

  • 创建一个引用类型,SuperStar类

    public class SuperStar {
        private String name;
    
        public SuperStar() {
        }
    
        public SuperStar(String name) {
            this.name = name;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }
    
  • 看main中的注释

    public class Demo06Main {
        public static void main(String[] args) {
            //创建一个SuperStar 对象叫周杰伦, 用 final 修饰
            final SuperStar star = new SuperStar("周杰伦");
            //star 里面存放的是什么?是指向周杰伦的地址,我现在把周杰伦的地址打印下来
            System.out.println(star);
            //star 经过 final 修饰之后,它存放的地址值将不可改变,我们尝试将 star 的地址改成 胖伦的地址
      //    star = new SuperStar("胖伦");  报错,star已经指向了周杰伦的地址,就不能再指向胖伦的地址
    
            //我们虽然不可再改变 star 指向的地址,但是我们可以改变地址指向的内容,把周杰伦改为乐坛天王
            star.setName("乐坛天王");
            //重新打印star的地址,发现地址值没有改变
            System.out.println(star);
            //打印地址指向的内容,发现周杰伦已经蜕变成乐坛天王
            System.out.println(star.getName());
        }
    }
    

4. final关键字修饰成员变量

4.1 成员变量和局部变量:

局部变量是在某个函数、方法里面的成员

成员变量是一个类中的数据成员

public class Student{
    private int num;  //成员变量
    
    public void method(){
        int num; //局部变量
    }
}

4.2 对于成员变量来说

final关键字修饰之后,这个变量也照样不可变,但是注意:

  1. 由于成员变量具有默认值,所以用了 final 之后必须手动赋值。
  2. 手动赋值,①可以选择直接赋值 (在声明时就给它赋值);②也可以选择构造方法赋值,但是无参构造方法中,必须对其赋一个初值,避免调用无参构造时,没有东西给它赋值。①和②只能选一个
  3. final修饰之后,该成员变量的setter就失去作用了,都不可改变了,还怎么set它
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值