Java的final修饰符
final 实例域
可以将实例域定义为 final。对于 final 域来说,构建对象时必须初始化 final 实例域,构造对象之后就不允许改变 final 实例域的值了。也就是说,必须确保在每一个构造器执行之后,final 实例域的值被设置,并且在后面的操作中,不能够再对 final 实例域进行修改。
例如,可以将 Employee 类中的 name 域声明为 final,因为在对象构建之后,这个值不会再被修改,即没有 setName() 方法。
class Employee {
private final String name;
...
}
final 修饰符大都应用于基本(primitive)类型域,或不可变(immutable)类的域(如果类中的每个方法都不会改变其对象,这种类就是不可变的类。例如,String 类就是一个不可变的类)。
对于可变的类,使用 final 修饰符可能会对读者造成混乱。例如,private final StringBuilder evaluations; 在 Employee 构造器中会初始化为 evaluations = new StringBuilder(); final 关键字只是表示 evaluations 对象变量不会再指向其他的 StringBuilder 对象。不过这个 StringBuilder 对象可以更改。
public void giveGoldStar() {
evaluations.append(LocalDate.now() + ": Gold star!\n");
}
final 类和方法
阻止继承:final 类和方法。
有时候,可能希望阻止人们利用某个类定义子类。不允许扩展的类被称为 final 类。如果在定义类的时候使用了 final 修饰符就表明这个类是 final 类。如果将一个类声明为 final,其中的所有方法自动地成为 final,而不包括数据域(final 类的数据域不会自动地成为 final 域)。
例如,假设希望阻止人们定义 Executive 类的子类,就可以在定义 Executive 这个类的时候,使用 final 修饰符声明。声明格式如下所示:
public final class Executive extends Manager {}
类中的特定方法也可以被声明为 final。如果这样做,子类就不能覆盖这个方法例如:
public class Employee {
public final String getName() {
return name;
}
}
将方法或类声明为 final 主要目的是:确保它们不会在子类中改变语义。例如:
- Calendar 类中的 getTime() 和 setTime() 方法都声明为 final。这表明 Calendar 类的设计者负责实现 Date 类与日历状态之间的转换,而不允许子类处理这些问题。
- 同样地,String 类也是 final 类,这意味着不允许任何人定义 String 的子类。换言之,如果有一个 String 的引用,它引用的一定是一个 String 对象,而不可能是其他类的对象。
有些程序员认为:除非有足够的理由使用多态性,应该将所有的方法都声明为 final。事实上,在 C++ 和 C# 中,如果没有特别地说明,所有的方法都不具有多态性。这两种做法可能都有些偏激。我们提倡在设计类层次时,仔细地思考应该将哪些方法和类声明为 final。
参考资料
《Java核心技术卷一:基础知识》(第10版)第 4 章:对象与类 4.3.9 final 实例域
《Java核心技术卷一:基础知识》(第10版)第 5 章:继承 5.1.7 阻止继承:final 类和方法
Java的final修饰符的更多相关文章
- Java中final修饰符深入研究
一.开篇 本博客来自:http://www.cnblogs.com/yuananyun/ final修饰符是Java中比较简单常用的修饰符,同时也是一个被"误解"较多的修饰符.对很 ...
- java中final修饰符的使用
1.final修饰符的用法: final可以修饰变量,被final修饰的变量被赋初始值之后,不能对它重新赋值. final可以修饰方法,被final修饰的方法不能被重写. final可以修饰类,被fi ...
- 【Java】final修饰符的使用
final修饰符的使用 1.修饰类: final修饰的类不能被继承,final修饰的类里面的方法都是(隐式)final方法 2.修饰方法: final修饰的方法不能被重写 3.修饰变量(被修饰的变量一 ...
- java 中间 final修饰符
修饰符final:它是一个常数,我不同意改变 ,可以修改 变数,办法 ,分类 final修改变量:是final成常量,一旦赋值不能改变 常量能够在初始化时直接赋值.也能够在构造方法里赋值.仅仅能在这两 ...
- 【java】final修饰符介绍
final: 最终,作为一个修饰符特点:1.可以修饰类,函数,变量2.被final修的的类不能被继承.因此类用final修饰可以避免被继承,被子类重写功能.3.被final修饰的方法不可以被重写.4. ...
- JAVA中final修饰符小结
一.final关键字可以用来修饰类.方法.变量.各有不同. A.修饰类(class). 1.该类不能被继承. 2.类中的方法不会被覆盖,因此默认都是final的. 3.用 ...
- Java final 修饰符知识点总结
final从字面上理解含义为“最后的,最终的”.在Java中也同样表示出此种含义. final可以用来修饰变量(包括类属性.对象属性.局部变量和形参).方法(包括类方法和对象方法)和类. 1. fin ...
- JAVA基础-栈与堆,static、final修饰符、内部类和Java内存分配
Java栈与堆 堆:顺序随意 栈:后进先出(Last-in/First-Out). Java的堆是一个运行时数据区,类的对象从中分配空间.这些对象通过new.newarray.anewarray和mu ...
- java中接口的概念及使用(补充final修饰符的使用)
接口 初期理解,可以是一个特殊的抽象类 当抽象类中的方法都是抽象的,那么该类可以通过接口的形式来表示 class 用于定义类 interface 用于定义接口 接口定义时,格式特点: 1.接口中常见的 ...
- java中static和final修饰符
static和final修饰符 一.static修饰符 static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念. ...
随机推荐
- EXT GridPanel button 按钮 事件 方法 DirectMethod
C# 代码 //首页 Ext.Net.Button btnFirst = new Ext.Net.Button(); btnFirst.Icon = Icon.ControlStartBlue; bt ...
- (三).JavaScript的分支结构和循环结构
1. 分支结构 1.1 分支语句之单分支 ①.语法: if(值,如果不是布尔值会强制转换成布尔值) { 代码块; } ②.案例: // 案例:如果a变量的值加键盘上输入的数大于100,就打印我爱你二狗 ...
- apt-get install 出现could not open lock file /var/lib/dpkg/lock错误问题
apt-get install 经常出现 could not open lock file /var/lib/dpkg/lock -open 错误问题 一种解决办法 1.切换到root用户 su ~ ...
- jjencode|JS混淆手工解析编码过程以及自定义混淆变体改装
此前发布过关于aaencode的混淆编码,此篇文章继续说同作者的jjencode混淆编码的具体过程. 介绍 首先是jjencode的作者提供的编码测试页:http://utf-8.jp/public/ ...
- python学习记录(三)-数据类型
字符串格式化 var = 'abcde' # 切片 print(var[2],var[-1]) # c e print(var[1:3:1],var[-2:-5:-1],var[::-1]) # bc ...
- VBA中的集合
Sub testSet() Dim c As New Collection c.Add ("A") c.Add (2) c.Add ("A") For i = ...
- 去除python中数据的0值
import numpy as np a = [0, 1, 2] a = np.array(a) a = a[a != 0].tolist() print(a) //a = [1, 2]
- C#测试web服务是否可用(转)
转摘:http://www.cnblogs.com/xienb/p/3443282.html winform客户端经常需要调用webservice或者WCF进行数据交互,但是远程服务有可能不存在或者服 ...
- windows中使用jenkins部署项目,后端无法启动问题
忙活一下午+一上午,问题终于解决了.找了各种办法,最终解决方式如下: 1.jenkins打包成功,到接口会报502异常 原因:后端未成功启动 解决办法: 1.刚开始使用shell命令,无法查杀进程,后 ...
- .net core 使用 Nlog 配置文件
nlog.config文件 安装nuget包: NLog.Web.AspNetCore 配置开始 <?xml version="1.0" encoding="utf ...