Java学习之final关键字

news2024/12/26 23:45:31

目录

一、基本介绍 

二、使用final的四种情况

第一种

第二种 

第三种 

第四种 

三、细节

第一点

第二点

第三点

第四点

第五点

第六点

第七点

第八点

第九点

四、练习

第一题

第二题

 分析



一、基本介绍 

final:最终的,最后的

final 可以修饰类、属性、方法和局部变量

二、使用final的四种情况

在某些情况下,程序员可能有以下需求,就会使用到final:

第一种

1)当不希望类被继承时,可以用final修饰

package com.hspedu.final_;

public class Final01 {

}
final class A {}
class B extends A{}

第二种 

2)当不希望父类的某个方法被子类覆盖/重写(override)时,可以用final关键字修饰。

package com.hspedu.final_;

public class Final01 {

}

//当不希望父类的某个方法被子类覆盖/重写(override)时,可以用final关键字修饰。
class C {
    public final void hi(){

    }
}
class D extends C{
    @Override
    public void hi() {//错误,不能重写
        super.hi();
    }
}

原因:'hi()' cannot override 'hi()' in 'com.hspedu.final_.C'; overridden method is final

第三种 

3)当不希望类的的某个属性的值被修改,可以用final修饰。

package com.hspedu.final_;

public class Final01 {
    public static void main(String[] args) {
        E e = new E();
        e.TAX_RATE = 1.0;//错误
        System.out.println(e.TAX_RATE);
    }
}

class E {
    //当不希望类的的某个属性的值被修改,可以用final修饰。
    public final double TAX_RATE = 0.08;

}

报错:Cannot assign a value to final variable 'TAX_RATE'

第四种 

4) 当不希望某个局部变量被修改, 可以使用 final 修饰

 

 加上final之后,就无法再修改NUM的值

三、细节

第一点

1)final修饰的属性又叫常量,一般 用XX_XX_XX 来命名(大写加下划线)

比如上述中的TAXI_RATE

class E {
    //当不希望类的的某个属性的值被修改,可以用final修饰。
    public final double TAX_RATE = 0.08;

}

第二点

2) final修饰的属性在定义时,必须赋初值,并且以后不能再修改,也就是只能赋值一次,所以系统不会提供默认值,赋值可以在如下位置之一[选择一个位置赋初值即可] :

1.定义时: 如 public final double TAX RATE=0.08;

2.在构造器中

3.在代码块中

package com.hspedu.final_;

public class FinalDetail01 {
    public static void main(String[] args) {

    }
}
class AA {
    public final double TAXI_RATE1 = 0.08;//定义的时候赋值
    public final double TAXI_RATE2;
    public final double TAXI_RATE3;

    public AA() {
        //构造器中赋初值
        TAXI_RATE2 = 0.6;
    }
    {
        //在代码块中赋值
        TAXI_RATE3 = 0.9;
    }
}

第三点

3)如果final修饰的属性是静态的,则初始化的位置只能是

1.定义时 2. 在静态代码块, 不能在构造器中赋值

class BB{
    //静态属性赋初值:1.定义时 2. 在静态代码块, 不能在构造器中赋值
    public static final double TAXI_RATE1 = 0.9;
    public static final double TAXI_RATE2;
    //public static final double TAXI_RATE3;
    static {
        TAXI_RATE2 = 0.4;
    }

    public BB() {
        //静态属性在类加载的时候就会完成初始化,final修饰的变量没有默认值
        // 所以在类加载的时候就必须要给TAXI_RATE3赋值
        //但是构造器在创建对象实例的时候才会被调用,所以不能在构造器中赋值

        //TAXI_RATE3 = 0.7;
    }
}

第四点

final类不能继承,但是可以实例化对象。

package com.hspedu.final_;

public class FinalDetail01 {
    public static void main(String[] args) {
        CC cc = new CC();
    }
}

final class CC {
    //final类不能继承,但是可以实例化对象
}

第五点

5)如果类不是final类,但是含有final方法,则该方法虽然不能重写,但是可以被继承。

package com.hspedu.final_;

public class FinalDetail01 {
    public static void main(String[] args) {
     
        new EE().hi();//遵循继承的访问查找原则,输出:hi()方法
    }
}


//如果类不是final类,但是含有final方法,则该方法虽然不能重写,但是可以被继承。
//仍然遵守继承机制
class DD {
    public final void hi(){
        System.out.println("hi()方法");
    }
}
class EE extends DD{}

第六点

6)一般来说,如果一个类已经是final类了,就没有必要再将方法修饰成final方法

package com.hspedu.final_;

public class FinalDetail02 {
    public static void main(String[] args) {

    }
}
//一般来说,如果一个类已经是final类了,就没有必要再将方法修饰成final方法
//这个类是final类,那么就不能被继承,类中的方法自然也不能被重写
final class AAA{

