帮助理解抽象类:java日历方法getInstance()

时间:2011-02-10 18:26:33

标签: java

我无法理解抽象类背后的概念。我正在阅读的定义是它们至少有一个声明但缺乏实现的方法,因此无法实例化该类。 java日历类是抽象的,无法使用New运算符进行实例化,但是有一个名为getInstance()的方法返回一个日历对象。这是如何工作的?

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

5 个答案:

答案 0 :(得分:18)

抽象类 没有任何抽象方法。这就是通常的做法。

现在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 :(得分:2)

由于Calendar是一个抽象类,因此无法创建这样的新实例。如果你查看doc,找到列有static Calendar的任何方法,你会发现getInstance(),所以你可以这样做: -

Calendar cal = Calendar.getInstance();

现在,如果你再次查看同一个文档,请查看页面顶部的Direct Known Subclasses,这里列出的类是Calendar的实现...所以,在这种情况下,你可以使用GregorianCalendar,也是这样: -

Calendar cal = new GregorianCalendar();

两者都有效......

答案 2 :(得分:1)

答案 3 :(得分:1)

抽象类CAN实现静态方法。

getInstance()是一个静态方法,它返回抽象类的默认具体实现。

在这种情况下,我相信它实际上会返回一个GregorianCalendar实例。

答案 4 :(得分:1)

Calendar类的getInstance()方法不返回Calendar类的对象,而是返回一个带有“default timezone and locale”的日历,在我的情况下,GregorianCalendar是Calendar的子类。 :)