java final关键字 详解

news2024/12/23 9:40:57
  • 概述:

  • 作用:

  • 细节:

  • 演示:

  • 总结:


一、概述 :

final [ˈ faɪnl],最终的,最后的,决定性的,不可改变的。final作为Java中的一个关键字可以用来修饰方法,和变量。(但final不能修饰构造器!)

二、作用 :

①修饰类——
被final修饰的类不能被继承,但该类可以去继承别的 (没有被final修饰的 )类,例如String类和System类,它们被final修饰,是不可以被继承的,但是它们有自己的父类——即顶层父类Object类。还有一点需要注意: 被final修饰的类虽然不能被继承,但 可以被实例化,即我们可以创建该类对象
②修饰方法——
被final修饰的方法不能被子类重写,但可以被子类继承并使用(在满足访问权限规则的前提下)。注意,修饰方法时, final关键字不能与abstract关键字共存;因为我们前面在讲抽象类时说过,abstract修饰的方法是必须被非抽象子类重写的。
③修饰变量——
这里修饰的”变量“其实又可以细分为成员变量和局部变量 被final修饰的变量称为最终变量,即常量——成员常量和局部常量常量只能赋值一次,不能被二次更改
关于 常量的命名,我们在Java 命名规范中已经说过,常量名所有字母都大写,多个单词之间用下划线隔开。eg : MAX_VALUE(最大值)。
若final关键字修饰的是一个引用类型变量,则该引用指向的地址值无法改变。(相当于一个 固定指针)PS : 但是,我们不建议使用final修饰引用类型数据,因为通过引用,仍然可以修改堆空间中真正的对象的内部数据,实际意义并不大。

三、细节 :

1.关于成员常量和局部常量的初始化问题 :

当final修饰的是成员变量,即final修饰属性时。该成员常量必须进行初始化。要么就在定义成员常量时对它赋初值来初始化;如果在定义成员常量时没有赋初值——那么要么在构造器中进行初始化;要么在代码块中进行初始化。

而对于final修饰的局部变量,即局部常量——局部常量如果未被使用,可以不赋初值;但如果局部常量被调用了,就必须赋初值。

2.关于“画蛇添足,冠上加冠”:

一般地,如果一个类已经被final关键字修饰,那么该类中的方法是没有必要再次用final修饰的。这是因为用final修饰方法的目的就是为了不让该方法被子类重写;而final修饰的类本身就已经不能被继承了,又谈何重写呢?

3.关于常见的final类:

除了上文中提到的String类和System类,java中所有的包装类都被final关键字修饰了。也就是说,所有的包装类都不能被继承

包装类包括了Byte, Short, Integer, Long, Character, Float, Double, Boolean共八种,其实就是java中八种基本类型对应的引用类型。(关于包装类,我们在讲到下一章内容时会专门出一篇博文,这里大家先了解一下即可。)

4.关于静态常量和公有静态常量:

静态常量指的是static和final共同修饰的变量。因为用到了static关键字的知识,所以相关内容up放在了static关键字的万字详解篇,大家可以看完这篇博文后再返回来,点击链接跳转进去查看,里面有目录,直接找到"公有静态常量"和"公有静态常量的演示"即可。

四、演示 :

1.演示Ⅰ——final修饰类的演示

up以Fruit类和Grape类为栗,当我们用final修饰Fruit类时,Fruit类将无法被Grape类继承。如下GIF演示动图 :


2.演示Ⅱ——final修饰方法的演示

up仍然以Fruit类和Grape类为栗,增加Test类作为测试类。在Furit中定义一个juice(榨果汁)方法,并且在子类Grape中重写该方法。

Fruit类,Grape类,Test类代码如下 :

package knowledge.polymorphism.about_final.demonstration;

public class Fruit {
    private String fruit_name;

    public String getFruit_name() {
        return fruit_name;
    }
    public void setFruit_name(String fruit_name) {
        this.fruit_name = fruit_name;
    }

    public void juice() {
        System.out.println(getFruit_name() + "可以榨果汁儿!");
    }
}
class Grape extends Fruit {
    @Override
    public void juice() {
        System.out.println(getFruit_name() + "可以榨葡萄汁儿!");
    }
}
class Test {
    public static void main(String[] args) {
        Fruit fruit = new Grape();
        fruit.setFruit_name("葡萄🍇");
        fruit.juice();
    }
}

运行结果 :

接着,我们为juice方法添加修饰符final修饰符,这时子类将不能重写juice方法,否则IDEA会报错。如下GIF演示动图 :


3.演示Ⅱ——final修饰变量的演示

up以Fruit类为演示类,以Test类作为测试类。在Furit类中分别定义四个变量name, color, size, sweetness,后三个变量使用final修饰(即后三个均是成员常量),并分别演示成员常量初始化的三种方式。

Fruit类,Test类代码如下 :

package knowledge.polymorphism.about_final.demonstration;

public class Fruit {
    //这是变量,可以二次更改值。
    private String name = null;
        //通过setName方法可以修改name变量的值。
    public void setName(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }

    //这是常量,一旦赋值后,不可进行二次更改。
        //成员常量第一种初始化方式————在定义时就直接赋值:
        final String color = "水果的颜色是五颜六色";
        //成员常量第二种初始化方式————在非静态代码块中赋值:
        final String size;
        {    //非静态代码块
            size = "水果的尺寸是能大能小";
        }
        //成员常量第三种初始化方式————在构造器中赋值
        final double sweetness;
        public Fruit() {
            sweetness = 9.0;
        }
    public void part() {
        final String haha;
        haha = "哈哈哈哈哈哈哈哈~";
        System.out.println("局部常量如果被调用就必须初始化," + haha);
    }
}

class Test {
    public static void main(String[] args) {
        Fruit fruit = new Fruit();

        System.out.println("fruit's color = " + fruit.color);
        System.out.println("fruit's size = " + fruit.size);
        System.out.println("fruit's sweetness = " + fruit.sweetness);
        System.out.println("-------------------------------------");
        
        fruit.part();
    }
}

运行结果 :

五、总结 :

final是Java中定义常量的标志。大家一定要把final关键字的作用和细节仔细琢磨琢磨,自己动手练练,去做up出的课后习题。有疑问大家可以共同交流,感谢阅读!

System.out.println("END---------------------------------------------------------");

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

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

相关文章

【程序人生】从土木专员到网易测试工程师,薪资翻3倍,他经历了什么?

转行对于很多人来说,是一件艰难而又纠结的事情,或许缺乏勇气,或许缺乏魄力,或许内心深处不愿打破平衡。可对于我来说,转行是一件不可不为的事情,因为那意味着新的方向、新的希望。我是学工程管理的&#xf…

京东测试进阶之路:初入测试碎碎念篇

1、基本的测试用例设计方法 基本的测试用例设计方法(边界值分析、等价类划分等)。 业务和场景的积累,了解测试需求以及易出现的bug的地方。 多维角度设计测试用例(用户、业务流程、异常场景、代码逻辑)。 2、需求分析 …

idea自带maven位置、maven全局环境变量配置,安装jar到本地 mac

声明:本教程为mac版教程,Windows请路过 idea自带maven3配置全局环境变量 mac电脑maven3位置/Applications/IntelliJ\ IDEA.app/Contents/plugins/maven/lib/maven3配置全局变量,编~/.profile文件(没有则新建) export MAVEN/App…

JVM-JMM内存模型(happens-before、volatile)

前言 由于计算机的存储设备与处理器的运算速度有几个数量级的差距所以现代计算机系统都不得不加入一层读写速度尽可能接近处理器运算速度的高速缓存(Cache)来作为内存与处理器之间的缓冲。 将运算需要使用到的数据复制到缓存中,让运算能快速进行,当运算…

Day895.MySql误删数据还原方案 -MySQL实战

MySql误删数据还原方案 Hi,我是阿昌,今天学习记录的是关于MySql误删数据还原方案的内容。 传统的高可用架构是不能预防误删数据的,因为主库的一个 drop table 命令,会通过 binlog 传给所有从库和级联从库,进而导致整…

研报精选230220

目录 【行业230220国信证券】银行业行业专题:经济复苏中的优质中小银行【行业230220国信证券】汽车行业周报(2023年第7周):吉利将发布新品牌“银河” ,2022年宇通纯电动客车获欧洲销量冠军【行业230220开源证券】商贸零…

Java File相关操作

