当前位置: 首页 > news >正文

java final关键字 详解

  • 概述:

  • 作用:

  • 细节:

  • 演示:

  • 总结:


一、概述 :

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 {@Overridepublic 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.lryc.cn/news/13883.html

相关文章:

  • Vbs_To_Exe制作简易exe程序
  • AI制药 - TMScore(US-align)、RMSD、Sequence 源码
  • 关于个人的经历
  • 设计在单链表中删除值相同的多余结点的算法(包括指针的引用的知识点)
  • 100份简历才找一个合适的,2023,软件测试岗位饱和了吗?
  • (三十七)vue 项目中常用的2个Ajax库
  • Python打包调试问题解决
  • 计算机SCI期刊自引率一般是多少? - 易智编译EaseEditing
  • 力扣(LeetCode)417. 太平洋大西洋水流问题(2023.02.19)
  • Python解题 - CSDN周赛第30期 - 天然气订单
  • 移动WEB开发一、基础知识
  • 07 二叉树
  • 3|物联网控制|计算机控制-刘川来胡乃平版|第4章:过程通道与人机接口-4.1数字量输入输出通道接口|课堂笔记|ppt
  • 从 ClickHouse 到 Apache Doris,腾讯音乐内容库数据平台架构演进实践
  • linux线程的基本知识
  • docker swarm 集群服务编排部署指南(docker stack)
  • ESP开发环境搭建
  • 内网安全——ssH协议WindowsLinux密码获取hashcat
  • 【编程入门】应用市场(安卓版)
  • 【图像分类】卷积神经网络之LeNet5网络模型结构详解
  • 2023-JavaWeb最新整理面试题-TCP、Tomcat、Servlet、JSP等
  • 【云原生kubernetes】k8s Ingress使用详解
  • [数据结构]:顺序表(C语言实现)
  • 【大厂高频必刷真题100题】《有序矩阵中第 K 小的元素》 真题练习第27题 持续更新~
  • 两年外包生涯做完,感觉自己废了一半....
  • 02- OpenCV绘制图形及图像算术变换 (OpenCV基础) (机器视觉)
  • 猜数字大小 II
  • CCNP350-401学习笔记(251-300题)
  • 掌握MySQL分库分表(二)Mysql数据库垂直分库分表、水平分库分表
  • 算法训练营 day50 动态规划 单词拆分 多重背包理论基础