我无法理解抽象类背后的概念。我正在阅读的定义是它们至少有一个声明但缺乏实现的方法,因此无法实例化该类。 java日历类是抽象的,无法使用New运算符进行实例化,但是有一个名为getInstance()的方法返回一个日历对象。这是如何工作的?
Calendar cal = new Calendar(); //doesn't work
Calendar cal = Calendar.getInstance(); //works
答案 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的子类。 :)