当前位置: 首页 > news >正文

java-final 关键字

## Java中的`final`关键字

### 1. `final`关键字的基本概念

`final`是Java中一个非常重要的关键字,用于声明常量、阻止继承和重写,确保类、方法和变量的不可变性。具体来说,`final`关键字可以用来修饰类、方法和变量(包括成员变量和局部变量)。

### 2. 修饰类

当一个类被声明为`final`时,意味着这个类不能被继承。使用`final`修饰类可以防止其它类从该类派生子类,从而保护类的完整性。例如:

```java
final class Animal {
    void makeSound() {
        System.out.println("Animal makes a sound.");
    }
}

// 错误示范
// class Dog extends Animal {
//     void makeSound() {
//         System.out.println("Dog barks.");
//     }
// }
```

在上述代码中,`Animal`类被声明为`final`,因此不能被继承。如果尝试创建`Dog`类继承自`Animal`,编译器会报错。

### 3. 修饰方法

当一个方法被声明为`final`时,意味着这个方法不能被子类重写。这对于确保方法的行为在继承层次结构中保持一致性非常有用。例如:

```java
class Animal {
    final void makeSound() {
        System.out.println("Animal makes a sound.");
    }
}

class Dog extends Animal {
    // 错误示范
    // @Override
    // void makeSound() {
    //     System.out.println("Dog barks.");
    // }
}
```

在上述代码中,`Animal`类的`makeSound`方法被声明为`final`,因此不能在`Dog`类中重写。如果尝试重写该方法,编译器会报错。

### 4. 修饰变量

#### 4.1 修饰成员变量

当一个成员变量被声明为`final`时,意味着这个变量在初始化之后不能被改变。`final`成员变量必须在声明时或在构造函数中进行初始化。一旦被赋值,就不能再修改。例如:

```java
class Circle {
    final double PI = 3.14159;
    final double radius;

    Circle(double radius) {
        this.radius = radius;
    }

    double calculateArea() {
        return PI * radius * radius;
    }
}

public class Main {
    public static void main(String[] args) {
        Circle circle = new Circle(5.0);
        System.out.println("Area: " + circle.calculateArea());
        // 错误示范
        // circle.PI = 3.14;
    }
}
```

在上述代码中,`PI`和`radius`是`final`成员变量。`PI`在声明时被初始化,而`radius`在构造函数中被初始化。一旦初始化,它们的值不能再被改变。

#### 4.2 修饰局部变量

当一个局部变量被声明为`final`时,意味着这个变量在初始化之后不能被改变。`final`局部变量通常用于确保在方法或代码块中某个值的不可变性。例如:

```java
public class Main {
    public static void main(String[] args) {
        final int number = 5;
        System.out.println("Number: " + number);
        // 错误示范
        // number = 10;
    }
}
```

在上述代码中,`number`是一个`final`局部变量。一旦被初始化,它的值不能再被改变。

#### 4.3 修饰参数

当一个方法参数被声明为`final`时,意味着在方法内部不能改变这个参数的值。这在确保参数在方法内部的不可变性时非常有用。例如:

```java
class Calculator {
    int add(final int a, final int b) {
        // 错误示范
        // a = a + 1;
        return a + b;
    }
}

public class Main {
    public static void main(String[] args) {
        Calculator calculator = new Calculator();
        System.out.println("Sum: " + calculator.add(3, 4));
    }
}
```

在上述代码中,`add`方法的参数`a`和`b`被声明为`final`,因此在方法内部不能改变它们的值。

### 5. 修饰引用类型

当一个引用类型变量(如对象引用或数组引用)被声明为`final`时,意味着这个引用不能被重新赋值,但是对象的内容可以被修改。例如:

```java
class Person {
    String name;

    Person(String name) {
        this.name = name;
    }
}

public class Main {
    public static void main(String[] args) {
        final Person person = new Person("John");
        System.out.println("Name: " + person.name);
        person.name = "Doe";  // 允许
        System.out.println("Name: " + person.name);
        // 错误示范
        // person = new Person("Jane");
    }
}
```

在上述代码中,`person`引用被声明为`final`,因此不能重新赋值为新的`Person`对象,但可以修改`person`对象的内容(如`name`属性)。

### 6. 不变对象

通过组合使用`final`关键字,可以创建不变对象(Immutable Objects)。不变对象一旦创建,它的状态就不能被改变。例如:

