Последний класс не может быть продлен. Это предотвращает это
final class FinalClass {
}
// and later
class ExtendedClass extends FinalClass { // ERROR
}
Это полезно для таких вещей, как String - вы не хотели бы, чтобы кто-то мог перезаписать логику String, одного из наиболее часто используемых объектов, и иметь возможность, о, я не знаю, добавлять сети и отправить все строки обратно вы используете. Это можно сделать, если вы можете расширить строку.
Закрытый конструктор не может быть вызван вне класса.
class PrivateCons {
private PrivateCons() {
}
}
// later
PrivateCons pc = new PrivateCons(); // ERROR
Часто это в конечном итоге работает так: (хороший пример - java.lang.Math)
class FuncLib {
private FuncLib() { } // prevent instantiation
public static void someFunc(...) { }
public static int anotherFunc(...) { }
}
Или это в конечном итоге работает так // Integer делает это на самом деле
class VerySpecial {
private static Map<String,VerySpecial> cache;
public static VerySpecial generate(String data) {
VerySpecial result = cache.get(data);
if(result == null) {
result = new VerySpecial(data);
cache.put(data,result);
}
return result;
}
private String data;
private VerySpecial() { }
private VerySpecial(String data) { this.data = data}
}
Когда вы расширяете класс, ваш конструктор по умолчанию пытается вызвать конструктор по умолчанию (без аргументов). Если это личное, то вы должны явно вызывать не приватный конструктор, когда расширяете его. Если у вас нет не приватных конструкторов для вызова, вы не сможете его расширить. Спасибо за комментарии за указание на это. : -)