“无法改变的设计”——浅谈Java中的final关键字

在Java中,final关键字可以用来修饰类、变量(包括成员变量和局部变量)、方法,下面从这三个方面分别说明。
final方法
当一个方法被final修饰时,表明这个方法不能被子类重写。
下面程序试图重写final方法,将会引发编译错误。
public class Dinosaur {
public final void test() {
}
}
public class Further extends Dinosaur {
// 下面代码会编译错误,不能重写final方法
public void test() {
}
}
特别的,类中的所有private方法都被隐式地指定为是final的。
final类
当一个类被final修饰时,表明该类不能被继承。若一个类试图继承一个final类时,将会编译错误。
// 定义一个Dinosaur类,并声明为final的
public final class Dinosaur {
//...
}
// 当Further试图继承Dinosaur,编译会不通过
public class Further extends Dinosaur {
}
由于final类不能被继承,所以final类中所有的方法都隐式地指定为final的。你也可以给这些final类中的方法加上fianl修饰符,不过这样做没有任何意义。
像我们常用的String类,就是被设计成final的,它不能有子类。

final变量
变量分为成员变量和局部变量,下面分别说明。
- final成员变量
当一个成员变量被final修饰时,表明这个变量完成初始化(实例变量:要么在定义该实例变量时指定初始值,要么在普通初始化块或构造器中指定初始值;类变量:要么在定义该类变量时指定初始值,要么是在静态初始化块指定初始值)后,就不能被改变。
下面程序代码演示final修饰成员变量的效果。
public class FinalVariableTest {
// 定义成员变量时指定初始化值
private final int a = 6;
// 定义成员变量时未指定初始化值,将在构造器中进行初始化
private final String s;
public FinalVariableTest() {
// 初始化s的值,如果不初始化s的值,将会编译错误,final修饰的成员变量必须由程序显式地指定初 // 始化值
this.s = "程序员技术之瞳";
// ERROR,这里试图给a重新赋值,将会编译错误
a = 7;
}
}
- final局部变量
如果final修饰的局部变量在声明时已经赋了初始值,则后面代码中不能再重新赋值。
public void test() {
// 这里定义一个final的局部变量,并赋了初始值1
final int a = 1;
// ERROR,试图重新赋值,则会编译错误
a = 2;
}
如果final修饰的局部变量在声明时未指定初始值,则后面代码中可以给该变量赋值,但只能赋值一次。
public void test() {
// 这里定义一个final的局部变量,但没有指定初始值
final int a;
// 给变量赋值为1
a = 1;
// ERROR,这里若试图给a重新赋值,则会编译错误
a = 2;
}
final修饰基本数据类型变量和引用类型变量的区别
当final修饰的是基本数据类型变量时,该变量一旦获得初始化值,其值将无法改变。
当final修饰的是引用数据类型变量时,由于该变量保存的是一个地址值,final保证的是该变量不会引用另外一个对象,但该对象的内容可以改变。

“无法改变的设计”——浅谈Java中的final关键字的更多相关文章
- 浅谈Java中的final关键字
浅谈Java中的final关键字 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来 ...
- 浅谈Java中set.map.List的区别
就学习经验,浅谈Java中的Set,List,Map的区别,对JAVA的集合的理解是想对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操 ...
- Java基础学习总结(29)——浅谈Java中的Set、List、Map的区别
就学习经验,浅谈Java中的Set,List,Map的区别,对JAVA的集合的理解是想对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操 ...
- 浅谈Java中的对象和引用
浅谈Java中的对象和对象引用 在Java中,有一组名词经常一起出现,它们就是“对象和对象引用”,很多朋友在初学Java的时候可能经常会混淆这2个概念,觉得它们是一回事,事实上则不然.今天我们就来一起 ...
- 浅谈Java中的深拷贝和浅拷贝(转载)
浅谈Java中的深拷贝和浅拷贝(转载) 原文链接: http://blog.csdn.net/tounaobun/article/details/8491392 假如说你想复制一个简单变量.很简单: ...
- 浅谈Java中的深拷贝和浅拷贝
转载: 浅谈Java中的深拷贝和浅拷贝 假如说你想复制一个简单变量.很简单: int apples = 5; int pears = apples; 不仅仅是int类型,其它七种原始数据类型(bool ...
- 【转】浅谈Java中的hashcode方法(这个demo可以多看看)
浅谈Java中的hashcode方法 哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: public native i ...
- 【转】浅谈Java中的hashcode方法
哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: public native int hashCode(); 根据这个 ...
- 浅谈Java中的关键字
谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法. ...
随机推荐
- Hadoop YARN 调度器(scheduler) —— 资源调度策略
本文通过MetaWeblog自动发布,原文及更新链接:https://extendswind.top/posts/technical/hadoop_yarn_resource_scheduler 搜了 ...
- d3.js之树形折叠树
1.效果 children和_children 2.技术分解 2.1折叠函数 // (1) 递归调用,有子孙的就把children(显示)给_children(不显示)暂存,便于折叠, functio ...
- STL算法之find
定义 template <class InputIterator, class T> InputIterator find (InputIterator first, InputItera ...
- linux下查看memcache是否正常
1 查看memcache启动1.1 在xshell中查看memcache是否启动在xshell中输入ps -ef | grep mem,显示结果如下,说明memcache已经启动. [r ...
- 腾讯基于 Flink 的实时流计算平台演进之路
https://mp.weixin.qq.com/s/MGnG_Mpf6CUQWLJHvmWqLA
- LC 375. Guess Number Higher or Lower II
We are playing the Guess Game. The game is as follows: I pick a number from 1 to n. You have to gues ...
- 机器学习 - 算法示例 - Xgboost
安装 能直接安装就再好不过 pip install xgboost 如果不能就下载之后本地安装 安装包下载地址 这里 想要啥包都有 数据集 pima-indians-diabetes.csv 文件 调 ...
- 阶段5 3.微服务项目【学成在线】_day09 课程预览 Eureka Feign_14-课程预览功能开发-CMS添加页面接口
5.3 CMS添加页面接口 cms服务对外提供添加页面接口,实现:如果不存在页面则添加,否则就更新页面信息. 此接口由课程管理服务在课程预览时调用. 接口方法.:页面没有就添加.有了更新数据 之前的接 ...
- rank SQL 筛选重复数据
先思考一个问题: 看下面的表数据 问题:现在需要在 A 和 B 相同的前提下对 C desc排序,然后拿到排序中不是第一个的数据?也就是说拿到下面的数据 只用一条 SQL 实现: select * f ...
- C#如何控制panel加载的字窗体中控件的位置随着显示器分辨率大小而改变
System.Windows.Forms.Screen screen=Screen.PrimaryScreen; System.Drawing.Rectangle rct=screen ...