```java
final class ImmutablePoint {
    private final int x;
    private final int y;

    ImmutablePoint(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }
}

public class Main {
    public static void main(String[] args) {
        ImmutablePoint point = new ImmutablePoint(1, 2);
        System.out.println("X: " + point.getX() + ", Y: " + point.getY());
        // 错误示范
        // point.x = 3;
    }
}
```

在上述代码中,`ImmutablePoint`类是一个不变对象。`x`和`y`属性被声明为`final`且私有,并且只能通过构造函数进行初始化。类本身也被声明为`final`,因此不能被继承,确保对象的不可变性。

### 7. `final`关键字的优势

使用`final`关键字有以下几种优势:

#### 1. 提升性能

`final`关键字可以提升性能。由于`final`变量的值在编译时就已确定,编译器可以对它们进行优化。例如,编译器可以将对`final`变量的访问替换为直接访问常量。

#### 2. 增加安全性

`final`关键字可以增加代码的安全性。通过将类、方法或变量声明为`final`,可以防止它们被修改,从而减少错误的可能性。例如,不变对象在多线程环境下是线程安全的,因为它们的状态不能被修改。

#### 3. 提高可读性

`final`关键字可以提高代码的可读性。通过明确声明某些变量、方法或类是不可变的,其他开发者在阅读代码时可以更容易理解它们的行为和用途。

### 8. 使用`final`关键字的注意事项

虽然`final`关键字有很多优点,但在使用时也需要注意一些问题和局限性:

#### 1. 适度使用

过度使用`final`关键字可能会使代码显得冗长和复杂。在实际开发中,应根据需要和场景合理使用`final`关键字。

#### 2. 确保初始化

`final`变量在声明后必须被初始化,并且只能被赋值一次。需要确保在声明时或在构造函数中对`final`变量进行初始化,否则会导致编译错误。

#### 3. 引用类型的特殊性

对于引用类型的`final`变量,虽然引用本身不能被改变,但对象的内容可以被修改。在设计不变对象时,需要特别注意这一点,确保对象的状态不会被修改。

### 9. 总结

`final`是Java中的一个重要关键字,用于声明常量、阻止继承和重写,确保类、方法和变量的不可变性。通过使用`final`关键字,可以提升代码的性能、安全性和可读性。然而,在使用时也需要注意合理使用和确保初始化。通过正确理解和应用`final`关键字,可以编写出更加稳定、可靠和易维护的Java程序。

http://www.lryc.cn/news/372052.html

相关文章:

  • ARM32开发--IIC软实现
  • 在有向无环图(DAG)中实现拓扑排序与最短路径和最长路径算法
  • SQLServer按照年龄段进行分组查询数据
  • 开放式耳机哪个品牌质量比较好?2024高性价比机型推荐!
  • Blender骨骼创建
  • DevExpress WPF中文教程:Grid - 如何完成列和编辑器配置(设计时)?
  • 高考完的三个月想自学点编程,有没有什么建议
  • 运维开发(DevOps):加速软件交付的关键方法
  • Vue前端环境搭建:从四个方面、五个方面、六个方面和七个方面深度解析
  • 农业领域科技查新点提炼方法附案例!
  • 【Bazel入门与精通】 rules之属性
  • Elementor无需第三方插件实现高级下拉菜单/巨型菜单
  • 【数学】什么是傅里叶变换?什么是离散傅里叶变换?什么是拉普拉斯变换?
  • opencv安装笔记 各种平台
  • 前端开发中的热更新原理
  • unix环境高级编程第2版:深入探索UNIX编程的奥秘
  • 力扣42 接雨水
  • 【代码随想录】【算法训练营】【第35天】[134]加油站 [135]分发糖果 [860]柠檬水找零 [406]根据身高重建队列
  • Talk|新加坡国立大学贾鑫宇:适用于高自由度机器人的运动控制器
  • 【npm】console工具(含胶囊,表格,gif图片)
  • OpenCV读取图片
  • HBase中的CRUD
  • C/C++学习笔记 C语言中的\0以及查找字符串中字符出现的频率
  • 在C#中,有多种方式可以实现每天在指定的时间清空数据库数据。下面列出几种常用的方法,并提供简要的实现思路:
  • 深入理解java设计模式之单例模式
  • 程序员自由创业周记#36:Gap Year
  • Java 类与对象 -- Java 语言的类与对象、构造器、static、final、包和 JAR
  • MTK平台纯色背景抑制
  • Linux iptables使用详解
  • 算法02 递归算法及其相关问题