Вы не можете создать абстрактный класс без указания всех деталей, которые сделают его «неабстрактным».
Это означает в примере:
public abstract class Parent {
String name;
public Parent(String name) {
this.name = name;
}
abstract public String getName();
}
никакое количество конструктора, управляющего с помощью отражения, не вернет класс Parent-only. Однако вы можете вернуть «анонимный» класс, указав абстрактные детали во время построения, например:
Parent parent = new Parent() {
public String getName() { return "Bob"; }
};
Помните, что подклассы также вызывают родительский конструктор, даже если вы не вводите код явно. Подкласс, написанный как:
public class Child extends Parent {
public Child(String name) {
}
}
будет искать конструктор без аргументов в классе Parent
. Если он найдет его, он будет скомпилирован в код, эквивалентный
public class Child extends Parent {
public Child(String name) {
super();
}
}
Если он не находит конструктор без аргументов в классе Parent
, он не сможет скомпилироваться, пока вы явно не укажете конструкцию родительского класса с помощью вызова конструктора super(name);
.
Еще одна вещь, которую нужно помнить, все классы являются подклассами Object
, поэтому, если вы не предоставите extends SomeClass
, например, так:
public class JustMe {
}
Компилятор концептуально "исправляет" ваш код во время компиляции так:
public class JustMe extends Object {
public JustMe() {
super();
}
}
Класс Object содержит набор нативного (не Java) кода для регистрации в JVM, обеспечивающей правильную сборку мусора, управление памятью, принудительное использование типов и т. Д. В течение всего срока службы Object.
т. Вы не можете обойти это, JVM остановит вас от создания и абстрактного класса, если все его методы не могут быть разрешены через анонимные классы или подклассы.