文章目录File文件操作IO流处理流缓冲流转换流对象流File文件操作 利用File类来操作。 文件操作中常用到相对目录和绝对路径 package org.File; import java.io.File; public class demo01 { public static void main(String[] args) { try{ File file new File("…

【Java期末复习】《面向对象程序设计》练习库

目录 一、单选题 二、填空题 三、程序填空题 1、 super使用--有如下父类和子类的定义,根据要求填写代码 2、简单加法计算器的实现 3、House类 4、矩形类 5、创建一个Box类,求其体积 四、函数题 6-1 求圆面积自定义异常类 6-2 判断一个数列是…

基于某业务单登陆场景并发测试实战

文章目录1 测试目的2 测试目标和测试对象3 名词解释4 测试说明5 测试环境和工具5.1 测试工具5.2 测试环境5.3 人力计划6 测试用例6.1 方案设计6.2 接口地址6.3 接口参数6.3.1 header参数6.3.2 请求参数7 脚本设计8 监控数据8.1 虚拟用户并发情况8.2 事务响应时间8.3 每秒点击次…

IP定位的具体网络应用

IP定位的原理是利用访问终端的注册信息和时延信息来估算现实中的地理位置,结合先进的定位算法服务,最高精确度能达到街道级,深受用户的喜爱。IP定位接口是一种通过IP地址来确定设备或用户位置的技术,主要应用于以下几个方面&#…

Windows平台上达梦数据库的ODBC安装与配置

文章目录概述安装包准备安装ODBC驱动配置ODBC数据源概述 最近很多公司都在响应信创,需要切换到国产数据库,然而很多数据库的一些基础组件的使用都没有一个很明确的官方文档。为了避免更多的人踩坑,本人将踩过的坑总结成博文,分享…

【正点原子FPGA连载】第十四章SD卡读写TXT文本实验 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南

1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id692450874670 3)全套实验源码手册视频下载地址: http://www.openedv.com/thread-340252-1-1.html 第十四章SD卡读写…

网络小白入门之路--锐捷RGOS日常管理

锐捷作为网络界的一名重要成员,其设备的管理系统RGOS也是我们要学习的重要一环,那么今天我们就一起看下锐捷RGOS的日常管理。 锐捷设备日常登录方式: 本地登陆: Console登陆:全新或配置清空的设备,需要使…

TeX文件和md文件的转换

1 tex文件转换为md文件 1.1 安装 pandoc 首先安装 pandoc 到你的电脑 pandoc 1.2 命令行 可以在vscode终端输出入以下命令,命令运行路径为tex文件所在 cd tex文件所属的目录 pandoc -s tex文件名.tex -o md的文件名.md1.3预览 发现最后md文件只有一部分转化成…

171、【动态规划】leetcode ——309. 最佳买卖股票时机含冷冻期 (C++版本)

题目描述 原题链接:309. 最佳买卖股票时机含冷冻期 解题思路 本次难点在于多了一个冷冻期,大体的状态过程是三个:持有股票、不持有股票、冷冻期。在不持有股票时候,又可分为之前就不持有股票并继续保持、今天才卖出股票明天是冷…

视频直播美颜sdk的发展史

视频直播美颜sdk的出现是必然的,它的诞生就是为了让更多用户能够更好地体验到视频直播带给大家的快乐,可以说视频直播美颜sdk的发展和用户体验有着紧密联系。今天,小编不聊技术,咱们来聊一下视频直播美颜sdk的诞生以及发展历程。 …

抽奖动画大转盘抽奖思路与做法

抽奖是各类营销活动中最常见的一种形式,本产品需求大致如下:转盘周围跑马灯交替闪烁,点击抽奖,大转盘旋转,调用接口获取抽奖结果,大转盘指针指向对应的奖品。高保如下图12.整体思路本需求要求跑马灯交替闪烁…

PHP Composer 下载依赖项时删除其它不相关文件 导致项目报错 依赖包vendor手动导入

场景 最近项目上需要开发图片文字识别功能,接入了开源的tesseract_ocr,根据官网介绍,使用composer require thiagoalessio/tesseract_ocr命令安装依赖,但是在执行之后,删除了一些文件,导致项目报错。 解…

数据管理之特征仓库

鉴于特征仓库热度下降,特将历史库存放出😄 背景 数据工程师与算法工程师在数据存取上存在沟通成本,基于现状存在以下问题: 提供训练使用的离线特征与在线服务使用的在线特征,构造方式存在差异,离线、在线…

P18 PyTorch 感知机的梯度推导

前言这里面简单介绍一下单层感知机和多层感知机的模型参考:https://www.bilibili.com/video/BV17e4y1q7NG?p41一 单层感知机模型输入: k 代表网络层数,i 代表输入节点的编号前向传播: 权重系数k: 层数i: 前一层输入节点编号j: 当前层输出节点编号这里&a…