Java 中的 final 修饰符
Java 中 final 修饰符的使用。
final 修饰变量
我们知道,final 修饰符可用来修饰变量。
final 修饰变量(基本数据类型,或引用数据类型)时,三大原则:
- 当定义的 final 变量为成员变量(类或结构中的属性)时,必须在定义时就明确设定它的初始值,否者直接会报错无法通过编译,并且如果再次对其进行赋值将会提示编译错误。
- 当定义的 final 变量为 方法中(方法内,或方法块内)的局部变量 时,可以直接定义时赋值,也可以由开发者在声明后,第一次使用该变量之前,显式的赋初始值,实例化该变量;
- 当定义的 final 变量为 方法上的局部变量(参数) 时,是为了防止数据在方法体中被修改,这时参数的值(或引用)在方法体内是不能不能被重新赋值的。
根据 Java 中数据类型的分类,这里 final 修饰符修饰的变量的使用场景我们需要注意以下两种,使用上是有细微差异的(两个注意):
- final 修饰符修饰基本数据类型的变量
- final 修饰符修饰引用数据类型的变量
1 –> 修饰基本数据类型的变量时
final 修饰基本数据类型的变量时,基本类型的值是不能够改变的。
2 –> 修饰引用数据类型的变量时
final 修饰引用数据类型的变量时,引用类型变量所指的引用是不能够改变的(地址不变),但是引用类型变量的值是可以改变的(地址所指向存储空间值可变)。
详细使用样例差异,可见下文原则 1~3 中样例。
原则一
当定义的 final 变量为成员变量(类或结构中的属性)时,必须在定义时就明确设定它的初始值,否者直接会报错无法通过编译,并且如果再次对其进行赋值将会提示编译错误。
1 –> 基本数据类型
1 | public class HelloJava { |
关于 final 前面的 staitc 修饰符,这里可以不用深究,你就当没看见。
输入:
1 | 0 |
2 –> 引用数据类型
1 | public class HelloJava { |
输入:
1 | null |
下面这样的表达可以么?(先忽略之后的注释)
1 | public class HelloJava { |
===========================================
final 修饰的成员变量的另一种赋值方法(构造函数):
1 | public class FinalDemo { |
你可以想想上述赋值方法成立的原因….
原则二
当定义的 final 变量为 方法中(方法内,或方法块内)的局部变量 时,可以直接定义时赋值,也可以由开发者在声明后,第一次使用该变量之前,显式的赋初始值,实例化该变量。
1 –> 基本数据类型
1 | public class HelloJava { |
输出:
1 | 3 |
2 –> 引用数据类型
1 | public class HelloJava { |
输出:
1 | abc |
下面这样的表达可以么?(先忽略之后的注释)
1 | public class HelloJava { |
原则三
当定义的 final 变量为 方法上的局部变量(参数) 时,是为了防止数据在方法体中被修改,这时参数的值(或引用)在方法体内是不能被重新赋值的。
但需要谨记上文的 两个注意。
1 –> 基本数据类型
1 | public class HelloJava { |
2 –> 引用数据类型
1 | public class HelloJava { |
final 修饰类
final 修饰类时,可以继承其他类,但是不可以被继承的,使用方式跟其它类一样。
1 | class Parent{} |
final 修饰方法
final 修饰方法时,不可以被覆盖(不可以重写),但可以继承使用。
1 | class Parent { |
install_url
to use ShareThis. Please set it in _config.yml
.