2011-02-10 45 views
7

抽象クラスの背後にあるコンセプトを理解できない。私が読んでいる定義は、宣言されているが実装が欠けているメソッドが少なくとも1つあるため、クラスをインスタンス化できません。 Javaのカレンダークラスは抽象クラスであり、New演算子を使用してインスタンス化することはできませんが、カレンダーオブジェクトを返すgetInstance()というメソッドがあります。これはどのように作動しますか?抽象クラスの理解に役立つ:JavaのカレンダーメソッドgetInstance()

Calendar cal = new Calendar(); //doesn't work 
Calendar cal = Calendar.getInstance(); //works 
+1

Jonの答えは優れていますが、ここでは簡単に追加できます。抽象クラスは決してインスタンス化できません。彼らは抽象メソッドを含む必要はなく、実際には通常、実際にコードを持つ多くのメソッドを含むことができます。一般的には、機能の一部を提供していないため抽象的なマークが付けられており、サブクラスがそれを提供することが期待されます。 – Kylar

+0

抽象的な工場のサブクラスは返すインスタンスを決定します –

+0

皆さん、ありがとうございます。あなたの応答を読んだ後、私は戻って、継承と静的メソッドに関してJavaチュートリアルをもう一度読んで、今私には明らかです。 – tmakino

答えて

16

抽象クラスはは、任意の抽象メソッドを持つようにを持っていません。それはちょうどそれが通常行われている方法です。

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(); 
    } 
} 
1

抽象クラスは、静的メソッドを実装することができます参照してください。

getInstance()は、抽象クラスのデフォルトの具象実装を返す静的メソッドです。

この場合、実際にはGregorianCalendarインスタンスが返されると思います。

2

Calendarは抽象クラスなので、そのような新しいインスタンスを作成することはできません。あなたはdocを見れば、それに記載されているstatic Calendarとのいずれかの方法を見つけて、あなたはこのような何か行うことができますので、getInstance()を見つける: - 今

Calendar cal = Calendar.getInstance(); 

をあなたは再び同じドキュメントを見れば、見てページの上部にDirect Known Subclasses、記載されているクラス(ES)ここでは、カレンダーの実装です...ので、この場合には、あなたもこのように、GregorianCalendarを使用することができます -

Calendar cal = new GregorianCalendar(); 

両作品.. 。

1

getI Calendarクラスのnstance()メソッドはCalendarクラスのオブジェクトを返しません。代わりに、CalendarのサブクラスであるGregorianCalendarが「デフォルトのタイムゾーンとロケール」のCalendarを返します。 :)

関連する問題