我無法理解抽象類背後的概念。我正在閱讀的定義是,它們至少有一個已聲明但缺少實現的方法,因此該類不能實例化。 Java日曆類是抽象的,不能使用New運算符實例化,但是有一個名爲getInstance()的方法,它返回一個日曆對象。這個怎麼用?幫助理解抽象類:java日曆方法getInstance()
Calendar cal = new Calendar(); //doesn't work
Calendar cal = Calendar.getInstance(); //works
我無法理解抽象類背後的概念。我正在閱讀的定義是,它們至少有一個已聲明但缺少實現的方法,因此該類不能實例化。 Java日曆類是抽象的,不能使用New運算符實例化,但是有一個名爲getInstance()的方法,它返回一個日曆對象。這個怎麼用?幫助理解抽象類:java日曆方法getInstance()
Calendar cal = new Calendar(); //doesn't work
Calendar cal = Calendar.getInstance(); //works
抽象類不有有任何抽象方法。這就是通常的做法。
現在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();
}
}
它返回一個GregorianCalender。
見http://download.oracle.com/javase/6/docs/api/java/util/GregorianCalendar.html
抽象類可以實現靜態方法。
getInstance()是一種靜態方法,它返回抽象類的默認具體實現。
在這種情況下,我相信它實際上會返回一個GregorianCalendar實例。
由於Calendar
是一個抽象類,您不能創建一個像這樣的新實例。如果你看一下doc,找到任何方法與它上市static Calendar
,你會發現getInstance()
,所以你可以做這樣的事情: -
Calendar cal = Calendar.getInstance();
現在,如果你在同一個文檔再看看,看看Direct Known Subclasses
在頁面的頂部,上市類(ES)這裏有日曆的執行......所以,在這種情況下,你可以使用GregorianCalendar
,這樣太: -
Calendar cal = new GregorianCalendar();
這兩部作品..
getI Calendar類的nstance()方法不返回Calendar類的對象,而是返回帶有「默認時區和區域設置」的日曆,在我的情況下是GregorianCalendar,它是Calendar的子類。 :)
喬恩的回答非常好 - 但這裏有一個快速補充:抽象類永遠不能實例化。他們不必包含任何抽象方法,事實上,通常可以包含許多實際上具有代碼的方法。通常它們被標記爲抽象的,因爲它們不提供某些功能,並且期望的是子類將提供該功能。 – Kylar 2011-02-10 19:11:43