1. final 关键字
基本概念:
“final” 是一个用于声明的修饰符,可以应用于类、方法和变量。它的主要功能是防止更改。具体来说,使用“final”关键字的对象或方法在被声明后不可再被修改。
应用场景:
-
final 类: 如果一个类被声明为 final,这意味着这个类不能被继承。通常,当你设计一个类不希望它被进一步扩展时,你可以将它声明为 final。例如,
java.lang.String
类就是一个 final 类,它不能被继承。这是为了防止子类更改字符串的不可变性。 -
final 方法: 一个方法可以被声明为 final,表示子类不能重写这个方法。这在设计一个类时很有用,确保子类不会改变父类中某些关键方法的行为。例如:
public class Parent { public final void show() { System.out.println("This is a final method."); } } public class Child extends Parent { // 下面这行代码会报错,因为 show() 方法是 final 的 // public void show() { // System.out.println("Trying to override a final method."); // } }
-
final 变量: 一个变量被声明为 final 后,它的值就不能再被修改。final 变量必须在声明时或构造函数中被初始化,这样它的值在对象创建后保持不变。例如:
public class Test { final int MAX_VALUE = 100; void changeValue() { // 下面的代码会报错,因为 MAX_VALUE 是 final 的 // MAX_VALUE = 200; } }
优点:
- 增强代码的安全性,防止不必要的继承和重写。
- final 变量在编译时会进行优化,有助于提高性能。
缺点:
- 限制了类、方法或变量的灵活性,特别是在需要扩展功能时。
2. finally 块
基本概念:
“finally” 是一个用于异常处理的代码块。它通常与 try 和 catch 一起使用,用于在 try 块中代码执行后,无论是否发生异常,都会执行 finally 块中的代码。
应用场景:
-
资源释放: finally 块最常用于释放资源,例如关闭文件、数据库连接或释放内存。这是确保资源总是会被正确释放的好方法,即使在发生异常的情况下。例如:
public class Test { public static void main(String[] args) { try { // 可能抛出异常的代码 int data = 25 / 0; } catch (ArithmeticException e) { System.out.println("Exception caught: " + e); } finally { System.out.println("finally block is executed."); } } }
在这个例子中,无论
try
块中是否发生异常,finally
块中的代码都会被执行。 -
确保执行: 如果你有一些代码无论如何都需要执行,通常会将其放入 finally 块中。例如,某些必要的清理工作就可以放在 finally 块中,以确保它们总是会被执行。
优点:
- 提供了一个安全网,以确保重要的代码片段总是被执行,例如资源释放操作。
- 有助于确保程序的稳定性和可靠性。
缺点:
- 由于 finally 块总是执行,如果没有正确处理,可能导致某些情况下的不期望行为。例如,如果 finally 块中有一个 return 语句,可能会掩盖 try 块或 catch 块中的异常。
3. finalize() 方法
基本概念:
“finalize” 是 Java 中 Object 类的一个方法,用于在对象被垃圾收集器回收之前做必要的清理工作。这个方法是在对象被垃圾收集器销毁之前由 Java 运行时调用的。
应用场景:
-
资源清理: finalize() 方法通常用于清理非托管资源,例如文件句柄或数据库连接,这些资源不能由 Java 的垃圾收集器自动管理。
public class Test { protected void finalize() { System.out.println("finalize method called."); } public static void main(String[] args) { Test obj = new Test(); obj = null; System.gc(); } }
在这个例子中,
System.gc()
提示 JVM 执行垃圾收集器,finalize()
方法将会被调用。
优点:
- 提供了在对象被垃圾收集前进行清理的机会。
- 可以用于回收一些非托管资源,例如文件或数据库连接。
缺点:
- finalize() 的执行时间和是否被调用是由 JVM 决定的,因此不可靠。
- 由于 finalize() 方法的不可预测性,可能导致资源延迟释放,甚至内存泄漏。
- Java 9 开始,finalize() 方法被标记为过时,Java 开发者被建议使用其他资源管理机制,如 try-with-resources 或显式的关闭方法。
总结
- final 关键字用于限制类、方法或变量的更改。它可以防止继承、重写或重新赋值。
- finally 块用于异常处理,确保无论是否抛出异常,某些代码总是会被执行。
- finalize() 方法提供了在对象被垃圾回收前执行清理操作的机会,但由于其不可预测性和潜在的性能问题,建议避免使用。