Java面向对象(高级)-- final关键字的使用

文章目录

  • 一、 final的意义
  • 二、 final的使用
    • (1) final修饰类
    • (2) final修饰方法
    • (3) final修饰变量
      • 1. 修饰成员变量
        • 1.1 举例1
        • 1.2 举例2
      • 2. 修饰局部变量
        • 2.1 举例1
        • 2.2 举例2
    • (4)final搭配static
    • (5)总结
  • 三、 笔试题
    • (1)题1
    • (2)题2

一、 final的意义

final:最终的,不可更改的

final可以用来修饰的结构:类、方法、变量(成员变量、局部变量)

二、 final的使用

(1) final修饰类

表示这个类不能被继承,没有子类。提高安全性,提高程序的可读性。

例如:String类、System类、StringBuffer类

final class Eunuch{//太监类}
class Son extends Eunuch{//错误}

【举例】

正常情况下:

class A{}class B extends A{}

若此时类A前面有final修饰,则B无法继承于A。如下:

image.png

💬什么样的需要用final去修饰呢?

功能不需要再被扩展了,比如String类、StringBuffer类、StringBuilder类。

image.png

会发现String加了一个final修饰:

public final class String...

这就意味着不能去声明一个类去继承于String。

image.png

Stirng类用final修饰,没有必要再进行功能的扩展。

(2) final修饰方法

表示这个方法不能被子类重写

例如:Object类中的getClass()

class Father{public final void method(){System.out.println("father");}
}
class Son extends Father{public void method(){//错误System.out.println("son");}
}

【举例】

正常情况下:

class C{public void method(){}
}class D extends C{//此时可以public void method(){}
}

若是method()方法前面有final修饰,就不能重写了。如下:

image.png

💬什么样的方法需要用final去修饰呢?

这个方法已经设计的很完备了,也没有扩展的必要性,就可以用final修饰。

比如Object类中的getClass()

可以看一下,首先Ctrl+N调出搜索框,输入“Object”:

image.png

然后Ctrl+F12,搜索”getClass“:

image.png

然后可以看到getClass被final修饰,表示这个方法不能被重写了。这个方法的作用就是获取当前对象所属的类,不需要重写。

image.png

native表示调用的是本地的方法,会调用底层C、C++相关的代码。

native修饰的getClass()方法若是调用的时候,这个方法的栈帧会进入栈中,此时它入的栈叫做本地方法栈

这个本地方法,就是指native修饰的方法。

为啥getClass()方法没有方法体?因为它调用的是底层的C、C++,不是用java代码写的,所以没有方法体。它会链接到相关dll文件中的C、C++代码。

在早期,Java发展不成熟的时候,会用到native。

(3) final修饰变量

final修饰某个变量(成员变量或局部变量),一旦赋值,它的值就不能被修改,即常量,常量名建议使用大写字母。

例如:final double MY_PI = 3.14;

如果某个成员变量用final修饰后,没有set方法,并且必须初始化(可以显式赋值、或在初始化块赋值、实例变量还可以在构造器中赋值)

1. 修饰成员变量

1.1 举例1
public class FinalTest {public static void main(String[] args) {E e=new E();System.out.println(e.MIN_SCORE);    //可以调用}
}class E{//成员变量final int MIN_SCORE=0;
}

常量MIN_SCORE可以被调用,但是不能更改:

image.png

若此时将常量的显示赋值删掉,发现不可以:

image.png

没有默认值吗?

对于final修饰的成员变量,这时候默认值就不好使了。即使想用默认值0,也需要写出来。


若用方法赋值,不可以:

image.png

方法需要用对象去调用,而调用对象的时候,这个值该有就应该得有了。

之前说过给类的实例变量赋值的位置,其中默认初始化、显示初始化、代码块中初始化、构造器中初始化,它们在造对象过程中实现;而通过“对象.属性”或“对象.方法”进行赋值的时候,对象已经有了。

现在我们给常量赋值,意思就是当创建完对象的时候,这些属性的值就应该要有了。

后续调用方法(比如setRight()方法),体现为修改这个值。

而在声明它的时候没有赋值,而在有了对象之后,方法里面又不能修改这个值。

image.png

当对象创建完,属性的值就应该确定下来了。

💬有哪些位置可以给成员变量赋值?

