The finalize method is called by the garbage collector.
The reason that the finalize method can't be private (or have default/package accessibility) is that it is defined as protected in the Object class and
Java does not allow you make an overridden method in a derived class less accessible than the method it is overriding. Since private is more restrictive than protected you can't do this.
John