我正在为关键字 final 准备一些练习。它用于定义不能在其子类中重写的方法。
但是我很难找到一些真正好的简单的现实世界示例,我想在这些示例中避免子类中的方法被重写。
有什么提示吗?
最佳答案
非抽象类的 equals()
方法的实现必须用 final 修饰符标记。这个陈述可以很容易地通过例子证明(来自标准库的真实代码):
public class Date {
private transient long fastTime;
....
public long getTime() {
return getTimeImpl();
}
....
public boolean equals(Object obj) {
return obj instanceof Date && getTime() == ((Date) obj).getTime();
}
}
public class Timestamp extends java.util.Date {
public boolean equals(java.lang.Object ts) {
if (ts instanceof Timestamp) {
return this.equals((Timestamp)ts);
} else {
return false;
}
}
public boolean equals(Timestamp ts) {
if (super.equals(ts)) {
if (nanos == ts.nanos) {
return true;
} else {
return false;
}
} else {
return false;
}
}
}
这意味着违反了 equals() 契约:
date.equals(timestamp) == true
但是
timestamp.equals(date) == false
关于java - 不应重写方法的简单现实世界示例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7807525/