avatar

目录
Java中final关键字小结

Java中final关键字小结

一、final、finally、finalize的区别

final:

修饰符(关键字)有三种用法:修饰类、变量和方法。

修饰类时,意味着它不能再派生出新的子类,即不能被继承,因此它和 abstract 是反义词。

修饰变量时,该变量使用中不被改变,必须在声明时给定初值,在引用中只能读取不可修改,即为常量。(下一节代码示例)

修饰方法时,也同样只能使用,不能在子类中被重写。

finally:

通常放在 try…catch 的后面构造最终执行代码块,这就意味着程序无论正常执行还是发生异常,这里的代码只要 JVM 不关闭都能执行,可以将释放外部资源的代码写在finally块中。

finalize:

Object 类中定义的方法。

Java 中允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。

这个方法是由垃圾收集器在销毁对象时调用的,通过重写 finalize() 方法可以整理系统资源或者执行其他清理工作。

二、代码示例

java
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
public class zd_important_test_nbst {
public static void main(String[] args) {
UserTest userTest = new UserTest();
System.out.println(userTest.getA());
UserTest userTest1 = new UserTest(6);
System.out.println(userTest1.getA());
}
}
class UserTest {
/**
* final修饰的变量,要么一开始就初始化(饿汉式),要么就在构造方法里初始化(懒汉式)。
* 一旦初始化完成,就不能修改。
*
* 【String中同样,使用private final修饰char[]】所以String是不可变的。
* (通过反射可以破坏其不可变性)
* 其他博客会提到上述内容。
*/
private final int a;

public UserTest() {
super();
a = 1;
}

public UserTest(int a) {
this.a = a;
}

public int getA() {
return a;
}
//会报错,因为a是final
// public void setA(int b) {
// this.a = b;
// }

/**
* 以下为idea默认生成的hashcode和equals,可忽略
*
* 在Object的源码中,hashcode是native方法,使用c语言实现的,综合类的信息计算出的hashcode值
* equals底层就是“==”
*/
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
UserTest userTest = (UserTest) o;
return a == userTest.a;
}

@Override
public int hashCode() {
return Objects.hash(a);
}
}
文章作者: Yang4
文章链接: https://masteryang4.github.io/2020/04/10/Java%E4%B8%ADfinal%E5%85%B3%E9%94%AE%E5%AD%97%E5%B0%8F%E7%BB%93/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 MasterYangBlog
打赏
  • 微信
    微信
  • 支付宝
    支付宝

评论