鉴于Date有一个名为“after(Date)”的方法,而Timestamp有一个覆盖它的方法叫做“after(Timestamp)”,为什么在Date中调用之后的方法?码?
有关意外结果的问题被提出here。
java.sql.Timestamp one = new java.sql.Timestamp(1266873627200L);
java.sql.Timestamp two = new java.sql.Timestamp(1266873627000L);
java.util.Date oneDate = (java.util.Date) one;
java.util.Date twoDate = (java.util.Date) two;
System.out.println("one: " + oneDate.getTime());
System.out.println("two: " + twoDate.getTime());
if (oneDate.after(twoDate)) {
System.out.println(oneDate.getTime() + " after " + twoDate.getTime());
} else {
System.out.println(oneDate.getTime() + " not after " + twoDate.getTime());
}
结果
one: 1266873627200
two: 1266873627000
1266873627200 not after 1266873627000
答案 0 :(得分:10)
在编译时考虑过载;在执行时考虑覆盖。
时间戳重载 after
,它不会覆盖现有方法 - 所以oneDate.after(twoDate)
只考虑{{1}中的方法}};此外,即使您使用java.util.Date
,仍然仅使用one.after(twoDate)
,因为after(Date)
的编译时类型为twoDate
而不是Date
}}
如果您致电Timestamp
,那么 将使用one.after(two)
。
Timestamp.after(Timestamp)
仅考虑毫秒 - 但Date.after(Date)
仅向Timestamp
的构造函数传递整数秒,因此Date
和oneDate
具有twoDate
中的等毫秒值,即使您将不同的值传递给构造函数。
值得注意的是docs for Timestamp
中的这一点:
由于之间的差异 Timestamp类和java.util.Date 上面提到的类,它是 建议代码不要查看 时间戳值通常为 java.util.Date的实例。该 继承关系 时间戳和java.util.Date真的 表示实现继承, 而不是类型继承。
说实话,听起来对我来说遗传的使用很差 - 但是Java有很多这样的:(