If you use nested classes, it's possible to subclass a class with a final constructor using another class contained within the same top-level class. Private does not prevent this sort of access.
Another difference is that if you have a private constructor, it's always possible to add another non-private constructor as well, and then the class can be subclassed.
Most importantly, if you want to prevent a class from being subclassed, then "final" makes this fact very clear. Using a private constructor may have a similar effect, but it will confuse the reader trying to figure out what you're up to.
You can instantiate a class with private constructors by using Reflection. This will work unless SecurityManager disallows it.
SCJP 1.4, SCWCD 1.3, SCBCD 1.3
Joined: Jan 30, 2000
Also you can instantiate a method with private constructors if the class provides a static factory method. Look at java.util.regex.Pattern for example. Of course this has nothing to do with the original question about subclassing and final.