final修饰符的难点记录

本文深入探讨了Java中final关键字的多种用途,包括空白final变量、static final与final的区别、final方法的作用、private final修饰符的应用及final类的特点。

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

      今天看到了final字段这块,把不会的或者难点记录下来。

第一,空白final。

       书上说的有点绕,说空白final更灵活。但之前又说过final变量必须进行初始化,这是什么意思呢,二者难道有冲突吗?

其实空白final的核心就是:构造器赋值。
package com.test;
/**
 * Created with IntelliJ IDEA.
 * User: 菜鸟大明
 * Date: 14-6-21
 * Time: 下午7:39
 * To change this template use File | Settings | File Templates.
 */
public class FinalTest {
    private final int b;
    public FinalTest(int inputInt) {
        b = inputInt;
    }
}


第二,static final 同 final 的区别。

        以前我提过,static字段只会初始化一次,无论你创建多少个对象。那么static final 和 final的区别也在此。


class FinalTest2 {
    private static Random random = new Random();
    private final int a = random.nextInt(100);
    private static final int b = random.nextInt(100);

    public static void main(String[] args) {

        FinalTest2 test1 = new FinalTest2();


        // 再次创建对象FinalTest2,a变量被重新初始化,b变量因static的原因,不再执行初始化,而保留第一次初始化的值
        FinalTest2 test2 = new FinalTest2();

        System.out.println("第一次初始化 a = " + test1.a);
        System.out.println("第二次初始化 a = " + test2.a);
        System.out.println("第一次初始化 b = " + test1.b);
        System.out.println("第二次初始化 b = " + test2.b);
    }
}


执行结果为:

第一次初始化 a = 33
第二次初始化 a = 64
第一次初始化 b = 20
第二次初始化 b = 20

第三,关于final修饰的方法作用—方法锁定、效率。


       方法锁定简单,防止子类继承,再重写之。例如 String

       效率这块,现在的JAVA 5以上的版本,JVM会自动处理这块的效率,所以,不需要考虑为了加快调用速度而是用final。

第四,private final修饰。

       当你要隐藏某种实现,并确保这种实现在任何情况都不需要修改的情况下,才能使用这个。

第五,final类。

       不想被任何人继承。同第四点类似,只是范围扩大到类。final类中所有的方法默认为final方法、所有的变量默认为final变量。
<think>好的,用户问的是关于Java中的final修饰符,需要我用中文介绍。首先,我得回顾一下final在Java中的各种用法,确保自己理解正确。然后考虑用户可能的背景,可能是刚开始学Java,或者已经有一定基础想深入理解。需要分情况说明final的不同应用场景,比如变量、方法、类,还有在参数和匿名类中的使用。 用户的问题比较简短,可能需要一个全面的介绍,但也不能太冗长。得用简洁的语言把每个点讲清楚,同时举例子帮助理解。比如,final变量分为基本类型和引用类型,要说明它们的区别,比如引用类型变量不能指向其他对象,但对象内容可以修改。这点容易混淆,可能需要重点强调。 另外,final方法和final类的作用,防止继承或重写,这部分要说明设计上的考虑,比如安全性和不可变性。还有final参数在匿名类中的使用,这里可能涉及到闭包的概念,需要简单解释。 还要注意用户可能对某些术语不熟悉,比如“不可变类”,可能需要用例子说明,比如String类。同时要避免使用过于专业的术语,保持口语化,让解释更易懂。 可能用户的实际需求是想了解如何正确使用final来编写更健壮的代码,或者面试中遇到相关问题。所以除了基本用法,可以提到final在多线程环境下的作用,比如不可变对象的线程安全性,这也是实际开发中的重要点。 检查有没有遗漏的部分,比如局部变量也可以声明为final,或者在Java8中lambda表达式和final的关系,不过可能用户不需要太深入,暂时先提一下局部变量即可。 最后整理结构,先总述final的作用,再分点详细说明,每个部分举例子,确保用户能够理解不同场景下的应用。避免错误,比如final类中的方法是否默认final,实际上不是,需要明确说明只有类被final修饰,方法不能被重写,但如果没有final修饰符,子类还是可以重写非final方法。这点容易误解,需要澄清。 总结下来,回答要涵盖变量、方法、类、参数,每个部分简明扼要,例子贴切,最后总结final的好处,帮助用户全面理解。</think>`final` 是 Java 中的一个修饰符,用于表示“不可变”的语义,具体作用取决于它修饰的对象。以下是不同场景下的用法和意义: --- ### 1. **修饰变量(基本类型变量)** - 表示变量一旦被赋值后,**值不可再修改**(类似常量)。 - 必须显式初始化(直接赋值或在构造方法/代码块中赋值)。 ```java final int MAX_VALUE = 100; // MAX_VALUE = 200; // 编译报错,无法修改 ``` --- ### 2. **修饰变量(引用类型变量)** - 表示变量引用的**对象地址不可变**,但对象内部的内容可以修改。 ```java final List<String> list = new ArrayList<>(); list.add("Hello"); // 允许操作对象内容 // list = new ArrayList<>(); // 编译报错,不能指向新对象 ``` --- ### 3. **修饰方法** - 表示方法**不能被子类重写**(Override),常用于防止继承破坏逻辑。 ```java class Parent { public final void show() { System.out.println("不可重写的方法"); } } class Child extends Parent { // @Override public void show() { ... } // 编译报错 } ``` -- ### 4. **修饰类** - 表示类**不能被继承**,例如 Java 的 `String` 类就是 `final` 的。 ```java final class ImmutableClass { ... } // class SubClass extends ImmutableClass { ... } // 编译报错 ``` --- ### 5. **修饰方法参数** - 表示参数在方法内部**不能被重新赋值**(常用于匿名内部类或 Lambda 表达式)。 ```java public void process(final int x) { // x = 10; // 编译报错,参数不可修改 } ``` --- ### **关键设计意义** - **安全性**:防止变量被意外修改(如常量、配置参数)。 - **线程安全**:`final` 变量在多线程中天然安全(若正确初始化)。 - **优化**:编译器可能对 `final` 进行优化(如内联常量)。 --- ### **注意点** - `final` 并不等同于“完全不可变”。若修饰引用类型,对象内部状态可能仍可变。 - 与 `finally`(异常处理)和 `finalize()`(垃圾回收)无关,仅名称相似。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值