详解Java中final的用法
作者:JiJie.LianG 发布时间:2022-09-22 10:20:32
概念
final 具有“不可改变的”的含义,可以修饰 非抽象类、非抽象成员方法和变量。
用 final 修饰的类不能被继承,没有子类。
用 final 修饰的方法不能被子类的方法覆盖(重写)。
用 final 修饰的变量表示常量,只能被赋一次值(声明变量的时候)。
注:
final 不能用来修饰构造方法,因为“方法覆盖”这一概念仅适用于类的成员方法,而不适用于类的构造方法,父类的构造方法和子类的构造方法之间不存在覆盖的关系,因此用final修饰构造方法没有任何意义。
父类中用 private 修饰的方法不能被子类的方法所覆盖,因此可以理解为 private 类型的方法默认是 final 类型的。
final 类
把类定义为 final,使这个类不能被继承。具体使用场景如下:
不是专门为继承而设计的类,类本身的方法之间有复杂的调用关系。如果随意创建这些类的子类,子类有可能会错误的修改了父类的实现细节。
处于安全的原因,类的实现细节不允许在被扩展。
在创建对象模型时,确信这个类不会再被扩展。
例如:JDK中的java.lang.String 类被定义为 final 类型。
public final class String{...}
final 方法
在某些情况下,出于安全原因,父类不允许子类覆盖某个方法,此时可以把这个方法声明为 final 类型。
例如:JDK中的java.lang.Object 类中,getClass()方法为 final 类型,而 equals() 方法不为 final 类型。
所有 Object 的子类都可以覆盖 equals() 方法,但不能覆盖 getClass() 方法。
final 变量
用 final 修饰的变量表示取值不会改变的常量。
例如:JDK中 java.lang.Integer 类中定义了两个常量。
public static final int MIN_VALUE = 0x80000000;
public static final int MAX_VALUE = 0x7fffffff;
final 变量具有以下特征:
final修饰符可以修饰静态变量、成员变量和局部变量,分别表示静态常量、实例常量和局部常量。
public class Demo{
public static final int MAX_VALUE = 23; //静态常量
public static final int MIN_VALUE = 10; //静态常量
private final Date birthday = new Date(); //成员常量
}
静态常量一般以大写字母命名,单词之间以“_”符号分开。
final修饰的成员变量必须初始化。
public class FinalTest {
final int a = 1; //成员常量 默认初始化
static final int b = 2; //静态常量 默认初始化
final int c; //成员常量
static final int d; //静态常量
public FinalTest(){
c = 3; //成员常量 未默认初始化,可在构造函数中初始化
}
static {
d = 4; //静态常量 未默认初始化,可在静态代码块中初始化
}
}
final 变量只能赋一次值,如果将引用类型的变量用 final 修饰,该变量只能始终引用一个对象,但可以改变对象的内容。
public class FinalTest {
String str = "";
public void print(){
System.out.println(str);
}
public static void main(String[] args){
final FinalTest finalTest = new FinalTest();
finalTest.str = "xixihaha";
finalTest.print();
}
}
总结:
实际程序中,通过 final 修饰符来定义常量,目的为:
提高程序的安全性。
提高代码可维护性。
提供代码可读性。


猜你喜欢
- TV 3D卡片无限循环效果,供大家参考,具体内容如下##前言1、需求:实现3个卡片实现无限循环效果:1-2-3-1-2-3-1…,而且要实现
- 本文实例讲述了C#多线程处理多个队列数据的方法。分享给大家供大家参考。具体实现方法如下:using System;using System.
- 这篇文章主要介绍了Spring自定义参数解析器代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋
- 本文实例讲述了C#自定义控件实现TextBox禁止粘贴的方法。分享给大家供大家参考,具体如下:开发环境:Visual Studio .net
- 项目中经常会用到分享的功能,有分享链接也有分享图片,其中分享图片有的需要移动端对屏幕内容进行截取分享,说白了就是将view 转成bitmap
- 目录1.问题引出2.解决办法3.另外一种自定义序列化机制(介绍Externalizable)1.问题引出在某些情况下,我们可能不想对于一个对
- 本文实例讲述了C#域名解析简单实现方法。分享给大家供大家参考。具体实现方法如下:using System;using System.Coll
- Mybatis属于半自动ORM,在使用这个框架中,工作量最大的就是书写Mapping的映射文件,由于手动书写很容易出错,我们可以利用Myba
- 绘制模糊数学中隶属函数分布图using System; using System.Collect
- 最近一个项目要导出word文档,折腾老半天,发现还是用freemarker的模板来搞比较方便省事,现总结一下关键步骤,供大家参考,这里是一个
- 一、Socket是什么Socket 的中文翻译过来就是“套接字”。套接字是什么,我们先来看看它的英文含义:插座。Socket 就像一个电话插
- SpringMVC RESTFul列表功能实现一、增加控制器方法在控制器类 EmployeeController 中,添加访问列表方法。@C
- 本文主要介绍了隐式Intent匹配目标组件的规则,若有叙述不清晰或是不准确的地方希望大家指出,谢谢大家: )1. Intent简
- 本文实例为大家分享了Android蒙版弹出框效果的具体代码,供大家参考,具体内容如下自定义package cn.lxsdb.yyd.app.
- 问题描述:输入:两个日期输出:两个日期相差的天数具体代码实现方法1:通过Calendar类的日期比较。注意:这里需要考虑一下:日期是跨年份的
- 本文实例为大家分享了Unity Shader实现3D翻页效果的具体代码,供大家参考,具体内容如下参考文章:UnityShader使用Plan
- 本文实例讲述了C#实现的二维数组排序算法。分享给大家供大家参考,具体如下:class Order{ /// <summar
- Jedis简介实际开发中,我们需要用Redis的连接工具连接Redis然后操作Redis,对于主流语言,Redis都提供了对应的客户端;提供
- Apache Dubbo是一款高性能、轻量级的开源 Java RPC 框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡
- 控制json序列化/反序列化1. @JsonIgnoreProperties的用法@JsonIgnoreProperties(value =