说我正在覆盖 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()

其实有两个问题:

  1. 您应该对编译器消息进行一些研究。你看,java 编译器错误真的 好;大多数时候,他们会准确地告诉您发生了什么。您不应该依赖其他人向您解释它们;最坏的情况 - 只需搜索错误消息文本。大多数时候,这会给你所有你需要的。
  2. 您不应该假设某个名称的方法会做这个或那个。换句话说:您将 @Override 放在 notifyAll() 上;因此应该清楚您正在 覆盖 某些方法。问题是:您应该了解您覆盖 的方法应该做什么。如果你不明白 overriding 是什么;你可能也想研究这个概念。

长话短说:借此机会退后一步;例如:阅读 notify() 和 notifyAll() 应该用于什么。为了理解 "correct" 方法只是重命名您的方法 notifyAll(),例如重命名为 "notifyAllObservers()" 并删除 @Override 注释。