Java新手必看:final关键字的正确使用技巧,让你避免常见错误!

Java新手必看:final关键字的正确使用技巧,让你避免常见错误! - 程序员古德

在Java中,final关键字表示“最终的”或“不可变的”,用于标记变量、方法和类。它有助于确保数据的安全性、API设计的稳定、性能优化以及支持设计模式。当变量被标记为final时,其值不可更改,保障了数据的完整性和安全性。在API或库设计中,使用final可防止意外或恶意修改。同时,final变量在编译时可进行优化,提高性能。声明类为final可防止继承,确保行为不被修改。方法声明为final则子类不能重写,保持一致性。此外,final还能明确开发者意图,提高代码可读性和可维护性。

用final来修饰类

如果想要防止其他类继承父类,可以使用final关键字来修饰这个类,如下代码:

public final class MyClass {  
    // 类的成员变量和方法  
      
    public void myMethod() {  
        // 方法实现  
    }  
      
    // 注意:由于MyClass被声明为final,因此它不能被继承。  
    // 下面这种尝试继承MyClass的做法将会导致编译错误:  
    /*  
    public class AnotherClass extends MyClass {  
        // 这里的代码将不会编译通过,因为MyClass是final的。  
    }  
    */  
}

在这个示例中,MyClass被声明为final,这意味着没有任何类可以继承它,如果尝试创建一个新类并继承MyClass,编译器将会报错,这种方法通常用于确保类的行为不会被修改,或者当类被设计为独立实体而不应作为继承体系的一部分时。

用final修饰方法

当想要防止子类重写父类中的某个方法时,可以在父类的方法上使用final关键字,这样做可以确保子类不会改变这个方法的行为,如下代码:

public class ParentClass {  
  
    // final方法,子类不能重写这个方法  
    public final void showFinal() {  
        System.out.println("This is a final method.");  
    }  
  
    // 非final方法,子类可以重写这个方法  
    public void showNonFinal() {  
        System.out.println("This is a non-final method.");  
    }  
}  
  
// 子类尝试重写父类的final方法将会导致编译错误  
class ChildClass extends ParentClass {  
  
    // 下面的方法是错误的,因为showFinal()在父类中是final的,不能被重写  
    /*  
    @Override  
    public void showFinal() {  // 这行会导致编译错误  
        System.out.println("Trying to override final method.");  
    }  
    */  
  
    // 子类可以正常重写父类的非final方法  
    @Override  
    public void showNonFinal() {  
        System.out.println("ChildClass overrides non-final method.");  
    }  
}  
  
public class FinalMethodDemo {  
    public static void main(String[] args) {  
        ParentClass parent = new ParentClass();  
        parent.showFinal();      // 输出: This is a final method.  
        parent.showNonFinal();   // 输出: This is a non-final method.  
          
        ChildClass child = new ChildClass();  
        // child.showFinal();      // 如果尝试调用一个被重写的final方法,这里会报错,但实际上不会尝试这么做,因为不能重写final方法  
        child.showNonFinal();     // 输出: ChildClass overrides non-final method.  
    }  
}

在上面的代码中,ParentClass有一个final方法showFinal()和一个非final方法showNonFinal(),在ChildClass中,我们尝试重写showFinal()方法(这部分代码是被注释掉的,因为它会导致编译错误),但成功重写了showNonFinal()方法,在FinalMethodDemo类的main方法中,我们创建了ParentClassChildClass的实例,并调用了这两个方法,以展示final方法不能被重写,而非final方法可以被重写。

用final修饰字段

在Java中,final关键字也可以用于类的字段(成员变量),当一个字段被声明为final时,它必须在声明时被初始化或者在构造器中被初始化,并且之后它的值就不能再被修改了,如下代码:

public class Person {  
  
    // final字段,必须在声明时或构造器中初始化,之后不能更改  
    private final String name;  
    private final int age;  
  
    // 构造器,用于初始化final字段  
    public Person(String name, int age) {  
        this.name = name;  
        this.age = age;  
    }  
  
    // getter方法,用于获取final字段的值  
    public String getName() {  
        return name;  
    }  
  
    public int getAge() {  
        return age;  
    }  
  
    // 注意:以下尝试修改final字段的方法将会导致编译错误  
    /*  
    public void setName(String newName) {  
        this.name = newName; // 编译错误:不能赋值给final字段name  
    }  
  
    public void setAge(int newAge) {  
        this.age = newAge; // 编译错误:不能赋值给final字段age  
    }  
    */  
}  
  
