Oracle上的文档说
Calendar类是一个抽象类。
同样的文件也说
Calendar的getInstance方法返回其日历的Calendar对象 已使用当前日期和时间初始化字段:日历
rightNow = Calendar.getInstance();
在完成stackoverflow这篇文章的讨论后,我理解我们无法创建抽象类的对象。要创建抽象类的对象,我们必须实现其具体的子类。
有人可以帮我理解(或指向一些参考资料)为什么我们可以创建Calendar类的对象,即使类本身是一个抽象类?
或者我遗漏了关于抽象类
答案 0 :(得分:4)
getInstance()
在内部创建一个隐藏在某处的子类的对象。 (如果您在其实现中搜索,它最终会创建类似GregorianCalendar
的子类的实例,并将其作为Calendar
返回。)
像这样的静态工厂方法允许像Calendar
这样的API在内部选择如何创建实例 - 是创建子类实例,还是为整个类缓存一个实例,或者其他什么。这是一个很棒的设计实践。
答案 1 :(得分:1)
getInstance()返回一些Calendar类型的对象。这意味着,此对象是Calendar或其子项的实例。正如你在这里看到的那样:
Calendar.getInstance()返回GregorianCalendar的实例
答案 2 :(得分:1)
方法签名public static Calendar getInstance()
声明的是,通过调用它,实现代码返回一个对象,您可以安全地将其分配给Calendar类型的变量。您不需要知道您获得的Calendar的哪个实际子类,事实上,如果需要,以后版本的Calendar可以返回不同的子类(当前返回的GregorianCalendar),而不会破坏客户端代码。
在这种情况下,将抽象类型Calendar视为一个接口(带有一些实现):虽然您无法显式创建接口类的对象,但是方法也可以声明返回接口类型。
由于我们调用抽象类的方法,因为该方法是静态的,它属于类,而不属于类的任何对象。无需创建对象来调用它。
答案 3 :(得分:0)
getInstance()
是一种静态方法。您不需要Calendar实例来调用该方法。静态方法不需要类的实例来调用它们。静态方法创建子类的实例并返回它,这就是可能的原因。
示例:
//Class has static method print()
Class object = new Class(); // I don't need to do this to call print
object.print(); //Not needed but acceptable
Class.print(); // I can directly call print() from the class without an instance because it is static
答案 4 :(得分:0)
我希望我能正确理解你的问题,你的问题是关于Calendar.getInstance()返回的对象?为什么不编写一个小的测试用例来查找?,执行:
@Test
public void testCalendar(){
Calendar calendar = Calendar.getInstance();
final String name = calendar.getClass().getName();
Assert.assertThat("Calendar is a GregorianCalendar",name, Matchers.is("java.util.GregorianCalendar"));
}
链接清楚地说明了为什么我们引用基类或接口而不是具体类。
请查看:http://www.javaworld.com/article/2073649/core-java/why-extends-is-evil.html
答案 5 :(得分:0)
Calendar.getInstance()
是一种原生方法,记下本机方法没有正文/实现。它们已经从系统实现了。
它在这里写道:https://www3.ntu.edu.sg/home/ehchua/programming/java/JavaNativeInterface.html。
并且,正如上面的答案已经解释的那样,日历实例是通过调用Calendar类创建的。静态工厂设计模式,用于创建日历实例。