面试题:JAVA中final关键字的作用
final关键字的功能概述
在Java中,关键字 final 的意思是终态,可以用于声明变量、方法和类,分别表示基本类型变量值不可变,引用类型变量引用地址不可变但值可变,方法不可被覆盖,类不可被继承。下面进行详细阐述。
1、用来修饰变量
当使用final修饰一个变量(属性)时,这个属性就成为一个常量。此时可以考虑赋值的位置有直接初始化、代码块中初始化和构造器中初始化。
final修饰局部变量
使用final修饰形参时,表明此形参是一个常量。当我们调用此方法时,给常量形参赋一个实参以后,就只能在方法体内使用此形参,而不能重新赋值。形参是局部变量,其作用域是整个方法体。
public void localArg(final int arg){
arg = 20;//编译不通过,异常信息【Cannot assign a value to final variable 'arg'】
System.out.println(arg);
}
public void localArg(){
final int ARG = 10;//常量,基本类型变量
ARG += 20;//编译不通过
}
final关键字修饰成员变量
对于成员变量来说,一旦使用final关键字,也是不能再次改变。
和局部变量的不同点在于,成员变量需要有默认值,因此必须手动赋值。final修饰的成员变量赋值途径有两个,而且只能二者选择其一:①在定义的时候直接赋值,②在构造方法体里面赋值,此时必须保证所有重载的构造方法都对final修饰的成员变量赋值。
public User(Long id, int age, String name) {
super();
this.id = id;
this.age = age;
this.name = name;
var = 91;
}
//定义时直接赋值
private final int a = 32;
//使用构造方法赋值
private final int var;
public User() {
var = 90;
}
final修饰基本类型变量
当使用final修饰基本类型变量时,不能对基本类型变量重新赋值,因此基本类型变量不能被改变。上文中的int ARG就属于基本类型变量。
final修饰引用类型变量
当使用final修饰引用类型变量时,比如对象和数组等,不可变的含义就是地址值不能改变,但是该地址指向的对象的内容是可以改变的。它保存的仅仅是一个引用,final只能保证这个引用类型变量所引用的地址不会改变,即一直引用同一个对象,但这个对象完全可以改变。
这里引用一个网上常见的例子,以说明final修饰基本类型变量和引用类型变量的区别。
//final修饰基本类型变量和引用类型变量的区别
import java.util.Arrays;
class Person
{
private int age;
public Person(){}
// 有参数的构造器
public Person(int age) {
this.age = age;
}
public void setAge(int age){this.age = age;}
public int getAge(){return age;}
}
public class FinalReferenceTest {
public static void main(String[] args) {
//final修饰数组,iArr是一个引用变量
final int[] iArr = {5,6,12,19};
System.out.println(Arrays.toString(iArr));
//对数组元素排序,合法
Arrays.sort(iArr);
System.out.println(Arrays.toString(iArr));
//对数组元素赋值,合法
iArr[2] = -8;
System.out.println(Arrays.toString(iArr));
Arrays.sort(iArr);
System.out.println(Arrays.toString(iArr));
//下面语句对iArr重新赋值,非法
//iArr = null;
//final修饰Person变量,p是一个引用变量
final Person p = new Person(45);
//改变Person对象的age实例变量,合法
p.setAge(23);
System.out.println(p.getAge());
//下面语句对p重新赋值,非法
//p = null;
}
}
综上所述,对于一个被final修饰的变量,如果是基本数据类型的变量,则其数值一旦被初始化便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象,但是,可以改变其数值。
2.用来修饰方法
当使用final修饰方法时,这个方法将成为最终方法,无法被子类重写。但是,该方法仍然可以被继承。例如Object类中的getClass()方法。使用IDEA,在User类中重写 Object类中的getClass()方法,则可以看到如下异常信息,提示方法无法被子类重写。
'getClass()' cannot override 'getClass()' in 'java.lang.Object'; overridden method is final

