Previous | Next | Trail Map | Writing Java Programs | Objects, Classes, and Interfaces


Writing a finalize Method

Before an object is garbage collected, the runtime system calls its finalize method. The intent is for finalize to release system resources such as open files or open sockets before getting collected.

Your class can provide for its finalization simply by defining and implementing a method in your class named finalize. Your finalize method must be declared as follows:

protected void finalize() throws Throwable
This class opens a file when it is constructed:
class OpenAFile {
    FileInputStream aFile = null;
    OpenAFile(String filename) {
        try {
            aFile = new FileInputStream(filename);
        } catch (java.io.FileNotFoundException e) {
            System.err.println("Could not open file " + filename);
        }
    }
}
To be well behaved, the OpenAFile class should close the file when it is finalized. Here's the finalize method for the OpenAFile class:
protected void finalize () throws throwable {
    if (aFile != null) {
        aFile.close();
        aFile = null;
    }
}
The finalize method is declared in the java.lang.Object class. Thus when you write a finalize method for your class you are overriding the one in your superclass. Overriding Methods talks more about how to override methods.

If your class's superclass has a finalize method, then your class's finalize method should probably call the superclass's finalize method after it has performed any of its clean up duties. This cleans up any resources the object may have unknowingly obtained through methods inherited from the superclass.

protected void finalize() throws Throwable {
    . . .
    // clean up code for this class here
    . . .
    super.finalize();
}


Previous | Next | Trail Map | Writing Java Programs | Objects, Classes, and Interfaces