说我正在覆盖 final 方法,但我找不到 final
Says I am overriding final method but I can't find final
我正在尝试在 Java 上实现观察者模式。
它不会编译,因为 notifyAll()
似乎是这里的问题;
Cannot override the final method from Object
但我没有在代码中添加任何 'final' 或 'static'。
我在这里做错了什么?
import java.util.ArrayList;
import java.util.List;
interface Observer {
void update();
}
interface Subject {
void registerObserver(Observer o);
void deregisterObserver(Observer o);
void notifyAll();
}
// Concrete Class
class User implements Observer {
@Override
public void update() {
System.out.println("Donald Trump just tweeted, you know");
}
}
// Concrete Class
class realDonaldTrump implements Subject {
private boolean hasTweeted = false;
private ArrayList<Observer> followers = new ArrayList<Observer>();
public boolean hasTweetedIn24Hours() {
return hasTweeted;
}
public void donaldTweets(boolean hasTweeted) {
this.hasTweeted = hasTweeted;
notifyAll();
}
@Override
public void registerObserver(Observer o) {
followers.add(o);
}
@Override
public void deregisterObserver(Observer o) {
followers.remove(o);
}
@Override
public void notifyAll() {
for (Observer o: followers)
o.update();
}
}
public class ObserverPatternDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("Hello World");
System.out.println("Observer Pattern Demo");
realDonaldTrump tweeterAcc = new realDonaldTrump();
}
}
您不能覆盖 Object
class 的 notifyAll()
方法,因为它是最终方法。在 Subject
界面和 realDonaldTrump
class.
中重命名该方法
默认所有classes extend Object
class 其中有一个final
方法名为notifyAll()
。由于该方法是 final
,因此无法在您的 class.
中覆盖它
public final native void notifyAll(); // in Object class
有间接 extends 层次结构解析为 java.lang 中的 Object the base。此方法是 public void 和 final ,因此您不能覆盖它
https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#notifyAll()
其实有两个问题:
- 您应该对编译器消息进行一些研究。你看,java 编译器错误真的 好;大多数时候,他们会准确地告诉您发生了什么。您不应该依赖其他人向您解释它们;最坏的情况 - 只需搜索错误消息文本。大多数时候,这会给你所有你需要的。
- 您不应该假设某个名称的方法会做这个或那个。换句话说:您将 @Override 放在 notifyAll() 上;因此应该清楚您正在 覆盖 某些方法。问题是:您应该了解您覆盖 的方法应该做什么。如果你不明白 overriding 是什么;你可能也想研究这个概念。
长话短说:借此机会退后一步;例如:阅读 notify() 和 notifyAll() 应该用于什么。为了理解 "correct" 方法只是重命名您的方法 notifyAll(),例如重命名为 "notifyAllObservers()" 并删除 @Override 注释。
我正在尝试在 Java 上实现观察者模式。
它不会编译,因为 notifyAll()
似乎是这里的问题;
Cannot override the final method from Object
但我没有在代码中添加任何 'final' 或 'static'。
我在这里做错了什么?
import java.util.ArrayList;
import java.util.List;
interface Observer {
void update();
}
interface Subject {
void registerObserver(Observer o);
void deregisterObserver(Observer o);
void notifyAll();
}
// Concrete Class
class User implements Observer {
@Override
public void update() {
System.out.println("Donald Trump just tweeted, you know");
}
}
// Concrete Class
class realDonaldTrump implements Subject {
private boolean hasTweeted = false;
private ArrayList<Observer> followers = new ArrayList<Observer>();
public boolean hasTweetedIn24Hours() {
return hasTweeted;
}
public void donaldTweets(boolean hasTweeted) {
this.hasTweeted = hasTweeted;
notifyAll();
}
@Override
public void registerObserver(Observer o) {
followers.add(o);
}
@Override
public void deregisterObserver(Observer o) {
followers.remove(o);
}
@Override
public void notifyAll() {
for (Observer o: followers)
o.update();
}
}
public class ObserverPatternDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("Hello World");
System.out.println("Observer Pattern Demo");
realDonaldTrump tweeterAcc = new realDonaldTrump();
}
}
您不能覆盖 Object
class 的 notifyAll()
方法,因为它是最终方法。在 Subject
界面和 realDonaldTrump
class.
默认所有classes extend Object
class 其中有一个final
方法名为notifyAll()
。由于该方法是 final
,因此无法在您的 class.
public final native void notifyAll(); // in Object class
有间接 extends 层次结构解析为 java.lang 中的 Object the base。此方法是 public void 和 final ,因此您不能覆盖它
https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#notifyAll()
其实有两个问题:
- 您应该对编译器消息进行一些研究。你看,java 编译器错误真的 好;大多数时候,他们会准确地告诉您发生了什么。您不应该依赖其他人向您解释它们;最坏的情况 - 只需搜索错误消息文本。大多数时候,这会给你所有你需要的。
- 您不应该假设某个名称的方法会做这个或那个。换句话说:您将 @Override 放在 notifyAll() 上;因此应该清楚您正在 覆盖 某些方法。问题是:您应该了解您覆盖 的方法应该做什么。如果你不明白 overriding 是什么;你可能也想研究这个概念。
长话短说:借此机会退后一步;例如:阅读 notify() 和 notifyAll() 应该用于什么。为了理解 "correct" 方法只是重命名您的方法 notifyAll(),例如重命名为 "notifyAllObservers()" 并删除 @Override 注释。