2007年4月8日 星期日

回應:关于 Calendar

用 google 搜尋時找到的一篇文章,因為找不到回應的方法,所以在這回應以抒發一下之前的怒惱。
http://topic.csdn.net/t/20020320/08/587524.html
先看看下面的这段代码,我是从DW上抄来的:
先看看下面的这段代码,我是从DW上抄来的:

import java.io.*;
import java.util.*;

public class WhatIsCalendar {

public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
if (calendar instanceof GregorianCalendar)
System.out.println("It is an instance of GregorianCalendar");
}
}

编译运行通过。
可是小弟就是不明白:
GregorianCalendar 是由 Calendar 派生出来的,也就是说,在写作 Calendar 时,GregorianCalendar 还没有的。那 Calendar.getInstance() 怎么可以生成得到一个子类来返回呢?

如果 Calendar.getInstance() 返回的只是一个 Calendar ,那么 Calendar 是一个abstract class ,又怎么可以实例化呢?



6 楼GFox(小狐)回复于 2002-03-20 09:22:06 得分 0 to ChDw(米):
如果
getInstance()返回的对象为java.util.GregorianCalendar是Calendar的子类。
那么:
GregorianCalendar 是由 Calendar 派生出来的,也就是说,在写作 Calendar 时,GregorianCalendar 还没有的。那 Calendar.getInstance() 怎么可以生成得到一个子类来返回呢?



7 楼GFox(小狐)回复于 2002-03-20 09:23:55 得分 0 to gularess() :

谢谢你,可是,同上,在没有子类的情况下,它怎么可以生成一个子类来返回呢?



之後一大群人在回覆,卻沒有一個答到問題的核心......

較好的回答是:
這就是延遲執行,方法體在被呼叫時才真正被執行,在執行時,其子類一早已被定義了。

其實那個主題的第13樓已經能夠沾到邊邊的了。

延伸資訊:
其實這裡有一個無限循環: Calendar 的 method → GregorianCalendar → Calender → Calendar 的 method → ......
延遲計算是處理無限的一種方法。

維基百科搜尋關鍵字:
自引用、自參考、自我引用、自我參考


P.S. 我之前的怒惱是,看到一個農曆類別的實作,加上一班灌水說強的人,那個「實作」還要被不斷轉載而充斥google搜尋的結果頁,妨礙人家找真正的資訊。
P.S. 這是 JAVA 中農曆的真正實作: http://www.icu-project.org/apiref/icu4j/com/ibm/icu/util/ChineseCalendar.html

沒有留言: