Java基础系列(五): final关键字用法

news2024/9/25 23:15:37

一. 概述

final关键字代表最终,不可改变的.

常见有5种用法,我们来归纳总结一下:

1. 用来修饰一个类

2. 用来修饰一个方法

3. 用来修饰成员变量

4. 用来修饰局部变量

5. 用来修饰方法参数

二. final饰修类

如果声明一个类为final类,  那么这个类就是最终类,不能被继承

public final class ParentClass {
    public void happy() {
        System.out.println("高兴");
    }
}

当写一个类去继承它的时候

public class ChildClass extends ParentClass{

}

就会提示如下错误:

  注意:一个类如果是final的,那么其中所有的成员方法都无法进行覆盖重写.

三. final修饰方法

当final用来修饰一个方法的时候,这个方法就是最终方法,那么很明显就是说不能被覆盖重写。

public class ParentClass {

    public void happy() {
        System.out.println("高兴");
    }
    
    //用final关键字修饰的方法
    protected final void play(){
        System.out.println("开心的玩耍");
    }

}

我们在继承类中去看下 play()方法是否可以被override

 也是报错,说明 final修饰的方法,是一个最终方法,不能被子类去覆盖重写.

四. final修饰成员变量

在java中,成员变量一般都有默认值, 比如 int 型变量,默认值为0     boolean型变量默认值为false

String型变量,默认值为null

 我们来看上面的例子, 3个同样类型的 int型 成员变量,  number   temp  默认值都是0 , 写和没写都没有报错.  但是加上final之后的num变量,没有初始化就报错. 

总结一:  由于成员变量具有默认值,但是用了final关键字修饰之后必须要手动赋值初始化值.

我们在看一个例子

 总结二: 对于成员变量来说,如果使用final关键字修饰,那么这个变量也照样是不可被改变

五. final修饰局部变量

对于基本类型来说,不可变说的是变量当中的数据不可改变;

请看如下例子:

 


对于引用类型来说,不可变指的是变量当中的地址值不可改变

我们再来看下个例子,

Student为一个普通的javabean类

public class Student {
 
    private String name;
 
    public Student() {
    }
 
    public Student(String name) {
        this.name = name;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
}

第一种情况,没有final修饰的测试类

public class FinalVarTest {

    public static void main(String[] args) {
        Student student1 = new Student("勒布朗.詹姆斯");
        System.out.println(student1); //打印内存地址
        System.out.println(student1.getName());

        student1 = new Student("斯蒂芬.库里");
        System.out.println(student1); //打印内存地址
        System.out.println(student1.getName());
    }
}

打印结果如下:


com.finaltest.Student@4aa298b7   //内存地址
勒布朗.詹姆斯


com.finaltest.Student@7d4991ad  //内存地址
斯蒂芬.库里

输出结果:内存地址不同

第二种情况: 使用final修饰测试类

 若用final修饰,地址值不可以被改变,否则直接报错.

地址值虽然不能变,但是内容可以变(地址所指向的对象的属性可以被该变)。

请看如下例子:

public class FinalVarTest {

    public static void main(String[] args) {
        //使用final修饰的对象
        final Student student2 = new Student("詹姆斯.哈登");
        System.out.println(student2); //打印内存地址
        System.out.println(student2.getName());

        student2.setName("安东尼.戴维斯");
        System.out.println(student2); //打印内存地址
        System.out.println(student2.getName());
    }
}

打印结果如下:

com.finaltest.Student@4aa298b7
詹姆斯.哈登

com.finaltest.Student@4aa298b7
安东尼.戴维斯

两者的内存地址是相同的,但是名字(属性)是可以修改的.

六. final修饰参数

在方法参数前面加final关键字就是为了防止数据在方法体中被修改

主要分两种情况:第一,用final修饰基本数据类型;第二,用final修饰引用类型。

第一种情况,修饰基本类型(非引用类型)。这时参数的值在方法体内是不能被修改的,即不能被重新赋值。否则编译就通不过。例如:

 第二种情况,修饰引用类型。这时参数变量所引用的对象是不能被改变的。作为引用的拷贝,参数在方法体里面不能再引用新的对象。否则编译通不过。例如:

但是对于引用,如果我是这样(也就是引用对象的地址不能改变,但是对象中的内容是可以改变的),则不会报任何错,完全能编译通过。

public class FinalVarTest {