    public final void m1(){}
}

第七点

7)final不能修饰构造方法(即构造器)

第八点

8)final 和 static 往往搭配使用,效率更高,不会导致类加载,底层编译器做了优化处理。

package com.hspedu.final_;

public class FinalDetail02 {
    public static void main(String[] args) {
        System.out.println(BBB.i);
    }
}

//final 和 static 往往搭配使用,效率更高,不会导致类加载,底层编译器做了优化处理
class BBB{
    public static int i = 16;
    static {
        System.out.println("静态代码块被加载");
    }

}

调用静态属性的时候,会触发类的加载 ,完成静态属性初始化、执行静态代码块

//final 和 static 往往搭配使用,效率更高,不会导致类加载,底层编译器做了优化处理
class BBB{
    public static final int i = 16;
    static {
        System.out.println("静态代码块被加载");
    }

}

 final和static的前后顺序没有要求

第九点

9)包装类(Integer,Double,Float,Boolean等都是final),String也是final类,不能被继承

 

四、练习

第一题

package com.hspedu.final_;

public class FinalExercise01 {
    public static void main(String[] args) {
        Circle circle = new Circle(4);
        System.out.println("圆的面积=" + circle.circleArea());
    }
}
class Circle{
    public double radius;//半径
    public final double PI; //= 3.14;//定义时赋初值

    public Circle(double radius) {
        this.radius = radius;
        //构造器赋初值
        //PI = 3.14;
    }
    {
        System.out.println("代码块被执行");
        //代码块赋值
        PI = 3.14;
    }

    public double circleArea(){
        return PI * radius * radius;
    }
}

第二题

 分析

1)用final关键字修饰形参int x,所以x的值在赋初值之后就不能再修改

2)++x:改变x的值,是错误的

3)return x + 1:虽然是x+1,但是x本身的值并没有改变,所以OK

IDEA提示

Cannot assign a value to final variable 'x':不能给最终变量x赋值

package com.hspedu.final_;

public class FinalExercise02 {
    public static void main(String[] args) {
        System.out.println(A05.addOne(5));
    }
}
class A05{
    public static int addOne(final int x) { //下面的代码是否有误, 为什么? 1min
        //++x; //错误,原因是不能修改 final x 的值
        return x + 1; //这里是可以.
    }

}

输出:6

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

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

相关文章

图形编辑器:旋转选中的元素

大家好,我是前端西瓜哥。 最近更文比较少,是因为本人在做个人开源项目,用 Canvas 做一个设计工具,做个乞丐版 figma。期间遇到了不少问题,在这里记录一下。 今天开始会恢复高频更新的,一两天一更。内容主…

Linux网络服务管理防火墙详解端口问题

每次配置访问服务器都会一团迷雾,今天来尝试弄清楚同时借鉴一下大佬的博文当做笔记 文章目录防火墙简介一、防火墙基础二、iptables防火墙策略iptables 命令格式:iptables案例1.查看开放的端口2.开放端口(此处以80端口为例)3.关闭…

超级详细的PMP复习方法,3A拿下考试不发愁!

如果问我是怎么一次性通过考试的,那绝对不只是运气,没有一点基本的实力怎么有底气通过考试呢,所以今天我们不讲什么刷题技巧,基础不牢靠将技巧都是没用的,今天我们先讲讲要怎么巩固基础,给到朋友们分享一些…

kaggle平台学习复习笔记 | 特征工程

目录数值字段roundBox/Bins类别字段onehotLabelEncoderOrdinal EncodingBinaryEncoderFrequency/Count EncodingMean/Target Encoding日期字段特征筛选feature_importances_利用方差利用相关性利用线性模型迭代消除排列重要性(Permutation Importance)特征工程决定了模型精度的…

MATLAB-RBF神经网络例1

采用所描述的系统中﹐假设真实质量为m2,在仿真中,初始值为,采用的自适应律为:设定参数为y0.5,10,25,6,分别设定参考位置为r(t)0,r(t )sin(4t) ,初始条件为,。图1.1和图1.2为指令r(t)0时控制效果,图1.3和图1.4为指令r(t)sin(4t )时的控制效果。…

verilog学习笔记- 12)触摸按键控制LED灯实验

目录 简介: 实验任务: 硬件设计: 程序设计: 下载验证: 简介: 触摸按键主要可分为四大类:电阻式、电容式、红外感应式以及表面声波式。根据其属性的不同,每种触摸按键都有其合适的使用领域。 电阻式触摸按键&#…

响应式与观察者模式

什么是响应式?响应式 是Vue 最独特的特性之一,是非侵入性的响应式系统。数据模型仅仅是普通的 JavaScript 对象。而当你修改它们时,视图会进行更新。我们也叫他双向绑定。如果想要更改视图,只要直接更改对应属性的值即可&#xff…

