The purpose of the Finalize method is often misunderstood by programmers. The Javadoc comment for Finalize states that it's called by the garbage collector on an object when the garbage collector determines that there are no more references to the object. Presumably the garbage collector will, like its civil servant namesake, visit the heap on a regular basis to clean up resources that are no longer in use. As reasonable as it may seem, this interpretation of finalization relies on assumptions about garbage collection that are not supported by the Java language specification. The primary purpose of Java garbage collection is not to run finalizers.
Garbage collection exists to prevent programmers from calling delete.
This is a wonderful feature. For example, if you can't call delete, then you can't accidentally call delete twice on the same object. However, removing delete from the language is not the same thing as automatically cleaning up. If garbage collection runs at all, and an object is no longer referenced, then that object's finalize will run. Across multiple objects, finalize order is not predictable.