public class FinalFieldDemo {  
    public static void main(String[] args) {  
        // 创建一个Person对象,final字段在构造器中被初始化  
        Person person = new Person("Alice", 30);  
          
        // 输出final字段的值  
        System.out.println("Name: " + person.getName()); // 输出: Name: Alice  
        System.out.println("Age: " + person.getAge());   // 输出: Age: 30  
          
        // 尝试修改final字段(实际上不会这么做,因为知道这是不可能的)  
        // person.setName("Bob"); // 这行代码不会存在,因为setName方法不存在且name是final的  
        // person.setAge(35);     // 同上,setAge方法不存在且age是final的  
    }  
}

在这个示例中,Person类有两个final字段:nameage,这两个字段在构造器中被初始化,并且由于它们是final的,因此没有提供setter方法来修改它们的值,在FinalFieldDemo类的main方法中,我们创建了一个Person对象并输出了其nameage字段的值,注释掉的代码部分展示了尝试修改final字段将会导致的编译错误。

核心总结

在Java编程中,final关键字是一把双刃剑,既强大又需审慎使用。

它的优点显而易见,它提供了数据的安全保障,一旦定义为final的变量,就如同加上了不可更改的封印,有效防止数据被篡改,同时,final也助力性能优化,编译器对final变量有特殊照顾,能进行更多的优化处理,在代码设计上,final明确表达了开发者的意图,使得代码更易读、更易于维护。

然而,它的缺点也不容忽视,过度使用final可能导致代码丧失灵活性,使得后续的修改和扩展变得困难。在确实需要保障数据不变性或方法行为不被覆盖的场合使用final,同时要注意避免滥用,保持代码的灵活性和可维护性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/294010.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CMake报错集锦

一、报错1 -bash: pybind11-config: command not found CMake Error at CMakeLists.txt:33 (find_package):By not providing "Findpybind11.cmake" in CMAKE_MODULE_PATH this project hasasked CMake to find a package configuration file provided by "pyb…

Spring事务(2):声明式事务管理案例-转账(xml、注解)

