📜  Java中final,finally和finalize(1)

📅  最后修改于: 2023-12-03 15:16:19.321000             🧑  作者: Mango

Java中final,finally和finalize

Java是一种面向对象编程语言,在编写Java程序时,可以使用不同的关键字来表达不同的含义。其中,final,finally和finalize三个关键字是常常被混淆的。

final

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

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

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执行时间不确定,因此不能依赖它来进行资源释放或其他清理操作。