正文final关键字是一个常用的关键字,可以修饰变量、方法、类,用来表示它修饰的类、方法和变量不可改变,下面就聊一下使用 final 关键字的一些小细节 。
细节一、final 修饰类成员变量和实例成员变量的赋值时机对于类变量:
- 声明变量的时候直接赋初始值
- 在静态代码块中给类变量赋初始值
【final关键字的这8个小细节,你get到几个?】
public class FinalTest { //a变量直接赋值 private final static int a = 1; private final static int b; //b变量通过静态代码块赋值 static { b=2; }}
对于实例变量:- 在声明变量的时候直接赋值
- 在非静态代码块中赋值
- 在构造器中赋初始化值
public class FinalTest { //c变量在在声明时直接赋值 private final int c =1; private final int d; private final int e; //d变量在非静态代码块中赋值 { d=2; } //e变量在构造器中赋值 FinalTest(){ e=3; }}
细节二、当 final 修饰的成员变量未对它进行初始化时,会出现错误吗?答:会出现错误 。因为 JAVA 语法规定,final 修饰的成员变量必须由程序员显示的初始化,系统不会对变量进行隐式的初始化 。如下图所示,未初始化变量就会出现编译错误:
文章插图
细节三、final 修饰基本类型变量和引用类型变量的区别如果 fianl 修饰的是一个基本数据类型的数据,一旦赋值后就不能再次更改 。
那么 final 修饰的是引用数据类型呢?这个引用的变量能够改变吗?
看下面的代码:
public class FinalTest { //在声明final实例成员变量时进行赋值 private final static Student student = new Student(50, "Java"); public static void main(String[] args) { //对final引用数据类型student进行更改 student.age = 100; System.out.println(student.toString()); } static class Student { private int age; private String name; public Student(int age, String name) { this.age = age; this.name = name; } @Override public String toString() { return "Student{" + "age=" + age + ", name='" + name + ''' + '}'; } }}//下面是打印结果Student{age=100, name='Java'}
从打印结果可以看到:引用数据类型变量 student 的 age 属性修改成 100,是可以修改成功的 。结论:
- 当 final 修饰基本数据类型变量时,不能对基本数据类型变量重新赋值,因此基本数据类型变量不能被改变 。
- 对于引用类型变量而言,它仅仅保存的是一个引用,final 只保证这个引用类型变量所引用的地址不会发生改变,即一直引用这个对象,但这个对象里面的属性是可以改变的 。
推荐阅读
- 三只乌龟的故事 寓意?三只乌龟的故事视频
- 写给后端的Nginx初级入门教程
- Linux上TCP的几个内核参数调优
- 一次几乎不可能的数据库迁移
- 深入理解 Linux 内核中的 RCU 机制
- 最丑的外星人 外星生物长什么样子
- 三国演义中的真实事件 三国演义真实存在的事件
- 狼的知识点 狼的相关知识
- 6款Windows良心优质软件推荐,需要的自取
- 考古并不是简单的将珍贵文物挖掘出来呈现给世人 孔子看到的不一定是真实的故事