详解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 修饰符来定义常量,目的为:
提高程序的安全性。
提高代码可维护性。
提供代码可读性。
猜你喜欢
- 好久就想着好好搭建一个ssm框架,自己以后用也方便吧,但是最近的事真的是很多,很多事情都没有去干,有时候自己会怀疑一下人生自己该不该去做程序
- 近期用到了一位师兄写的C++程序,总体功能良好。使用不同的数据测试,发现了一个明显的缺点:大数据量下,预处理过程耗时很长。中科院的某计算集群
- List接口是Collection接口的子接口,List有一个重要的实现类--ArrayList类,List中的元素是有序排列的而且可重复,
- 本文介绍了Flutter 实现下拉刷新上拉加载的示例代码,分享给大家,具体如下:效果图 使用方法添加依赖depende
- java * 的方法总结AOP的拦截功能是由java中的 * 来实现的。说白了,就是在目标类的基础上增加切面逻辑,生成增强的目标类(该
- BitArray的基础可以看菜鸟编程BitArray 类管理一个紧凑型的位值数组,它使用布尔值来表示,其中 true 表示位是开启的(1),
- Java 本身就自带 JS 引擎,自从 Java 1.6 开始就支持了,愈来愈好。我对 js 比较熟悉,因此有个大胆的想法,为什么不用自带
- 本文实例讲述了Java后台线程操作。分享给大家供大家参考,具体如下:一 点睛有一种线程,它是后面运行的,它的任务是为其他线程提供服务,这种线
- 前言当初年少懵懂,那年夏天填志愿选专业,父母听其他长辈说选择计算机专业好。从那以后,我的身上就有了计院深深的烙印。从寝室到机房,从机房到图书
- 前提:windows上安装jdk1.启动jar脚本@echo offSTART "app" javaw -jar app
- 如下所示:package com.lcn.day05;import java.util.Scanner;public class Array
- 1.引言在开发中,拖放是一种比较常见的手势操作,使用它能够让应用的交互更加地便捷和友好,本文将简要介绍如何为Android中的View添加拖
- 注:作者使用IDEA + Gradle注:需要有一定的java SpringBoot and SSM+Springcloud基础程序测试错误
- 大致分为以下几个方面:一些查询指令整理使用SQL语句进行特殊查询检测表字段是否存在数据库升级数据库表字段赋初始值一、查询指令整理1.链式执行
- 前言悬浮窗是一种比较常见的需求。例如把视频通话界面缩小成一个悬浮窗,然后用户可以在其他界面上处理事情。本文给出一个简单的应用内悬浮窗实现。可
- 在Android Studio中对一个自己库进行生成操作时将会同时生成*.jar与*.aar文件。分别存储位置: &n
- 本文实例为大家分享了PropertyDescriptor反射调用set和get方法,供大家参考,具体内容如下第一段:package com.
- 概述 wsimport是jdk自带的命令,可以根据wsdl文档生成客户端中间代码,基于生成的代码编写客户端,可以省很多麻烦。先看两张截图:使
- 接口回调是指:可以把使用某一接口的类创建的对象的引用赋给该接口声明的接口变量,那么该接口变量就可以调用被类实现的接口的方法。实际上,当接口变
- 对Jpa Entity关系映射中mappedBy的理解mappedBy 单向关系不需要设置该属性,双向关系必须设置,避免双方都建立外键字段数