在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关键字的更多相关文章

  1. 浅谈Java中的final关键字

    浅谈Java中的final关键字 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来 ...

  2. 浅谈Java中set.map.List的区别

    就学习经验,浅谈Java中的Set,List,Map的区别,对JAVA的集合的理解是想对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操 ...

  3. Java基础学习总结(29)——浅谈Java中的Set、List、Map的区别

    就学习经验,浅谈Java中的Set,List,Map的区别,对JAVA的集合的理解是想对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操 ...

  4. 浅谈Java中的对象和引用

    浅谈Java中的对象和对象引用 在Java中,有一组名词经常一起出现,它们就是“对象和对象引用”,很多朋友在初学Java的时候可能经常会混淆这2个概念,觉得它们是一回事,事实上则不然.今天我们就来一起 ...

  5. 浅谈Java中的深拷贝和浅拷贝(转载)

    浅谈Java中的深拷贝和浅拷贝(转载) 原文链接: http://blog.csdn.net/tounaobun/article/details/8491392 假如说你想复制一个简单变量.很简单: ...

  6. 浅谈Java中的深拷贝和浅拷贝

    转载: 浅谈Java中的深拷贝和浅拷贝 假如说你想复制一个简单变量.很简单: int apples = 5; int pears = apples; 不仅仅是int类型,其它七种原始数据类型(bool ...

  7. 【转】浅谈Java中的hashcode方法(这个demo可以多看看)

    浅谈Java中的hashcode方法 哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: public native i ...

  8. 【转】浅谈Java中的hashcode方法

    哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: public native int hashCode(); 根据这个 ...

  9. 浅谈Java中的关键字

    谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法. ...

随机推荐

  1. node的小知识点

    今天开始阅读node.js深入浅出这本书,阅读过程中会对某些理解有新的认识,所以特地把这些新认识或者知识点记录在这篇博客中 1.nodejs的优势在于 事件驱动.高并发.异步I/O 不适合cpu密集型 ...

  2. ROS计算图级

    上一节说到一个 package 可以包含多个可执行文件(节点),可执行文件需要被运行,就要了解ROS的通信架构,也就是计算图级,例: 小萝卜机器人拥有驱动系统,感知系统,控制系统等,要让它从指定位置到 ...

  3. 【转】Python基础-字符串

    原文地址http://blog.chinaunix.net/uid-21169302-id-446256.html Python-String-Function 字符串中字符大小写的变换: * S.l ...

  4. 知乎面试【五轮技术+HR】

    今年下半年去知乎面试了两次,讲道理来说,知乎有CD期, 一旦上一次面试没有通过.在一段时间内,不能再次面试知乎.后来在同事的内推下,再次获得面试机会,哈哈~~,这次面试时间还是挺长的,特记录一下. 7 ...

  5. T-MAX——项目需求分析

    这个作业属于哪个课程 2019秋福大软件工程实践Z班 这个作业要求在哪里 团队作业第二次-需求规格说明书 团队名称 T-MAX 这个作业的目标 撰写项目需求规格说明书,介绍团队分工 作业正文 T-MA ...

  6. PHP fopen/file_get_contents与curl性能比较

    PHP中fopen,file_get_contents,curl 函数的区别: 1.fopen/file_get_contents 每次请求都会重新做 DNS 查询,并不对 DNS 信息进行缓存. 但 ...

  7. Oracle数据库-primary key/foreign key和references关系

    主要介绍一下个人对主键(primary key).外键(foreign key).候选键(Candidate key).超键(super key).references的总结 概念: 主键:用户选择元 ...

  8. openjudge计算概论-大整数加法

    /*=====================================================================1004:大整数加法总时间限制: 1000ms 内存限制: ...

  9. 安卓P2P开源项目

    https://github.com/LinYaoTian/P2PChat 一个基于局域网的 Android P2P 聊天系统 https://github.com/ddssingsong/webrt ...

  10. Assertion failure in -[UISectionRowData refreshWithSection:tableView:tableViewRowData:]

    最近在项目中遇到了 Assertion failure in -[UISectionRowData refreshWithSection:tableView:tableViewRowData:] 这个 ...