Java进阶(2)——结合源码深入理解final关键字,修饰数据,方法,类

news2024/9/21 2:46:20

目录

  • 引出
  • 深入理解final关键字
  • final修饰数据
    • 基本数据类型
    • 对象的引用
    • 空白final
  • final修饰方法
  • final修饰类
  • 总结

引出


1.在java源码中较多使用final修饰数据,比如ArrayList的初始长度;
2.final关键字修饰对象的引用的特点理解;
3.了解一下空白final,目前不知道有啥用途;
4.final修饰方法,比如java的万类之祖Object的getClass()方法;
5.final修饰类,不能被继承inherit,比如String类;

深入理解final关键字

在这里插入图片描述

经常背的答案:

  • 被 final 修饰的类不可以被继承
  • 被 final 修饰的方法不可以被重写
  • 被 final 修饰的变量不可以被改变.如果修饰引用,那么表示引用不可变,引用指向的内容可变.
  • 被 final 修饰的方法,JVM 会尝试将其内联,以提高运行效率,被 final 修饰的变量,在编译阶段会存入常量池中.

final:本质就是声明——这个东西不能变;

为啥不禁止变?——考虑设计,或者效率;

应用场景——数据(属性)、方法、类

final修饰数据

许多程序设计语言都有自己的办法告诉编译器某个数据是“常数”。常数主要应用于下述两个方面:
(1) 编译期常数,它永远不会改变
(2) 在运行期初始化的一个值,我们不希望它发生变化

static和final字段:只能存储一个数据,且不能改变;

对于基本数据类型,final会将值变成一个常数;

对于对象的引用,final会将对象的引用指向一个具体的对象,并且这个变量不能再指向另一个对象;然而被指向的对象本身是可以被修改的;因此,在这种情况下,引用不能变,引用指向的内容是可以变的;

基本数据类型

在这里插入图片描述

ArrayList的源码

在这里插入图片描述

两种方式对比

在这里插入图片描述

通常的写法:public static final int INT4 = 79;

public表示它们可在包外使用;Static 强调它们只有一个;而final 表明它是一个常数

对象的引用

将引用变成final 看起来似乎不如将基本数据类型变成final 那么有用

在这里插入图片描述

被 final 修饰的变量不可以被改变.如果修饰引用,那么表示引用不可变,引用指向的内容可变.

在这里插入图片描述

空白final

Java 1.1 允许我们创建“空白final”,它们属于一些特殊的字段。尽管被声明成final,但却未得到一个初始值。无论在哪种情况下,空白final 都必须在实际使用前得到正确的初始化。而且编译器会主动保证这一规定得以贯彻。然而,对于final 关键字的各种应用,空白final 具有最大的灵活性。举个例子来说,位于类内部的一个final 字段现在对每个对象都可以有所不同,同时依然保持其“不变”的本质。

现在强行要求我们对final 进行赋值处理——要么在定义字段时使用一个表达 式,要么在每个构建器中。这样就可以确保final 字段在使用前获得正确的初始化。

package com.tianju.redis.algorithm.finalD;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
class MyBlank {
    Integer id;
    String name;
}
@Data
public class BlankFinal {
    final int INT1 = 0;
    final int j; // 空白的final,必须赋值
    final MyBlank myBlank; // 空白final引用数据类型,必须赋值

    BlankFinal(int j, MyBlank myBlank) {
        this.j = j;
        this.myBlank = myBlank;
    }

    BlankFinal(int x){
        j =x;
        myBlank = new MyBlank();
    }
}

在这里插入图片描述

final修饰方法

使用final 修饰方法,可能是出于对两方面理由的考虑。第一个是为方法“上锁”,防止任何继承类改变它的本来含义。设计程序时,若希望一个方法的行为在继承期间保持不变,而且不可被覆盖或改写,就可以采取这种做法。

采用final 方法的第二个理由是程序执行的效率。将一个方法设成final 后,编译器就可以把对那个方法的所有调用都置入“嵌入”调用里。