1 编写转账案例,引出事务管理问题 需求:账号转账,Tom账号取出1000元,存放到Jack账号上 1.1 建表脚本(MySQL) CREATE TABLE t_account (id INT(11) NOT NULL AUTO_INCREMENT,name VARCHAR(20) NOT NULL,m…

mysql 添加用户并分配select权限

1.root用户先登录或者在可执行界面 1.1 选择mysql 点击mysql 或者在命令行 use mysql 1.2创建用户 CREATE USER username% IDENTIFIED BY password; 备注1:%替换为可访问数据库的ip,例如“127.0.0.1”“192.168.1.1”,使用“%”表示不限制…

Python办公自动化 – 操控远程桌面和文件版本控制

Python办公自动化 – 操控远程桌面和文件版本控制 以下是往期的文章目录,需要可以查看哦。 Python办公自动化 – Excel和Word的操作运用 Python办公自动化 – Python发送电子邮件和Outlook的集成 Python办公自动化 – 对PDF文档和PPT文档的处理 Python办公自动化 –…

vue项目 Network: unavailable的解决办法

vue项目npm run serve 后,只有localhost访问,network不能访。 看到网上说有三种情况: 多个网卡原因:打开网络共享中心,把多余的网络禁用掉,只留一个 在中配置host及public 系统环境变量问题…

小学副科老师轻松吗

在小学里,除了语文、数学和英语这些主科,还有许多副科老师,他们的工作日常是什么样的呢?今天,让我们一起来揭秘小学副科老师的一天。 备课:在忙碌中寻找创意的火花 副科老师同样需要花费大量时间进行备课…

XTU OJ 1525瓷片

题意 给定一个2n的地面&#xff0c;用11和1*2的瓷片铺满&#xff0c;问有多少种方案 数据范围 n<30 输入 3 1 2 30 输出 2 7 1084493574452273 代码 #include<stdio.h>int main() {int t;scanf("%d",&t);long long a[40];a[0]1,a[1]2,a[2]7;fo…

2023APMCM亚太数学建模C题 - 中国新能源汽车的发展趋势(3)

六、问题三的模型建立和求解 6.1问题分析 问题3.收集数据&#xff0c;建立数学模型分析新能源电动汽车对全球传统能源汽车行业的影响。 本题要求建立模型分析新能源电动汽车对全球传统能源汽车行业的影响。由于数据集可能略大&#xff0c;而在处理复杂问题、大量特征和大规模…

ubuntu 安装 anaconda

ubuntu 安装 anaconda 下载 wget https://repo.anaconda.com/archive/Anaconda3-2023.09-0-Linux-x86_64.sh安装 bash Anaconda3-2023.09-0-Linux-x86_64.sh2.1 回车继续 2.2 许可协议 输入 q 退出阅读许可协议 2.3 输入 yes 接受 许可协议 2.4 设置 anaconda 安装位置 如不需…

CSS3新增文本样式-text-shadow属性

文本样式 概念:在CSS3中&#xff0c;增加了丰富的文本修饰效果&#xff0c;使得页面更加美观舒服。 常用的文本样式属性 属性说明text-shadow文本阴影text-stroke文本描边text-overflow文本溢出word-wrap强制换行font-face嵌入字体 W3C坐标系 我们日常生活使用最多的是数学坐…

U盘如何设置密码?U盘数据该怎么加密?

U盘等移动储存设备可以存储很多重要文件&#xff0c;方便我们随时使用。为了避免数据泄露&#xff0c;我们需要加密保护U盘数据。那么&#xff0c;U盘数据该怎么加密呢&#xff1f;下面我们就来了解一下。 U盘数据加密保护的必要性 目前&#xff0c;大多数的U盘并不具备数据加…

记一次http换成https的过程

记一次http换成https的过程 http默认端口是80&#xff0c;https默认端口是443&#xff0c;此文章主要记录一次网站配置https的过程。 1. 下载申请下载ssl证书 SSL证书是由证书颁发机构审核验证后颁发的&#xff0c;这种颁发机构也叫CA机构&#xff0c;是一个受信任的数字证书…

添加 is_similar_dict 校验器,判断字典格式是否一致

目录 一、前置说明1、总体目录2、相关回顾3、本节目标 二、操作步骤1、项目目录2、代码实现3、测试代码4、日志输出 三、后置说明1、要点小结2、下节准备 一、前置说明 1、总体目录 《 pyparamvalidate 参数校验器&#xff0c;从编码到发布全过程》 2、相关回顾 param_vali…

vite中配置服务代理

前言 在vite中配置服务代理和webpack中大差不差,不过有些写法会有些不同 具体配置:配置 Vite {#configuring-vite} | Vite中文网 这里我写了一个demo,如下所示 开启node服务 我用express启动了一个服务,分别暴露两个接口 进行相关配置 在vite.config.ts文件中进行配置 e…

并行算法举例

谷歌的三大马车中的两辆分别是MapReduce GFS 这些我们在后边都会学到。 补充shuffle的作用 将map中的内容&#xff0c;具备相同内容的key被放到一组 问题1 矩阵乘法 第一轮j相同放在一起。 第二轮ik相同的放在一起。 问题2 求和问题 问题3 不重复元素

大数据可视化Web框架——飞致云Dataease在Windows端的安装指南(多图说明版)V2.2最新版

DataEase开源代码在Windows系统开发环境搭建与调试指南_怎么部署dataease 2.0-CSDN博客https://blog.csdn.net/tllhc01/article/details/135220598?spm1001.2014.3001.5502参考这一篇&#xff0c;基于dataease2.2源码进行构建 需要先下载三个文件&#xff0c;且版本一一对应均…

力扣题:字符串变换-1.5

力扣题-1.5 [力扣刷题攻略] Re&#xff1a;从零开始的力扣刷题生活 力扣题1&#xff1a;482. 密钥格式化 解题思想&#xff1a;首先先将破折号去除,并将所有字母转换为大写,然后计算第一组的长度,进行结果字符串的拼接,如果第一组的长度为0,则需要删除开头的’-符号 class S…

YOLOv5独家原创改进:新颖的Shape IoU结合 Inner-IoU,基于辅助边框的IoU损失的同时关注边界框本身的形状和尺度,小目标实现高效涨点

💡💡💡本文改进:一种新的Shape IoU方法结合 Inner-IoU,基于辅助边框的IoU损失的同时,更加关注边界框本身的形状和尺度来计算损失 💡💡💡对小目标检测涨点明显,在VisDrone2019、PASCAL VOC均有涨点 收录 YOLOv5原创自研 https://blog.csdn.net/m0_63774211/ca…

【React系列】受控非受控组件

本文来自#React系列教程&#xff1a;https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzg5MDAzNzkwNA&actiongetalbum&album_id1566025152667107329) 一. refs 的使用 在React的开发模式中&#xff0c;通常情况下不需要、也不建议直接操作DOM原生&#xff0c;但是某些…

DDIA 第十二章:数据系统的未来

本文是《数据密集型应用系统设计》&#xff08;DDIA&#xff09;的读书笔记&#xff0c;一共十二章&#xff0c;我已经全部阅读并且整理完毕。 采用一问一答的形式&#xff0c;并且用列表形式整理了原文。 笔记的内容大概是原文的 1/5 ~ 1/3&#xff0c;所以你如果没有很多时间…