final关键字:我偏不让你继承

简介: final关键字:我偏不让你继承

哈喽,小伙伴们大家好,我是兔哥呀,今天就让我们继续这个JavaSE成神之路!


这一节啊,咱们要学习的内容是Java所有final关键字。


之前呢,我们学习了继承,这大大提高了代码的灵活性和复用性。但是总有一些时候,我们的类不希望被子类继承,成员属性不希望被子类修改,成员方法不希望被子类重写,那该怎么办呢?


final关键字相当于“最终”或“不可更改”,在生活中,比如学校期末考试的成绩是“最终”的,不可再更改。


同样在java程序中,final关键字也表示最终,用于修饰变量、方法和类,其含义是指不可更改,即所修饰的类不可以被继承,修饰的方法不可以被重写,修饰的变量为常量,值不可以改变。


1.final 修饰类

final 修饰类代表这个class不允许被继承。

注意,class左边的访问修饰符(比如public)和final的位置可以互换。不过,我们一般习惯于讲final写在public后面。

比较典型的,就是String类,它就是final的。

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
}

为什么呢?


保证String类的安全性,防止被其他类继承,重写String类的方法,破坏String类的语义,导致程序出错。


String类是一个特殊的类,它的内部实现了字符串的指针,可以优化字符串的操作效率,如果被其他类继承,就可能导致内部实现的细节被破坏,影响性能。


总结下来就是,String类用的很频繁,而且已经写的够牛逼了,你就别瞎改啦。


2.final 修饰成员方法

final 修饰成员方法,就是在返回值左边加上final关键字,这样一来这个方法就不能再被子类重写,但是在访问权限足够的情况下依然能够被访问和调用,也可以被子类继承使用。


3.final 修饰方法内的局部变量

public final void sayHello(){
    final String name = "keke";
    System.out.println("Hello, I am a "+name+"!");
}

final可以修饰方法内的局部变量,被修饰的变量不能再被修改。

PS:final 修饰方法内的局部变量,你必须在这个变量被使用前进行初始化!

其实吧,不仅是final的变量,任何局部变量你不初始化都不能用啊。。。

String aa;
System.out.println(aa); //报错

4.final 修饰成员变量

final修饰成员方法,该成员方法就不能被子类重写,但是仍然可以被子类继承并可以通过子类对象调用该方法。

final修饰成员变量,该成员变量必须在创建对象之前进行赋值,否则编译失败。

20.png


如图所示,你不能声明一个final变量却不给他赋值。给final变量赋值你有两种方式,一个是在构造方法中赋值,另一个是在定义的时候就赋值。


从深层次讲,就是你必须得在这个类的对象出现之前就给final变量赋值,因此你不能在set方法中给他赋值,因为你必须先new对象出来才能调用set方法啊。


5.final修饰的局部变量能改属性吗

就是说,在一个方法里,我定义一个局部的引用类型变量,而且还设置了final,那么我们可以修改它的属性值吗?

public static void main(String[] args) {
    final Student s = new Student();
    s.setMoney(200000);
    System.out.println(s.getMoney());
}

答案是当然可以,final修饰的变量,你不能给他重新赋值,但是没说不能修改其属性啊。

21.png


这样就不行咯!

所以,final修饰了这个变量,他的地址就被定死了,不能改了。

顺便说一下,构造方法是不能修饰构造方法的。


6. 课后作业

1、下列关于final关键字的描述,正确的是( )

A. final关键字可用来修饰方法

B. final关键字可用来修饰类

C. 声明为final的方法不能被重写

D. final修饰的方法可以被private修饰符修饰

22.jpg


相关文章
|
前端开发 Java 数据库连接
导出文件:使用Hutool导出数据为Excel文件
导出文件:使用Hutool导出数据为Excel文件
1539 0
导出文件:使用Hutool导出数据为Excel文件
|
监控 流计算
Flink 运行时日志分析
Flink 运行时日志分析
323 0
|
Linux Docker 容器
CentOS7使用阿里源安装最新版Docker
CentOS7使用阿里源安装最新版Docker
10547 0
|
机器学习/深度学习 缓存 Linux
python环境学习:pip介绍,pip 和 conda的区别和联系。哪个更好使用?pip创建虚拟环境并解释venv模块,pip的常用命令,conda的常用命令。
本文介绍了Python的包管理工具pip和环境管理器conda的区别与联系。pip主要用于安装和管理Python包,而conda不仅管理Python包,还能管理其他语言的包,并提供强大的环境管理功能。文章还讨论了pip创建虚拟环境的方法,以及pip和conda的常用命令。作者推荐使用conda安装科学计算和数据分析包,而pip则用于安装无法通过conda获取的包。
1566 0
IDEA小技巧:注释代码在一列并且注释开头加空格
IDEA小技巧:注释代码在一列并且注释开头加空格
659 0
|
XML Java 关系型数据库
IDEA 报错: java.sql.SQLException: Access denied for user ‘root ‘@‘localhost‘ (using password: YES)
IDEA 报错: java.sql.SQLException: Access denied for user ‘root ‘@‘localhost‘ (using password: YES)
2539 0
|
流计算
flink 单作业模式部署提交作业爆:Trying to access closed classloader. Please check if you store classloaders direc
flink 单作业模式部署提交作业爆:Trying to access closed classloader. Please check if you store classloaders direc
flink 单作业模式部署提交作业爆:Trying to access closed classloader. Please check if you store classloaders direc
|
SQL 消息中间件 NoSQL
实时计算 Flink版操作报错合集之部署war包的时候,错误提示 "No ExecutorFactory found to execute the application." 如何解决
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
532 2
|
SQL Java API
【flink番外篇】1、flink的23种常用算子介绍及详细示例(2)- keyby、reduce和Aggregations
本文主要介绍Flink 的3种常用的operator(keyby、reduce和Aggregations)及以具体可运行示例进行说明
【flink番外篇】1、flink的23种常用算子介绍及详细示例(2)- keyby、reduce和Aggregations
|
XML Java 数据库连接
日志组件logback介绍及配置使用方法
转载于:http://sunney2010.iteye.com/blog/1404729 一、logback的介绍 Logback是由log4j创始人设计的又一个开源日志组件。logback当前分成三个模块:logback-core,logback- classic和logback-access。logback-core是其它两个模块的基础模块。logback-cla
3627 0