繁体   English   中英

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

[英]help understanding abstract classes: java calendar method getInstance()

我无法理解抽象类背后的概念。 我正在阅读的定义是它们至少有一个声明但缺乏实现的方法,因此无法实例化该类。 java日历类是抽象的,无法使用New运算符进行实例化,但是有一个名为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();
    }
}

由于Calendar是一个抽象类,因此无法创建这样的新实例。 如果您查看doc ,找到其上列出static Calendar任何方法,您将找到getInstance() ,因此您可以执行以下操作: -

Calendar cal = Calendar.getInstance();

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

Calendar cal = new GregorianCalendar();

两件作品......

抽象类CAN实现静态方法。

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

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

Calendar类的getInstance()方法不返回Calendar类的对象,而是返回一个带有“默认时区和语言环境”的日历,在我的情况下,GregorianCalendar是Calendar的子类。 :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM