繁体   English   中英

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

[英]calendar.getInstance() - how it return object

甲骨文的文档说

日历类是一个抽象类。

同一名医生还说

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

rightNow = Calendar.getInstance();

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

有人可以帮助我理解(或为我提供一些参考)为什么即使类本身是抽象类也可以创建Calendar类的对象吗?
要么
我缺少有关抽象类的一些非常重要的观点

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

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

getInstance()返回一些Calendar类型的对象。 这意味着该对象是Calendar或其子级的实例。 如您所见:

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

Calendar.getInstance()返回GregorianCalendar的实例

方法签名public static Calendar getInstance()声明的是,通过调用它,实现代码将返回一个对象,您可以将其安全地分配给Calendar类型的变量。 您不需要知道获得哪个Calendar的实际子类,并且实际上,如果需要,更高版本的Calendar可以返回不同的子类(与当前返回的GregorianCalendar相同),而不会破坏客户端代码。
在这种情况下,可以将抽象类型Calendar视为接口(具有某些实现):尽管您不能显式创建接口类的对象,但方法也可以声明返回接口类型。
由于我们调用了抽象类的方法,因此该方法是静态的,因此它属于该类,而不属于该类的任何对象。 无需创建对象来调用它。

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

我希望我能正确理解您的问题,您的问题与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

Calendar.getInstance()是本机方法, 请注意本机方法没有正文/实现。 他们已经从系统中实现了。

它写在这里: https : //www3.ntu.edu.sg/home/ehchua/programming/java/JavaNativeInterface.html

并且,正如上面答案中已经解释的那样,日历实例是通过调用Calendar类创建的。 用于创建日历实例的静态Factory设计模式。

暂无
暂无

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

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