calendar.getInstance() - 它如何返回对象

时间:2014-11-17 20:45:18

标签: java calendar

Oracle上的文档说

  

Calendar类是一个抽象类。

同样的文件也说

  

Calendar的getInstance方法返回其日历的Calendar对象   已使用当前日期和时间初始化字段:日历

     

rightNow = Calendar.getInstance();

在完成stackoverflow这篇文章的讨论后,我理解我们无法创建抽象类的对象。要创建抽象类的对象,我们必须实现其具体的子类。

有人可以帮我理解(或指向一些参考资料)为什么我们可以创建Calendar类的对象,即使类本身是一个抽象类?
或者我遗漏了关于抽象类

的一些非常重要的观点

6 个答案:

答案 0 :(得分:4)

getInstance()在内部创建一个隐藏在某处的子类的对象。 (如果您在其实现中搜索,它最终会创建类似GregorianCalendar的子类的实例,并将其作为Calendar返回。)

像这样的静态工厂方法允许像Calendar这样的API在内部选择如何创建实例 - 是创建子类实例,还是为整个类缓存一个实例,或者其他什么。这是一个很棒的设计实践。

答案 1 :(得分:1)

getInstance()返回一些Calendar类型的对象。这意味着,此对象是Calendar或其子项的实例。正如你在这里看到的那样:

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8-b132/java/util/Calendar.java/

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类创建的。静态工厂设计模式,用于创建日历实例。