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.hqwc.cn/news/209706.html

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

相关文章

一站式解决Mac音视频转换需求——Xilisoft Video Converter Ultimate for Mac

在数字化时代,音视频的应用越来越广泛,不同的设备和平台对音视频格式的要求也不尽相同。因此,如何找到一款功能强大、易于操作的音视频转换软件成为了Mac用户的迫切需求。而Xilisoft Video Converter Ultimate for Mac(曦力音视频…

对未来新能源车测试工具的看法

汽车行业正在经历变革的说法算是比较轻描淡写的了,还记得我1983年加入这个行业时,行业聚焦点是引入发动机管理系统。当时还是以家庭掀背车为主的时代,发动机分析仪的体积像衣柜一样大,还没出现“CAN”通信协议。现在经常听到我的导…

基于element-plus定义表单配置化扩展表单按钮

文章目录 前言一、新增btn.vue组件二、使用总结如有启发&#xff0c;可点赞收藏哟~ 前言 在后台管理系统一般都存在列表查询&#xff0c;且可输入数据进行查询 基于element-plus定义表单配置化 新增按钮配置化 一、新增btn.vue组件 <template><template v-for&qu…

2023 年 亚太赛 APMCM (C题)国际大学生数学建模挑战赛 |数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时&#xff0c;你是否曾经感到茫然无措&#xff1f;作为2022年美国大学生数学建模比赛的O奖得主&#xff0c;我为大家提供了一套优秀的解题思路&#xff0c;让你轻松应对各种难题。 问题一 为了分析中国新能源电动汽车发展的主要因素&#xf…

xpath translate

xpath处理字符串替换&#xff1a; 示例页面&#xff1a;网上购药可以刷医保&#xff0c;药店和医药电商终于等到了 把 2023年11月22日 替换为 2023-11-22 首先获取页面2023年11月22日的xpath为&#xff1a; //p[class"mart20 font12 author"]/span[1]/text() 替换…

测绘资质技术管理制度

技术管理制度 建立健全技术管理制度&#xff0c;明确技术设计、技术处理和技术总结等要求。其中简单、日常性的测绘项目可以制定《作业指导书》 质量检查管理制度 建立健全质量检查管理制度&#xff0c;明确过程检查、最终检查、质量评定、检查记录和检查报告等要求。 人员培训…

项目总体测试计划书

目的&#xff1a;编写此测试方案的目的在于明确测试内容、测试环境、测试人员、测试工作进度计划等&#xff0c;以保证测试工作能够在有序的计划安排进行。 测试目标&#xff1a;确保XXX项目的需求分析说明书中的所有功能需求都已实现&#xff0c;且能正常运行&#xff1b;确保…

在线工具收集

在线工具收集 1、在线P图 https://www.photopea.com/ 一款类似于PS的在线抠图软件 ①去除图片中的文字&#xff0c;并填充背景色 第一步&#xff1a;使用矩形选中要清除的文字 第二步&#xff1a;点击编辑选择填充 第三步&#xff1a;选择内容识别&#xff0c;保留透明区域…

Java课程设计基于JavaWeb的学生信息管理系统源码+数据库+课程设计报告

完整代码下载地址&#xff1a;基于JavaWeb的学生信息管理系统 一 绪论 1课题背景及现状 随着信息技术在学生信息管理上的广泛应用&#xff0c;学生信息管理系统的实施在技术上已逐步成熟。学生信息的管理对于学校管理者来说至关重要&#xff0c;是学校不可缺少的数据资源。特…

HT6809 3W 低 EMI 防削顶 D 类音频功率放大器的特点

HT6809是一款内部集成32阶数字音量控制以及防削顶失真功能且具有超低EMI的立体声免输出滤波器 D类音频功率放大器。 ◼ HT6809特点&#xff1a; ・防削顶失真功能(Anti-Clipping Function, ACF) ・超优异的全带宽EMI抑Z性能 ・免LC滤波器数字调制,直接驱动扬声器 ・32阶数…

Excel使用VLOOKUP查询数据

VLOOKUP函数在百度百科中的解释是&#xff1a; 解释一下&#xff0c;函数需要4个参数&#xff1a; 参数1&#xff08;lookup_value&#xff09;&#xff1a;需要匹配的值参数2&#xff08;table_array&#xff09;&#xff1a;在哪个区域里进行匹配参数3&#xff08;col_index…

使用EasyPlayer播放H.265视频流

使用EasyPlayer播放H.265视频流 EasyPlayer流媒体视频播放器 EasyPlayer流媒体视频播放器 EasyPlayer流媒体视频播放器可支持H.264与H.265编码格式&#xff0c;性能稳定、播放流畅&#xff0c;能支持RTSP、RTMP、HLS、FLV、WebRTC等格式的视频流播放&#xff0c;并且已实现网页…