  • 显式赋值
  • 代码块中赋值
  • 构造器中赋值
class E{//成员变量//1.默认赋值--NO//final int MIN_SCORE;//2.显示赋值--YESfinal int MIN_SCORE=0;//3.代码块中赋值--YESfinal int MAX_SCORE;{MAX_SCORE=100;  //一旦赋值就不可以再次赋值}//4.构造器中赋值--YESfinal int LEFT;public E(){ //用此构造器造完对象LEFT就赋完值了LEFT=2;}public E(int left){ //不同构造器都需要对常量LEFT赋值,每造一个对象就会拥有一份LEFT,所以每个对象的LEFT可以不同,但是一旦赋值不可更改LEFT=left;}//5.方法赋值--NO/*final int RIGHT;    //没有在允许的位置赋值public void setRIGHT(int right){RIGHT=right;    //有了对象之后,不能在方法里面修改常量的值}*/}
1.2 举例2
public final class Test {public static int totalNumber = 5;public final int ID;public Test() {ID = ++totalNumber; // 可在构造器中给final修饰的“变量”赋值}public static void main(String[] args) {Test t = new Test();System.out.println(t.ID);}
}

2. 修饰局部变量

final修饰局部变量:一旦赋值就不能修改

2.1 举例1
  • 方法内声明的局部变量:在调用局部变量前,一定需要赋值。而且一旦赋值,就不可更改。

【举例】

一般情况下:

class F{public void method(){int num=10;num++;System.out.println(num);}
}

若此时给num加上final,就不可以对num更改了:

image.png

如下:

class F{public void method(){final int num=10;   //写两行也没事,只要在调用它之前赋上值就行,一旦赋值不可更改//num++;System.out.println(num);}
}
  • 方法的形参:在调用此方法时,给形参进行赋值。而且一旦赋值,就不可更改。

【举例】

一般情况下:

class F{public void method(int num){num++;System.out.println(num);}
}

若是给num加上final,num就是一个常量,这个常量还是在调用的时候赋的,那么赋完值之后就不要更改了。

image.png

如下:

class F{public void method(final int num){//num++;    //赋完值之后就不要更改了System.out.println(num);}
}
2.2 举例2
public class TestFinal {public static void main(String[] args){final int MIN_SCORE ;MIN_SCORE = 0;final int MAX_SCORE = 100;MAX_SCORE = 200; //非法}
}
  • 错误演示:
class A {private final String INFO = "atyuyi";  //声明常量public void print() {//The final field A.INFO cannot be  assigned//INFO = "雨翼轻尘"; }
}

(4)final搭配static

finalstatic搭配:修饰成员变量时(不能是局部变量,static不能修饰局部变量),此成员变量称为:全局常量。(只有一个且不能改变

这个变量兼具final和static的特点。

比如:Math的PI (直接通过类来调用且不能变)

在实际写代码的时候,若是在修饰类、修饰方法的时候忘记使用不碍事,但是修饰变量的时候记得加上,而且变量名要大写。

(5)总结

1、 final的理解:最终的

2、final可以用来修饰的结构:类、方法、变量(成员变量、局部变量)

3、具体说明:

  • final修饰:表示此类不能被继承。
    比如:String、StringBuffer、StringBuilder类

  • final修饰方法:表示此方法不能被重写
    比如:Object类中的getClass()

  • final修饰变量:既可以修饰成员变量,也可以修饰局部变量。
    此时的"变量"其实就变成了"常量",意味着一旦赋值,就不可更改。

    • final修饰成员变量: 有哪些位置可以给成员变量赋值?
      > 显式赋值
      > 代码块中赋值
      > 构造器中赋值

    • final修饰局部变量:一旦赋值就不能修改
      > 方法内声明的局部变量:在调用局部变量前,一定需要赋值。而且一旦赋值,就不可更改
      > 方法的形参:在调用此方法时,给形参进行赋值。而且一旦赋值,就不可更改

4、 finalstatic搭配:修饰成员变量时,此成员变量称为:全局常量。
比如:Math的PI

三、 笔试题

(1)题1

排错

public class Something {public int addOne(final int x) {//return ++x;	//不可以return x + 1;	//可以,x值没有变}
}

(2)题2

排错

public class Something {public static void main(String[] args) {Other o = new Other();new Something().addOne(o);}public void addOne(final Other o) {// o = new Other();o.i++;	//让i++可以,因为i是变量,o不能变}
}
class Other {public int i;
}

局部变量o指向一个Other对象,Other对象里面有一个i,i没有用final修饰,表示它是一个变量。

将o加了一个final,意味着它的地址不能变了,而o指向的对象的属性可以变化。

如下:
image.png

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

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

相关文章

java协程操作mysql数据库

我的项目: nanshaws/nettyWeb: 复习一下netty,并打算做一个web项目出来 (github.com) 最近在项目中分别添加了虚拟线程操作mysql数据库,和用协程操作mysql数据库 同理先跟我这个博客操作一下前面的:就单纯代码的时候进行修改&a…

TikTok与精神健康:社交媒体在压力时代的作用

在当今数字化和社交化的时代,社交媒体已成为人们生活中不可或缺的一部分。其中,TikTok作为一款备受欢迎的短视频应用,不仅改变了人们的娱乐方式,也对精神健康产生了深远的影响。 本文将深入探讨TikTok在压力时代对精神健康的作用…

2023年中国油田工程建设市场规模现状及行业竞争分析[图]

油田工程建设是在确定油气田有开发生产的价值的基础上,进行系统的工程建设,油田工程建设包括井场建设、管道施工、土石方工程、道路建设及绿化等服务。 油田工程建设主要内容 资料来源:共研产业咨询(共研网) 油田服务…

抖音商城小程序源码系统 附带完整的搭建教程

大家好啊,今天小编来给大家分享一款抖音商城小程序源码系统。这可是当下最热门的的项目之一。。抖音作为国内最大的短视频平台之一,拥有庞大的用户群体和丰富的社交功能。为了满足用户在抖音上购物和交易的需求,抖音商城小程序应运而生。 以…

租车系统开发/多功能租车平台微信小程序源码/汽车租赁系统源码/汽车租赁小程序系统

源码介绍: 多功能租车平台微信小程序源码,作为汽车租赁、摩托车租车平台系统源码,是小程序系统。基于微信小程序的汽车租赁系统源码。 开发环境及工具: 大等于jdk1.8,大于mysql5.5,idea(eclip…

拆解:淘宝客新玩法之微信淘礼金创建怎么做

最近看到一种新的淘宝客玩法,迫不及待的想分享给大家。微信公众号查券大家都不陌生,也有不少人都在做这个。最近看到有人在做微信公众号创建淘礼金。之所以说这个玩法新是因为目前大多数淘客还在做返利。返利有周期长、提现有门槛等痛点。 微信公众号创建…

基于Springcloud微服务框架智慧工地系统源码

建筑行业快速发展,各建筑工程的建设规模在不断扩大,各岗位工作人员的工作内容所涉及的方面也越来越广泛。随着信息技术水平不断提高,人工记录的方式已经不能够满足大项目的管理要求,就此,创造出一种新型的施工管理技术——智慧工地…

携程token

网址:https://flights.ctrip.com/ 记录一下这个要我狗命的token 原本以为解决验证码就能继续查机票信息,奈何太年轻,或者说原本以为这个头部信息的token不重要,其实还是很重要的。 关于查价格 ,如果说查询频繁之后就…

小型内衣裤洗衣机哪个牌子好?性价比小型洗衣机推荐

内衣内裤应该如何清洗才能实现在不伤衣的同时有能够洗干净呢?其实除了使用温水搭配手洗以外,还有一些清洗方式,那就是选择一台专门为内衣定制的内衣洗衣机。目前内衣洗衣机由于精致小巧,方便安装,方便使用,…

PC分页操作以及loading效果

page-size 每页显示条目个数 current-page 当前页数 total 数据总数 current-change【currentPage 改变时会触发】 切换分页时会先加载,等在接口数据,接口返回,加载会关闭(在获取接口数据完毕哪里加上this.loadingfalse&#xff0…

低权限(无权限)时如何在mysql客户端控制台的大量输出中快速定位mysql死锁或慢sql

查看mysql的查看死锁的方式很多,但很多时候我们普通开发者的权限比较低,无法执行某命令。比如本次就准备使用 SHOW ENGINE INNODB STATUS;命令,但客户端提示权限不够。后来本人找到了另一条低权限的命令 show full PROCESSLIST;但是show fu…

比例减压阀放大器选型

控制阀型如比例插装阀、比例方向阀、比例压力阀、比例流量阀、比例叠加阀等,安装方式有插式及导轨卡槽式,输入指令可选0-10V、4-20mA、10V、0-5V,输出电流可选最大3A,适用各大品牌不带电反馈常规比例阀匹配度,控制比例…

1553. 吃掉 N 个橘子的最少天数(记忆化+贪心优化)

Problem: 1553. 吃掉 N 个橘子的最少天数 文章目录 题目思路Code 题目 使得 n 变成0的操作有三种方式 : 吃掉一个橘子。如果剩余橘子数 n 能被 2 整除,那么你可以吃掉 n/2 个橘子。如果剩余橘子数 n 能被 3 整除,那么你可以吃掉 2*(n/3) 个…

易点易动设备管理系统提升设备能耗管理和设备状态监控效率

如今,能源效率和设备状态监控对于企业来说变得越发重要。传统的设备管理方式往往存在能耗浪费和难以实时监控设备状态的问题。为了解决这些问题,易点易动设备管理系统应运而生。本文将介绍易点易动设备管理系统的功能和优势,以及如何通过它提…

Oracle数据库安装踩坑记录

Oracle数据库安装踩坑记录 踩坑目录 可能会用到的教程1. 管理员用户(sys)登录oracle命令2. 默认密码:三个 如果忘记改密码参考 1. 登录后修改密码3. 查看账号密码:只有sys用户登录后才能查看4. sqldeveloper 连接oracle数据库5. o…

简墨的进化之路:打造大模型数据计算系统的云存储底座

10月24日程序员节,「大模型数据计算系统」2023拓数派年度技术论坛在上海圆满落幕,拓数派大模型数据计算系统(PieDataComputingSystem,缩写:πDataCS)如约而至!πDataCS 以云原生技术重构数据存储…

论文浅尝 | 用于文档级事件关系抽取的稀疏事件表示的判别推理

笔记整理:邹铭辉,天津大学硕士,研究方向为自然语言处理 链接:https://aclanthology.org/2023.acl-long.897 动机 文档级事件关系抽取(Document-level Event-Event Relation Extraction,简称DERE&#xff09…

【TypeScrpt算法】算法的复杂度分析

算法的复杂度分析 什么是算法复杂度? 不同的算法,其实效率是不一样的 让我举一个案例来比较两种不同的算法在查找数组中给定元素的时间复杂度 [1,2,3,4,5,6,7,...9999,n] 顺序查找 这种方法从头到尾遍历整个数组,依次比较每个元素和给定元…

SAP-查看业务变更记录

一、通过事务码查询修改记录 1、输入TCODE:AUT10,输入时间和事务处理代码,全部搜索输入*。 2、点击刷新,对已输入的条件进行重置。 3、在左侧下菜单,选择要查询的事务记录,双击,会带入“事务处…