java - 关于Java多态性应用于Calendar和GregoriaCalendar案例的一些疑问

标签 java polymorphism gregorian-calendar java.util.calendar

我有以下疑问。

进入我的代码:

Calendar today = Calendar.getInstance();

其中 Today 变量是 Calendar 的实例,因此我无法在其上使用 isLeapYear() 等方法。

这样做我可以执行这个方法:

GregorianCalendar today = (GregorianCalendar) Calendar.getInstance();
int currentYear = today.get(Calendar.YEAR);

boolean bisestile = today.isLeapYear(currentYear);

我的疑问是:到底为什么?我将 Calendar.getInstance() 返回的相同结果实例转换为 GregorianCalendar

在这里阅读:http://tutorials.jenkov.com/java-date-time/java-util-calendar.html

在我看来,java.util.Calendar类是抽象,所以我无法实例化它,所以我认为Calendar.getInstance( ) 自动返回一个定义了之前的 isLeapYear() 方法的 GregorianCalendar 对象。

但如果该对象被定义为简单的日历而不是GregorianCalendar,我就无法使用它。

我了解多态性,但在这种特定情况下到底是如何工作的?

我认为将 GregorianCalendar 对象的引用(由 Calendar.getInstance() 返回,是真的吗?)放入 Calendar 中> (我可以这样做,因为 Calendar 是父类(super class)型)我只能访问为此抽象类定义的方法子集,而不能访问为具体类型定义的所有方法。

这个推理正确还是我遗漏了什么?

最佳答案

这是polymorphismCalendar提供了一个抽象框架,像 GregorianCalendar 这样的子类提供了实现。在其他情况下,请理解 Calendar.getInstance() 可能会返回(例如)中国或希伯来日历,具体取决于位置和系统设置。

如果你真正想要的是GregorianCalendar明确地声明变量。

GregorianCalendar cal = new GregorianCalendar();

关于java - 关于Java多态性应用于Calendar和GregoriaCalendar案例的一些疑问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39148614/

相关文章:

java - 如何在 Java 中单击“下一个”按钮时显示下一个和上一个记录

java - 为什么我在这里得到 java.lang.InstantiationException ?

java - 执行hibernate查询时出错

Java:OOP 建议和改进小型应用程序的建议

c++ - 如何避免使用模板类型的派生类在多态性中进行动态转换

C++:将派生类保存在基类的shared_ptr中

go - 回历日期到 golang 中的公历日期

Java公历和删除时间和时区

java - c# upcasting 总是被允许的

java - 不同Android版本中java.util.GregorianCalendar类的奇怪行为