抽象クラスはは、任意の抽象メソッドを持つようにを持っていません。それはちょうどそれが通常行われている方法です。
Calendar.getInstance()
がによって実際にはのサブクラスのインスタンスを作成します。これは静的メソッドなので、呼び出すことができます。戻り値は関連するサブクラスのインスタンスを参照しますが、戻り型はちょうどCalendar
で、これは通常の継承規則のために問題ありません。
は、ここでのアプローチの同じ種類の一例ですが、Calendar
のすべての複雑させずに - 同じ原則が適用されます。GregorianCalenderを返す
abstract class AbstractParent {
public static AbstractParent getInstance() {
// Normally you'd have code to work out which
// concrete class to actually use
return new ConcreteChild();
}
public abstract void sayHello();
}
class ConcreteChild extends AbstractParent {
@Override public void sayHello() {
System.out.println("Hello from ConcreteChild");
}
}
public class Test {
public static void main(String[] args) {
AbstractParent parent = AbstractParent.getInstance();
parent.sayHello();
}
}
Jonの答えは優れていますが、ここでは簡単に追加できます。抽象クラスは決してインスタンス化できません。彼らは抽象メソッドを含む必要はなく、実際には通常、実際にコードを持つ多くのメソッドを含むことができます。一般的には、機能の一部を提供していないため抽象的なマークが付けられており、サブクラスがそれを提供することが期待されます。 – Kylar
抽象的な工場のサブクラスは返すインスタンスを決定します –
皆さん、ありがとうございます。あなたの応答を読んだ後、私は戻って、継承と静的メソッドに関してJavaチュートリアルをもう一度読んで、今私には明らかです。 – tmakino