    public static void main(String[] args) {
        String[] var = {"张三","李四", "王五"};
        valid(var);
    }

    public static void valid(final String[] ag){
       ag[2]= "赵六";
       for(int i=0; i<ag.length; i++) {
           System.out.println(ag[i]);
       }
    }
}

编译通过,打印如下:

张三
李四
赵六

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

7 Python文件、文件夹、word及excel操作

0 建议学时和要求 4学时 掌握os和os.path模块对文件和文件夹操作的函数 掌握shutil模块对文件和文件夹操作的函数 掌握扩展库openpyxl对Excel文件的操作 1 文件的高级操作 1.1 文件的概念及分类 文本文件 文本文件可以使用记事本、gedit、ultraedit等字处理软件直接进行显…

ESP32设备驱动-DS1264数字温度传感器驱动

DS1264数字温度传感器驱动 1、DS1264介绍 DS1624 由两个独立的功能单元组成:一个 256 字节非易失性 E2 存储器和一个直接数字温度传感器。 非易失性存储器由 256 字节的 E2 存储器组成。 该存储器可用于存储用户希望的任何类型的信息。 这些内存位置通过 2 线串行总线访问。…

007永磁电机控制方式:别张嘴就FOC,其他常规控制方式也是伺服人的基本功

在读本篇文&#xff0c;我想做个小调查。到目前为止&#xff0c;你掌握的或者是你了解到的控制永磁同步电机的方式都有哪些&#xff1f;我想&#xff0c;你大概张口就说FOC控制吧。没错&#xff0c;FOC控制是我们日常生活中所见到的最普遍的永磁同步电机的控制方式。当然在本专…

微信电脑版字体模糊(或文字太小)怎么调整

文章目录第一步&#xff1a;设置屏幕缩放125%第二步&#xff1a;文本大小设置为125%第三步&#xff1a;微信设置--通用--勾选“适配系统缩放比例”第四步&#xff1a;微信高DPI缩放行为设置&#xff08;关键&#xff09;ClearType勾选&#xff08;可选&#xff09;笔者遇到这个…

【模板】线段树 2

题目描述 如题&#xff0c;已知一个数列&#xff0c;你需要进行下面三种操作&#xff1a; 将某区间每一个数乘上 xxx 将某区间每一个数加上 xxx 求出某区间每一个数的和 输入格式 第一行包含三个整数 n,m,pn,m,pn,m,p&#xff0c;分别表示该数列数字的个数、操作的总个数…

计算机网络笔记(复试准备)第一章

计算机网络笔记&#xff08;复试准备&#xff09; 第一章 网络&#xff0c;互联网与因特网 网络由若干个结点和连接这些结点的链路组成 多个网络通过路由器连接起来这也就形成了一个更大的网络即是我们熟知的互联网也就是“网络的网络” 因特网是世界上最大的网络 问&#xf…

Open-Vocabulary Object Detection Using Captions论文讲解

文章目录一、论文前言二、提出原因三、论文的核心四、论文讲解4.1 论文流程4.2 OVD与之前相关的setting4.3 结果对比一、论文前言 目标检测是人工智能最突出的应用之一&#xff0c;也是深度学习最成功的任务之一。 然而&#xff0c;尽管深度对象检测取得了巨大进步&#xff0…

MongoDB在银行海量历史订单交易数据查询中的应用(Spring boot + Bee)

MongoDB在银行海量历史订单交易数据查询中的应用(Spring boot Bee) 近年来,随着各种便捷支付方式的普及,银行账户交易数据呈现爆炸式增长,同时数据模型也在不断变化,传统关系型数据库已难以满足这种海量的、模式灵活、高可用、高性能的数据存储和查询需求。通过对银行历史交易…

【编程入门】应用市场(php版)

背景 前面已输出多个系列&#xff1a; 《十余种编程语言做个计算器》 《十余种编程语言写2048小游戏》 《17种编程语言10种排序算法》 《十余种编程语言写博客系统》 《十余种编程语言写云笔记》 《N种编程语言做个记事本》 目标 为编程初学者打造入门学习项目&#xff0c;使…

【MySQL】索引常见面试题

文章目录索引常见面试题什么是索引索引的分类什么时候需要 / 不需要创建索引&#xff1f;有什么优化索引的方法&#xff1f;从数据页的角度看B 树InnoDB是如何存储数据的&#xff1f;B 树是如何进行查询的&#xff1f;为什么MySQL采用B 树作为索引&#xff1f;怎样的索引的数…

033_SS_Inversion-Based Creativity Transfer with Diffusion Models

下载地址&#xff1a;Arxiv 2022.11.23 Code地址&#xff1a;https://github.com/zyxElsa/creativity-transfer 1. Introduction Motivations 以前的任意示例引导的艺术图像生成方法&#xff08;比如风格迁移&#xff09;通常无法控制形状变化或传达语义元素。而预训练的text…

【Linux | ELK 8.2】搭建ELKB集群Ⅰ—— 实验环境说明和搭建Elasticsearch集群

目录1. 实验环境1.1 实验工具1.2 操作系统1.3 架构版本、IP地址规划与虚拟机配置要求1.4 拓扑图1.5 其他要求2. 实验步骤2.1 安装Elasticsearch&#xff08;单节点&#xff09;&#xff08;1&#xff09;检查系统jdk版本&#xff08;2&#xff09;下载elasticsearch&#xff08…

格式化串漏洞

格式化字符串漏洞本身并不算缓冲区溢出漏洞&#xff0c;这里作为比较典型的一类漏洞进行简单介绍。为了能够将字符串、变量、地址等数据按照指定格式输出&#xff0c;通常使用包含格式化控制符的常量字符串作为格式化串&#xff0c;然后指定用相应变量来代替格式化串中的格式化…

进程管理之基本概念

目录 关于进程的基本概念 进程描述符 查看进程 进程标识 进程的生命周期 僵尸进程、孤儿进程 写时拷贝技术 fork()函数 vfork()函数 终止进程 进程优先级和权重 进程地址空间 关于进程的基本概念 进程和程序是操作系统领域的两个重要的概念&#xff0c;进程是执行…

LeetCode 145. 二叉树的中序遍历

LeetCode 145. 二叉树的中序遍历 难度&#xff1a;easy\color{Green}{easy}easy 题目描述 给你一棵二叉树的根节点 rootrootroot &#xff0c;返回其节点值的 后序遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[3,2,1]示例 2&#xff1a…

mitmproxy使用总结

mitmproxy is a free and open source interactive HTTPS proxy. 这官网上的一句话说明mitmproxy的身份&#xff0c;MITM 即中间人攻击&#xff08;Man-in-the-middle attack&#xff09;&#xff0c;与charles、fidder之类的抓包工具不同的是可以增加一些自定义处理的扩展脚本…

aws appmesh 在ec2上部署和使用appmesh

参考资料 Getting started with AWS App Mesh and Amazon EC2 之前的文章中我们已经介绍了aws的服务网格场频appmesh&#xff0c;并且在eks环境中进行了部署和简单功能的测试。由于eks环境较为复杂&#xff0c;本文在ec2环境下手动配置appmesh网格环境 需求&#xff1a; 两个…

【Spring 基础】

【Spring 基础】 一、 Spring 介绍 1. 简述 Spring 技术是 JavaEE 开发必备技能&#xff0c;企业开发技术选型专业角度 简化开发&#xff0c;降低企业级开发的复杂性 IoCAOP 事务处理 框架整合&#xff0c;高效整合其他技术&#xff0c;提高企业级应用开发与运行效率 MyBat…

Linux内核中的软中断、tasklet和工作队列

软中断、tasklet和工作队列并不是Linux内核中一直存在的机制&#xff0c;而是由更早版本的内核中的“下半部”&#xff08;bottom half&#xff09;演变而来。下半部的机制实际上包括五种&#xff0c;但2.6版本的内核中&#xff0c;下半部和任务队列的函数都消失了&#xff0c;…

5M240ZT144C5N【CPLD】5M240ZT144I5N,5M570ZT100I5N满足低功耗设计

MAX V设备系列的特点&#xff1a;低成本、低功耗、非易失性CPLD架构即时启动(0.5 ms或更短)配置时间待机电流低至25A&#xff0c;快速下电/复位操作快速传播延迟和时钟到输出时间内部振荡器模拟RSDS输出支持&#xff0c;数据速率高达200 Mbps模拟LVDS输出支持&#xff0c;数据速…