The finalize() method is always called
once before the object is garbage-collected.
But if the finalize() method makes the object reachable again and therefore prevents garbage-collection, the finalize() method will
not be called again the next time the object becomes unreachable and is garbage-collected.
I don't know why
Java works this way -- maybe someone else can explain the rationale.