从隔壁老王开始的信号处理入门

诸神缄默不语-个人CSDN博文目录 我是从GNN被扔到NLP然后又做起了GNN现在又被喊去搞时间序列分类,所以现在才开始看信号处理(因为我开始做GNN以来,GNN就以图域而非谱域为主了,所以那时我没怎么看过信号处理)。 所以写个…

RabbitMQ消息队列(三):任务分发机制

在上篇文章中,我们解决了从发送端(Producer)向接收端(Consumer)发送“Hello World”的问题。在实际的应用场景中,这是远远不够的。从本篇文章开始,我们将结合更加实际的应用场景来讲解更多的高级…

jetson nano上编译与使用西门子PLC通讯库snap7

文章目录一.西门子snap7介绍二.西门子S7通讯介绍三.jetson nano编译snap7库四.Qt Cmake导入snap7库五.snap7主要函数说明1.与PLC建立连接2.读写PA区变量3.读写MK区变量六.通讯程序示例一.西门子snap7介绍 Snap7 是一个基于以太网与S7系列的西门子PLC通讯的开源库。支持包括S7系…

2023美赛数学建模ABCDEF题思路模型代码

占个位置吧,开始在本帖实时更新赛题思路代码,文章末尾获取! 持续为更新参考思路 赛题思路 会持续进行思路模型分析,下自行获取。 A题思路: (比赛开始后第一时间更新) B题思路:…

《算法分析与设计》复习笔记

目录 一、算法的基本概念 1.1 算法的定义 1.2 算法的“好坏”如何衡量? 1.3 描述算法的时间复杂度 ⭐ 1.4 如何评价算法 二、 分治法 2.1 分治法的求解步骤 2.2 平衡的概念 2.3 递归式解法 2.3.1 主定理法 ⭐ 2.4 分治法的使用条件 2.5 分治法实例 2.5…

助力安全作业生产,基于轻量级YOLOv6s开发实践反光衣检测识别分析系统

在很多实际作业生产场景中,出于对安全的考虑,施工作业等操作都是要求穿戴反光衣的,这个主要是为了保护人身安全,但是很多时候工程作业场景下因为实际种种的原因工人实际作业操作的时候很多人并没有按照要求穿戴反光衣这就给安全生…

OPTEE安全存储

本文主要介绍OPTEE的安全存储技术,翻译自官方文档:Secure storage — OP-TEE documentation documentation (optee.readthedocs.io) 一、背景 OP-TEE中的安全存储是根据GlobalPlatform的TEE Internal Core API(这里称为可信存储)…

2023/1/13总结

今天学习了链式向前星和唯一分解定理(数论)。 链式向前星 链式向前星是一种存储图的方法,在此之前我们学到过存储图的方式:邻接表以及邻接矩阵,邻接矩阵浪费了很大的空间,而邻接表 写起来的代码有一点点…

微信小程序wxml的数据和事件的绑定,以及条件和列表的渲染

文章目录1.数据绑定的基本原则在data中定义页面的数据2.事件绑定bingtap的语法格式:在事件处理函数中为data中的数据赋值事件传参bindinput的语法格式实现文本框和data之间的数据同步1.定义数据2.渲染结构3.美化样式4.绑定input事件处理函数3.条件渲染hiddenwx:if与hidden的对比…

数据库 表设计 MySQL

表设计 约束 为了保证入库数据的合理性,添加的各种规则。 约束的分类 准备测试用的表格: CREATE TABLE emp ( id INT, -- 员工id,主键且自增长 ename VARCHAR(50), -- 员工姓名,非空且唯一 joindate DATE, -- 入职日期&…

【uniapp】渲染列表数据删除项导致每项数据重置的问题解决方案

开发uniapp项目,使用的是JavaScript Vue写法,操作wList数组列表更新的时候,如果每一项都带input 或 radio组件,要操作移除的话,那么组件的输入数据会被清除重置,若不希望这样,那应该怎么做才好呢…

设计模式相关内容介绍—软件设计原则(六个)

在软件开发中,为了提高软件系统的可维护性和可复用性,增加软件的可扩展性和灵活性,程员要尽量根据6条原则来开发程序,从而提高软件开发效率、节约软件开发成本和维护成本。 目录 1.开闭原则 2.里氏代替原则 3.依赖倒转原则 4.接…

dvwa中的文件包含攻击

环境:dvwa: 192.168.11.135 dvwa版本: Version 1.9 (Release date: 2015-09-19)kail机器:192.168.11.156一、什么是文件包含漏洞?为简化代码,会把重复的code内容单独写到一个页面文件,然后再需要调用重复内容的页面中…