[英]calendar.getInstance() - how it return object
甲骨文的文档说
日历类是一个抽象类。
同一名医生还说
Calendar的getInstance方法返回一个Calendar对象,其日历字段已使用当前日期和时间初始化:Calendar
rightNow = Calendar.getInstance();
在完成了这篇关于stackoverflow的文章的讨论之后,我了解到我们无法创建抽象类的对象。要创建抽象类的对象,我们必须实现其具体的子类。
有人可以帮助我理解(或为我提供一些参考)为什么即使类本身是抽象类也可以创建Calendar类的对象吗?
要么
我缺少有关抽象类的一些非常重要的观点
getInstance()
内部创建某个子类的对象,该对象隐藏在某处。 (如果在其实现中进行搜索,它最终将创建诸如GregorianCalendar
的子类的实例,并将其作为Calendar
返回。)
像这样的静态工厂方法允许Calendar
类的API在内部选择如何创建实例-是创建子类实例,还是为整个类缓存一个实例,等等。 这是一个很棒的设计实践。
getInstance()返回一些Calendar类型的对象。 这意味着该对象是Calendar或其子级的实例。 如您所见:
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.