一、理解
final:最终的
二、作用
final 可以用来修饰的结构:类、方法、变量
1. 修饰-类
final 用来修饰一个类,表示此类不能被其它类所继承,提高安全性,提高程序的可读性。
比如:String类、System类、StringBuffer类…
代码演示:
final class A{
}
class B extends A{ //错误,不能被继承。
}
2. 修饰-方法
final 用来修饰方法:表明此方法不能被子类重写。
比如:Object
类中getClass();
代码演示:
1
2
3
4
5
6
7
8
9
10
|
class A { public final void print() { System.out.println( "A" ); } } class B extends A { public void print() { // 错误,不能被重写。 } } |
3. 修饰-变量
final 修饰的变量(成员变量或局部变量)称为常量。名称大写,且只能被赋值一次。
static final 用来修饰属性:全局常量。
代码演示:
1
2
3
4
5
6
7
|
class A { private final String INFO = "嘻嘻" ; //声明常量 public void print() { //INFO = "哈哈"; //The final field A.INFO cannot be assigned } } |
3.1 修饰-成员变量(属性)
final 标记的成员变量必须在声明(显式初始化)时或在 每个构造器中或代码块中显式赋值,然后才能使用。
如:final double MY_PI = 3.14;
3.2 修饰-局部变量
使用 final 修饰局部变量时,表明此形参是一个常量。当我们调用此方法时,给常量形参赋一个实参。一旦赋值以后,就只能在方法体内使用此形参,且不能进行重新赋值。
三、经典题目
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
|
//题目一: public class Test1 { public int addOne( final int x) { // return ++x; //Cannot assign a value to final variable 'x' return x + 1 ; } } //题目二: public class Something { public static void main(String[] args) { Other o = new Other(); new Something().addOne(o); } public void addOne( final Other o) { // o = new Other(); o.i++; } } class Other { public int i; } //题目三: class Root{ static { System.out.println( "Root的静态初始化块" ); } { System.out.println( "Root的普通初始化块" ); } public Root(){ super (); System.out.println( "Root的无参数的构造器" ); } } class Mid extends Root{ static { System.out.println( "Mid的静态初始化块" ); } { System.out.println( "Mid的普通初始化块" ); } public Mid(){ super (); System.out.println( "Mid的无参数的构造器" ); } public Mid(String msg){ //通过this调用同一类中重载的构造器 this (); System.out.println( "Mid的带参数构造器,其参数值:" + msg); } } class Leaf extends Mid{ static { System.out.println( "Leaf的静态初始化块" ); } { System.out.println( "Leaf的普通初始化块" ); } public Leaf(){ //通过super调用父类中有一个字符串参数的构造器 super ( "小老师ir" ); System.out.println( "Leaf的构造器" ); } } public class LeafTest{ public static void main(String[] args){ new Leaf(); System.out.println(); new Leaf(); } } /*output: Root的静态初始化块 Mid的静态初始化块 Leaf的静态初始化块 Root的普通初始化块 Root的无参数的构造器 Mid的普通初始化块 Mid的无参数的构造器 Mid的带参数构造器,其参数值:小老师ir Leaf的普通初始化块 Leaf的构造器 Root的普通初始化块 Root的无参数的构造器 Mid的普通初始化块 Mid的无参数的构造器 Mid的带参数构造器,其参数值:小老师ir Leaf的普通初始化块 Leaf的构造器 */ |
到此这篇关于Java全面细致讲解final的使用的文章就介绍到这了,更多相关Java final内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://blog.csdn.net/weixin_52533007/article/details/124853207