2011-02-10 38 views
7

我無法理解抽象類背後的概念。我正在閱讀的定義是,它們至少有一個已聲明但缺少實現的方法,因此該類不能實例化。 Java日曆類是抽象的,不能使用New運算符實例化,但是有一個名爲getInstance()的方法,它返回一個日曆對象。這個怎麼用?幫助理解抽象類:java日曆方法getInstance()

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

喬恩的回答非常好 - 但這裏有一個快速補充:抽象類永遠不能實例化。他們不必包含任何抽象方法,事實上,通常可以包含許多實際上具有代碼的方法。通常它們被標記爲抽象的,因爲它們不提供某些功能,並且期望的是子類將提供該功能。 – Kylar 2011-02-10 19:11:43

回答

16

抽象類不有任何抽象方法。這就是通常的做法。

現在Calendar.getInstance()作品實際上創建一個子類的實例。你可以調用它,因爲它是一種靜態方法。返回值是指相關子類的一個實例,但返回類型只是Calendar,由於正常的繼承規則,這很好。

這裏是相同的排序方法的一個例子,但沒有Calendar所有複雜 - 同樣的原則也適用:

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類的對象,而是返回帶有「默認時區和區域設置」的日曆,在我的情況下是GregorianCalendar,它是Calendar的子類。 :)