假设Date有一个名为“after(Date)”的方法,Timestamp有一个重写它的方法“after(Timestamp)”,为什么
关于意外结果的问题被问到了 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
在编译时考虑重载;在执行时考虑重写。
时间戳 超载 after ,它没有 一个现有的方法-所以你的 oneDate.after(twoDate) 只是在考虑 java.util.Date ; 此外,即使你使用 one.after(twoDate) 仍然 只使用 after(Date) twoDate 是 Date 而不是 Timestamp
after
oneDate.after(twoDate)
java.util.Date
one.after(twoDate)
after(Date)
twoDate
Date
Timestamp
如果你打电话 one.after(two) 那个 Timestamp.after(Timestamp) .
one.after(two)
Timestamp.after(Timestamp)
Date.after(Date) 只考虑毫秒-但是 日期 oneDate 和 两个日期 具有相等的毫秒值 ,即使您向构造函数传递了不同的值。
Date.after(Date)
日期
oneDate
两个日期
值得注意的是 docs for Timestamp
由于 Timestamp类和java.util.Date 上面提到的班级,是 时间戳值通常作为 时间戳和java.util.Date 而不是类型继承。