|
|
Objects, Classes, and Interfaces |
Before an object is garbage collected, the runtime system calls itsfinalizemethod. The intent is forfinalizeto 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. Yourfinalizemethod must be declared as follows:This class opens a file when it is constructed:protected void finalize() throws ThrowableTo be well behaved, theclass 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); } } }OpenAFileclass should close the file when it is finalized. Here's thefinalizemethod for theOpenAFileclass:Theprotected void finalize () throws Throwable { if (aFile != null) { aFile.close(); aFile = null; } }finalizemethod is declared in thejava.lang.Objectclass. Thus when you write afinalizemethod 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
finalizemethod, then your class'sfinalizemethod should probably call the superclass'sfinalizemethod 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(); }
|
|
Objects, Classes, and Interfaces |