通常,只有在方法的代码量非常少,或者想明确禁止方法被覆盖的时候,才应考虑将一个方法设为final。

在这里插入图片描述

final修饰类

如果说整个类都是final(在它的定义前冠以final 关键字),就表明自己不希望从这个类继承,或者不允许其他任何人采取这种操作。换言之,出于这样或那样的原因,我们的类肯定不需要进行任何改变;或者出于安全方面的理由,我们不希望进行子类化(子类处理)。

在这里插入图片描述


总结

1.在java源码中较多使用final修饰数据,比如ArrayList的初始长度;
2.final关键字修饰对象的引用的特点理解;
3.了解一下空白final,目前不知道有啥用途;
4.final修饰方法,比如java的万类之祖Object的getClass()方法;
5.final修饰类,不能被继承inherit,比如String类;

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

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

相关文章

地址在数据线和地址线上怎么传?

如下图所示,对于地址总线,其传输方向是单向的,是只能由CPU发出,即只能用于CPU选择主存地址或I/O端口地址,并不能从主存或IO端口发到CPU。 相关题目: 在系统总线的数据线上,不可能传输的是&am…

试卷去痕迹app分享,轻松擦除答案痕迹

在考试中,不小心写错答案是常有的事情。如果你是用铅笔写的,那么你可以直接用橡皮擦擦除。但如果你是用钢笔或圆珠笔写的,该怎么办呢?现在有一些APP可以帮助你擦除答案,以下是一些值得尝试的APP分享。 1.拍试卷 拍试卷…

堆叠聚合模型与单独的逻辑回归模型处理非平衡数据的比较

堆叠聚合模型与单独的逻辑回归模型处理非平衡数据的比较 堆叠聚合模型的设计是通过训练多个模型,然后使用原模型,将多个模型的输出结果整合在一起以实现更准确的预测。这叠聚合模型在多个临床场景上都表现出优于单一模型的效能[1]。是构建临床预测模型过…

java之juc二

JMM 请你谈谈对Volatile的理解 Volatile是jvm提供的轻量级的同步机制(和synchronized差不多,但是没有synchronized那么强大) 保证可见性不保证原子性禁止指令重排 什么是JMM JMM:java内存模型,不存在的东西&#…

UE_移动端测试使用

教程流程: 参照官方文档-android篇: https://docs.unrealengine.com/5.1/zh-CN/android-development-requirements-for-unreal-engine/https://docs.unrealengine.com/5.1/zh-CN/android-development-requirements-for-unreal-engine/ AS下载&#xf…

点云滤波介绍

一、介绍 1、Filtering a PointCloud using a PassThrough filter 2、Downsampling a PointCloud using a VoxelGrid filter 3、Removing sparse outliers using StatisticalOutlierRemoval 4、Projecting points using a parametric model 数据集:链接&#x…

mysql mysql 容器 忽略大小写配置

