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它
### Java 中 `final` 关键字的作用和使用场景 #### 1. **`final` 修饰类** 当 `final` 用于修饰一个类时,该类无法被其他类继承。这种设计通常适用于那些不需要扩展或者不应该被子类化的类。通过这种方式可以防止潜在的错误或滥用继承带来的风险。此外,在 `final` 类中,所有的成员方法会被隐式地定义为 `final` 方法[^4]。 ```java // 定义一个 finalfinal class FinalClass { void display() { System.out.println("This is a final class."); } } ``` #### 2. **`final` 修饰方法** 如果一个方法被声明为 `final`,那么这个方法在其派生类中不能被重写(override)。这有助于保持某些核心功能的一致性,避免因子类更改父类行为而导致意外的结果。这种方法常用于框架开发中,以确保一些关键逻辑不会被破坏[^2]。 ```java class BaseClass { final void show() { // 此方法不可被覆盖 System.out.println("Final method cannot be overridden."); } } class DerivedClass extends BaseClass { @Override void show() { // 编译器会报错 System.out.println("Trying to override final method."); } } ``` #### 3. **`final` 修饰变量** 对于基本数据类型的变量来说,一旦赋值完成就不能再改变其值;而对于引用类型的数据而言,则意味着不能再指向另一个对象实例,但是原对象的内容仍然可能发生变化[^5]。 - 基本数据类型: ```java final int number = 10; number = 20; // 错误:试图重新分配给 final 变量 'number' ``` - 引用数据类型: ```java final StringBuilder sb = new StringBuilder("Initial"); sb.append(" Value"); // 合法操作,因为只是修改了原有对象的状态 System.out.println(sb.toString()); // 输出:"Initial Value" sb = new StringBuilder("New Object"); // 非法操作,尝试替换原有的引用地址 ``` 以上特性使得 `final` 成为了构建线程安全代码的重要工具之一,因为它能够减少共享资源之间的竞争条件[^3]。 --- ### 总结 综上所述,`final` 是一种非常有用的机制来提高程序的安全性和性能表现。合理运用它可以有效控制软件系统的灵活性与稳定性之间的平衡点[^1]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值