Java final

final

final修饰类,方法,基本类型变量,引用的时候分别由不同的意思


final修饰类

当Hero类被修饰成final的时候,表示Hero不能够被继承

其子类被修饰final的时候,也会出现编译错误

public final class Hero extends Object{
    
    String name;
    
    float hp;
    
}

final修饰基本类型变量

final修饰基本类型变量,表示该变量只有一次赋值机会

例子

public class main{
    public static void main(String [] args){
        final int hp;
        hp = 5;
        hp = 6; //这里就会报错
    }
}

final修饰引用

h引用被修饰成final,表示该引用只有1次指向对象的机会

但是,依然可以通过h引用修改对象的属性值,因为hp没有被final修饰

public class Hero{
    String name;
    
    float hp;
    
    float armor;
    
    int moveSpeed;
    
    public static void main(String[] args){
        final Hero h;
        h = new Hero();
        h = new Hero();//该行会报错,因为h引用只有1次指向对象的机会
        h.hp=5;
        h.hp=6;
        //这样是行得通的,因为final只修饰的是h引用,与对象属性无关;
    }
}

问题

设计一个类SomeString,继承 String类。 能否继承?

答:不能,按住Ctrl 进入String类可以看见,String是被final修饰的类

被final修饰的类不能够被继承

### Java 中 `final` 关键字的使用场景及规则 #### 1. 层面 当声明一个为 `final` 时,表示该不能再被其他继承。这种特性通常用于定义一些核心的基础或者工具,防止其功能被意外扩展或篡改。例如,在 JDK 的标准库中,许多基础如 `String` 和部分包装(如 `Integer`, `Boolean` 等)都被标记为 `final`,以确保它们的行为不会因继承而改变[^3]。 ```java // 定义一个不可被继承 public final class FinalClass { public void display() { System.out.println("This is a final class."); } } ``` #### 2. 方法层面 如果在一个中将某些方法声明为 `final`,则这些方法无法在子中被重写(Override)。这有助于保护特定的功能逻辑不被更改,从而提升代码的安全性和稳定性。特别是在多线程环境中,这种方法可以有效避免由于方法行为变化而导致的竞争条件或其他并发问题[^4]。 ```java class Parent { public final void show() { // 此方法不能被重写 System.out.println("Final method in parent class"); } } class Child extends Parent { @Override public void show() { // 编译错误:试图覆盖最终方法 System.out.println("Trying to override final method"); } } ``` #### 3. 变量层面 对于变量而言,`final` 主要用来创建常量。一旦赋值完成,`final` 声明的变量就不能再重新分配新的值。需要注意的是,如果是基本数据型的变量,则整个数值保持不变;而对于引用型的数据结构来说,虽然指针本身不可变,但其所指向的对象内部状态仍可能发生变化[^1]。 - **基本数据型** ```java final int MAX_VALUE = 100; // 不允许再次修改MAX_VALUE的值 System.out.println(MAX_VALUE); ``` - **引用数据型** ```java final StringBuilder sb = new StringBuilder("Initial Value"); sb.append(", Modified!"); // 合法操作,因为只是改变了对象的内容而非替换对象本身 System.out.println(sb.toString()); // 输出:"Initial Value, Modified!" ``` #### 4. 局部变量 除了成员变量外,还可以把函数内的局部变量设置成 `final` 形式来约束它的生命周期只限于此作用域范围内,并且仅能初始化一次之后便固定下来不再变动。 ```java void testMethod(){ final int localVar = 5; System.out.println(localVar); // 下面这条语句会报错,因为localVar已经被声明为final并赋予初始值 // localVar = 10; } ``` #### 规则总结 - 被指定为 `final` 的实体具有不可变更性。 - 应用到不同上下文中分别代表不同的含义——阻止派生、锁定实现细节以及确立恒定关系等。 - 需要注意区分原始型态与复合型态下应用的区别之处。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值