在java中,把一个类中的方法修饰为final,意味着两个功能,第一点是该方法不能被重载,第二点是允许编译器将所有对此方法的调用转化为inline(行内)调用的机制,它会使你在调用final方法时,直接将方法主体插入到调用处,而不是进行例行的方法调用,例如保存断点,压栈等,这样可能会使你的程序效率有所提高。第二点也同时提醒我们,要谨慎的将方法定义为final,因为如果方法很庞大,你的代码量就会因为inline而迅速膨胀,可能反而会影响效率。
3.用来修饰类
当用final修改类时,该类成为最终类,无法被继承。简称为“断子绝孙类”。
/***
* final用法3:修饰类,则该类成为最终类,无法被继承
*下面这行代码放开注释,就会抛出异常提示
*/
//class MyString extends String{}
比如常用的String类、System类、StringBuffer类,它们都是最终类。定义断子绝孙类的目的是提高安全性,增强程序的可读性。
老铁们, 因个人能力有限,难免有瑕疵,如果发现bug或者有更好的建议,那么请在文章下方留言!
面试题:JAVA中final关键字的作用的更多相关文章
- java中final 关键字的作用
final 关键字的作用 java中的final关键字可以用来声明成员变量.本地变量.类.方法,并且经常和static一起使用声明常量. final关键字的含义: final在Java中是一个保留的关 ...
- JAVA中final关键字的作用
一.final关键字的功能概述 final关键字可以用来修饰引用.方法和类. 1.用来修饰一个引用 如果引用为基本数据类型,则该引用为常量,该值无法修改: 如果引用为引用数据类型,比如对象.数组,则该 ...
- 【Java_基础】Java中Native关键字的作用
本篇博文转载与:Java中Native关键字的作用
- java中static关键字的作用
java中static关键字主要有两种作用: 第一:为某特定数据类型或对象分配单一的存储空间,而与创建对象的个数无关. 第二,实现某个方法或属性与类而不是对象关联在一起 简单来说,在Java语言中,s ...
- Java中final关键字修饰变量、方法、类的含义是什么
Java中的关键字final修饰变量.方法.类分别表示什么含义? 先看一个简单的介绍 修饰对象 解释说明 备注 类 无子类,不可以被继承,更不可能被重写. final类中的方法默认是final的 方法 ...
- 关于java中final关键字与线程安全性
在Java5中,final关键字是非常重要而事实上却经常被忽视其作为同步的作用.本质上讲,final能够做出如下保证:当你创建一个对象时,使用final关键字能够使得另一个线程不会访问到处于" ...
- Java中Native关键字的作用
初次遇见 native是在 java.lang.Object 源码中的一个hashCode方法: 1 public native int hashCode(); 为什么有个native呢?这是我所要学 ...
- 关于Java中final关键字的详细介绍
Java中的final关键字非常重要,它可以应用于类.方法以及变量.这篇文章中我将带你看看什么是final关键字?将变量,方法和类声明为final代表了什么?使用final的好处是什么?最后也有一些使 ...
- java中final关键字的使用方法
[java中为什么会有final变量]: final这个关键字的含义是"这是无法改变的"或者"终态的": 那么为什么要阻止改变呢? java语言的发明者可 ...
- java中volatile关键字的作用
一.内存模型的相关概念 大家都知道,计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,势必涉及到数据的读取和写入.由于程序运行过程中的临时数据是存放在主存(物理内存)当中的,这时就存 ...
随机推荐
- Selenium KPI接口 附件上传
实现功能 拖拽图片到百度上传图片搜索功能区域. 定位.send_keys(r'图片路径') 导入相关包 from selenium import webdriver from time import ...
- go goroutine 怎样更好的进行错误处理
前言 在 Go 语言程序开发中,goroutine 的使用是比较频繁的,因此在日常编码的时候 goroutine 里的错误处理,怎么做会比较好呢? 一般我们的业务代码如下: func main() { ...
- linux 源码安装完php后在目录下找不到php.ini的问题
首先,我们需要确定php版本的php.ini文件需要放在个目录下 我们先执行以下命令查看php的php.ini目录应该放在那个地方 php -i |grep php.ini 效果如下,现在我们确定好了 ...
- .NET Core奇技淫巧之WinForm使用Python.NET并打包
前言 之前整了一个GZY.EFCoreCompare 的库,可以用做对比实体与数据库结构.感兴趣可以去看看,地址:GZY.EFCoreCompare 但是只能导出execl表格. 后来大佬用Pytho ...
- Oracle 修改SYS、system用户密码
by:授客 QQ:1033553122 概念 SYS用户是Oracle中权限最高的用户,而SYSTEM是一个用于数据库管理的用户.在数据库安装完之后,应立即修改SYS,SYSTEM这两个用户的密码 ...
- 一款 .NET 开源、功能强大的远程连接管理工具,支持 RDP、VNC、SSH 等多种主流协议!
前言 今天大姚给大家分享一款基于 .NET 开源(GPL-2.0 license).免费.功能强大的 Windows 远程连接管理工具,支持 RDP.VNC.SSH 等多种主流协议:mRemoteNG ...
- 【python-日期和时间处理】datetime模块基本使用
1. 获取datetime对象 获取当前datetime对象 方法:datetime.now(cls, tz=None) -> datetime 参数说明: tz:时区信息,不传该参数时,默认使 ...
- MaxKB+Ollama 离线部署
主题:在 Centos7 环境部署 MaxKB 以及 Ollama 实现基于离线大模型的的小助手调用. 选择离线部署的原因:原计划是打算直接使用 1Panel 进行 MaxKB 和 Ollama 一键 ...
- nginx集群同步方案
之前公司同事写过rsync加触发nginx reload脚本,适合nginx配置内容完全一致的情况. 今天写一个同步指定文件的脚本,修改完主服务器.使用scp传输到其他nginx服务器上重启NGINX ...
- Python的日志
Python的日志,看上去啰啰嗦嗦的.请大神写了个通俗易懂简单方便通用的日志: import logging # 配置日志记录级别和输出方式 logging.basicConfig(level=log ...