首先能够连接上mysql,然后输入下面这个命令查看mysql是否忽略大小写 show global variables like %lower_case%; lower_case_table_names 0:不忽略大小写 lower_case_table_names 1:忽略大小写 mysql安装分为两种(根据自己的my…

移动端身份证识别技术的应用,告别手动录入证件信息

随着移动互联网的的发展,越来越多的公司都推出了自己的移动APP,这些APP多数都涉及到个人身份证信息的输入认证(即实名认证),如果手动去输入身份证号码和姓名,速度非常慢,且用户体验非常差。为了…

MotionBERT:人体运动表征

MotionBERT:A Unified Perspective on Learning Human Motion Representations解析 摘要1. 简介2. Related Work2.1 学习人体运动表征2.2 3D人体姿态估计2.3 基于骨骼的动作识别2.3 人体网格恢复 3. Method3.1 Overview3.2 网络架构Spatial BlockTemporal BlockDual…

MybatisPlus整合p6spy组件SQL分析

目录 p6spy java为什么需要 如何使用 其他配置 p6spy p6spy是一个开源项目,通常使用它来跟踪数据库操作,查看程序运行过程中执行的sql语句。 p6spy将应用的数据源给劫持了,应用操作数据库其实在调用p6spy的数据源,p6spy劫持到…

Python项目中怎么实现异步任务和定时任务

这里写目录标题 一、异步任务:二、定时任务:三、Celery介绍特点:Celery由三部分构成:工作原理:安装Celery选择一个Broker:RabbitMQKafka和RabbitMQ的区别:定义一个任务定义第二个任务定义一个生产者(producer) 来 调用异步任务启动celery服务定义一个获取结果的类定时任…

Activiti6

一、Activiti介绍与搭建开发环境 二、运行官方例子 三、编写第一个Activiti程序 3.1 流程部署 代码 /*** 部署流程* 涉及到的表有: * 1.act_ge_bytearray 两条记录,一条xml数据,一条png图片信息 * 2.act_re_deployment 一条记录 * 3.a…

BBS项目day02、注册、登录(登录之随机验证码)、退出登录、密码加密加盐、首页(导航条、模态框,修改密码)

一、注册 1.注册之前端页面 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>注册页面</title><!--动态引入文件-->{% load static %}<script src"{% static js/jquery.min.js %…

深度开发者故事 | 华为云API Explorer 自动化运维的得力助手

华为云API Explorer为开发者提供一站式API解决方案统一平台&#xff0c;集成华为云服务所有开放API&#xff0c;支持全量快速检索、可视化调试、帮助文档、代码示例等能力&#xff0c;帮助开发者快速学习API&#xff0c;使用API开发代码实现自动化运维。 体验通道&#xff1a;…

企业数字化时代,数据要素是什么?有什么作用价值?

信息化、数字化社会加速到来&#xff0c;企业纷纷开始布局数字化转型&#xff0c;数字经济将成为未来世界中最为火热的新型经济。 数据报表作为企业数字化转型的代表节点之一&#xff0c;未来会成为数字化企业的基本配置。 要想企业全身心投入数据报表体系建设中&#xff0c;…

个性化定制界面与极简版原装界面:我们为什么选择个性化?

个性化定制界面和极简版原装界面&#xff0c;哪一个你用起来更加顺手呢&#xff0c;相比之下你更喜欢哪一个&#xff1f;来聊一聊原因吧&#xff01; 随着科技的不断发展&#xff0c;人们对于界面设计也有了越来越高的要求。而在界面设计领域&#xff0c;个性化定制界面和极简版…

rust入门系列之Rust介绍及开发环境搭建

Rust教程 Rust基本介绍 网站: https://www.rust-lang.org/ rust是什么 开发rust语言的初衷是&#xff1a; 在软件发展速度跟不上硬件发展速度&#xff0c;无法在语言层面充分的利用硬件多核cpu不断提升的性能和 在系统界别软件开发上&#xff0c;C出生比较早&#xff0c;内…

Qt表格数据处理

概述 在Qt表格数据处理中&#xff0c;涉及到如下几个具体的类&#xff1a; QAbstractItemModel&#xff1a;这是一个抽象基类&#xff0c;定义了模型&#xff08;Model&#xff09;的接口规范。所有的模型类都应该派生自QAbstractItemModel&#xff0c;并实现它的纯虚函数&…

学习电工有哪些好处?在哪学习电工?

学习电工有哪些好处&#xff1f;在哪学习电工&#xff1f;学习电工可以做什么&#xff1f;优势有哪些&#xff1f; 学习电工可以做什么&#xff1f;学习电工有哪些好处&#xff1f; 就业去向&#xff1a;可在企业单位从事电气设备的安装、调试、操作、维护等工作&#xff0c;…

GDP药品供应管理规范确保冷链运输合规性

药品运输面临许多挑战&#xff0c;包括产品可能因暴露在不利条件下导致降解。药品供应管理规范 (GDP) 运输指南在确保整个运输链的冷链合规性方面发挥着关键作用。 药品的分销与生产和制造生产线一样精细和敏感。自全球物流公司成立以来&#xff0c;配送过程中对受控环境的需求…