Без использования финального класса вы можете сделать все конструкторы приватными:
public class A {
private A() {} //Overriding default constructor of Java
}
Что, хотя и сделает этот класс абстрактным, запретив создание объекта этого класса, тем не менее, поскольку любое наследование требует super();
в конструкторе, и поскольку конструктор является закрытым, ошибка компиляции будет максимально возможной. получить, когда кто-то пытается унаследовать этот класс.
Тем не менее, я бы рекомендовал использовать final вместо этого, так как он меньше кода и включает в себя возможность создания объектов.