final 关键字的使用方法及应用场景解析

简介: 本内容详细介绍了Java中final关键字的使用方法及其在组件封装中的应用。包括final变量(基本类型和引用类型)、final方法(防止子类重写)、final类(禁止继承)的用法,以及如何通过final实现常量类、工具类、不可变数据对象和核心逻辑的封装。这些技术点对于提升代码的安全性、稳定性和可维护性具有重要意义,是Java开发中的核心技术之一。附有面试资料链接,供学习参考。

相关使用方法

1. final变量使用方法

基本数据类型常量使用:

final double PI = 3.14159;
// PI = 3.14;  // 编译错误,不能修改final变量

引用类型常量使用:

final List<String> NAMES = new ArrayList<>();
NAMES.add("Alice");  // 合法,修改对象内容
// NAMES = new ArrayList<>();  // 非法,不能修改引用

2. final方法使用方法

父类中定义final方法:

public class BaseClass {
   
    public final void printInfo() {
   
        System.out.println("This is a final method.");
    }
}

子类不能重写final方法:

public class SubClass extends BaseClass {
   
    // 以下代码会导致编译错误
    // @Override
    // public void printInfo() { ... }
}

3. final类使用方法

定义final类:

public final class UtilityClass {
   
    public static int add(int a, int b) {
   
        return a + b;
    }
}

不能继承final类:

// 编译错误:无法继承final类
// public class ExtendedUtility extends UtilityClass { ... }

组件封装方法

1. 常量类封装

将相关常量封装在一个final类中:

public final class AppConstants {
   
    private AppConstants() {
   
        // 私有构造函数,防止实例化
    }

    public static final int MAX_UPLOAD_SIZE = 1024 * 1024;
    public static final String DEFAULT_ENCODING = "UTF-8";
}

使用方式:

int size = AppConstants.MAX_UPLOAD_SIZE;

2. 工具类封装

将工具方法封装在final类中:

public final class StringUtils {
   
    private StringUtils() {
   
        // 私有构造函数
    }

    public static boolean isEmpty(String str) {
   
        return str == null || str.length() == 0;
    }

    public static String capitalize(String str) {
   
        if (isEmpty(str)) return str;
        return Character.toUpperCase(str.charAt(0)) + str.substring(1);
    }
}

使用方式:

boolean empty = StringUtils.isEmpty("test");
String capitalized = StringUtils.capitalize("hello");

3. 不可变数据对象封装

创建不可变的数据传输对象:

public final class UserDTO {
   
    private final String username;
    private final int age;
    private final List<String> roles;

    public UserDTO(String username, int age, List<String> roles) {
   
        this.username = username;
        this.age = age;
        // 防御性复制,确保不可变性
        this.roles = new ArrayList<>(roles);
    }

    public String getUsername() {
   
        return username;
    }

    public int getAge() {
   
        return age;
    }

    public List<String> getRoles() {
   
        // 返回副本,防止外部修改
        return new ArrayList<>(roles);
    }
}

使用方式:

List<String> roles = Arrays.asList("admin", "user");
UserDTO user = new UserDTO("john", 30, roles);
// user.getRoles().add("guest");  // 不会影响内部列表

4. 防止子类修改核心逻辑

封装核心业务逻辑的final类:

public final class PaymentProcessor {
   
    private final TaxCalculator calculator;

    public PaymentProcessor(TaxCalculator calculator) {
   
        this.calculator = calculator;
    }

    public final double processPayment(double amount) {
   
        // 核心业务逻辑,不允许子类修改
        double tax = calculator.calculateTax(amount);
        return amount + tax;
    }
}

使用方式:

PaymentProcessor processor = new PaymentProcessor(new DefaultTaxCalculator());
double total = processor.processPayment(100.0);

final 关键字,Java 关键字,Java 编程,面向对象编程,Java 开发,Java 基础,Java 核心技术,Java 面试题,Java 特性,编程开发,软件开发,Java 关键字用法,final 修饰符,Java 语法,Java 技术



准备了一些面试资料,需要的拿走
https://pan.quark.cn/s/4459235fee85


目录
相关文章
|
SQL XML 安全
mybatis批量更新数据三种方法效率对比【Mysql】
mybatis批量更新数据三种方法效率对比【Mysql】
4918 0
mybatis批量更新数据三种方法效率对比【Mysql】
|
消息中间件 NoSQL JavaScript
阿里官方 Redis 开发规范
阿里官方 Redis 开发规范
|
4月前
|
安全 Java 编译器
使用枚举实现“状态”转换限制
我是小假 期待与你的下一次相遇 ~
158 4
|
5月前
|
JSON API 数据格式
淘宝商品评论API接口,json数据示例参考
淘宝开放平台提供了多种API接口来获取商品评论数据,其中taobao.item.reviews.get是一个常用的接口,用于获取指定商品的评论信息。以下是关于该接口的详细介绍和使用方法:
|
5月前
|
前端开发 搜索推荐 NoSQL
提升用户体验:电商API如何优化购物车与支付流程
本文探讨电商购物车与支付流程优化,通过API技术提升用户体验。一是购物车原子化操作,如ETag版本控制解决冲突、局部更新减少传输;二是支付流程聚合与降级,包括JWT单次验证、动态支付选项及备用渠道切换;三是实时库存保护,利用分布式锁防止超卖。案例显示,优化后购物车冲突减少92%,支付耗时降至2.1秒,移动端转化率提升18%。API作为体验引擎,未来将与前端深度协同,推动更优购物闭环。
167 1
|
4月前
|
XML 人工智能 监控
SpringBoot实战:七种统计方法耗时的实现方式
在Spring Boot开发中,统计方法执行时间是性能优化的重要手段。本文介绍了七种实现方法耗时统计的技巧,包括手动使用StopWatch、AOP全局监控、自定义注解+切面、拦截器、Filter、Actuator+Micrometer集成以及事件监听等方式。每种方法适用于不同场景,开发者可根据需求选择合适的方案,从而更高效地定位性能瓶颈并提升系统响应速度。
778 5
|
Java 数据库连接 测试技术
SpringBoot入门 - 添加内存数据库H2
SpringBoot入门 - 添加内存数据库H2
769 3
SpringBoot入门 - 添加内存数据库H2
|
4月前
|
缓存 监控 搜索推荐
301重定向实现原理全面解析:从HTTP协议到SEO最佳实践
301重定向是HTTP协议中的永久重定向状态码,用于告知客户端请求的资源已永久移至新URL。它在SEO中具有重要作用,能传递页面权重、更新索引并提升用户体验。本文详解其工作原理、服务器配置方法(如Apache、Nginx)、对搜索引擎的影响及最佳实践,帮助实现网站平稳迁移与优化。
614 68
|
存储 人工智能 搜索推荐
详解MySQL字符集和Collation
MySQL支持了很多Charset与Collation,并且允许用户在连接、Server、库、表、列、字面量多个层次上进行精细化配置,这有时会让用户眼花缭乱。本文对相关概念、语法、系统变量、影响范围都进行了详细介绍,并且列举了有可能让字符串发生字符集转换的情况,以及来自不同字符集的字符串进行比较等操作时遵循的规则。对于最常用的基于Unicode的字符集,本文介绍了Unicode标准与MySQL中各个字符集的关系,尤其详细介绍了当前版本(8.0.34)默认字符集utf8mb4。