📅  最后修改于: 2023-12-03 15:16:19.321000             🧑  作者: Mango
Java是一种面向对象编程语言,在编写Java程序时,可以使用不同的关键字来表达不同的含义。其中,final,finally和finalize三个关键字是常常被混淆的。
final是用来修饰一个变量、方法或类的。如果一个变量被final修饰,那么它就是不可修改的常量。如果一个方法被final修饰,那么它就是不能被重写的。如果一个类被final修饰,那么它就是不能被继承的。
以下是final的用法示例:
public class Example {
private final int x = 10;
private final String name;
public Example(String name) {
this.name = name;
}
public final void printName() {
System.out.println(this.name);
}
}
public final class SubExample extends Example {
//编译错误
}
finally关键字是用来定义一个代码块,这个代码块中的语句一定会被执行,不论try语句块中是否发生了异常。在使用try/catch语句块时,finally语句块常常用来释放资源,例如关闭文件或网络连接等。
以下是finally的用法示例:
public void readFile() {
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader("data.txt"));
String line = reader.readLine();
while (line != null) {
System.out.println(line);
line = reader.readLine();
}
} catch (IOException e) {
System.out.println("读取文件出错:" + e.getMessage());
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
System.out.println("关闭文件出错:" + e.getMessage());
}
}
}
}
finalize是一个被Object类定义的方法,它会在垃圾回收器回收一个对象之前被调用。如果一个类想要在对象被回收之前进行一些清理操作,可以重写finalize方法。但是,绝不能依赖finalize来进行资源释放或其他清理操作,因为finalize的执行时间是不确定的,甚至可能永远不会执行。
以下是finalize的用法示例:
public class Example {
private long id;
private String name;
public Example(long id, String name) {
this.id = id;
this.name = name;
}
@Override
protected void finalize() throws Throwable {
System.out.println("清理Example对象:" + this.id);
super.finalize();
}
}
public static void main(String[] args) {
while (true) {
new Example(System.currentTimeMillis(), "Example");
}
}
在以上代码中,我们创建了一个无限循环来创建Example对象。由于没有任何对象引用这些Example,所以它们会被垃圾回收器回收。每当一个Example对象被回收时,它的finalize方法就会被调用,并打印出一条信息。
final
关键字用来修饰变量、方法或类,表示它们不可改变、不可重写或不可继承。finally
关键字用来定义一个代码块,在try/catch语句块中无论是否发生异常,这个代码块中的语句都会执行。finalize
是一个被Object类定义的方法,在垃圾回收器回收对象之前,这个方法会被调用。由于finalize执行时间不确定,因此不能依赖它来进行资源释放或其他清理操作。