You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

是否需要在子类重实现Java Observer以调用同名子类方法?

关于Java Observer接口update()方法的疑问解答

嘿,作为刚接触Java的新手,能把Observer/Observable的继承关系理到这份上已经很棒啦!先直接给你答案:完全不需要子类再去重实现Observer接口,咱们一步步理清楚为什么:

核心逻辑:继承带来的接口实现传递

你已经定义了Filter抽象类实现了Observer接口,并且把update()声明为抽象方法:

public abstract class Filter implements Observer { 
    @Override 
    public abstract void update(Observable o, Object arg); 
}

当Tester继承Filter之后,它自动就拥有了Observer接口的实现资格——Java里子类会继承父类的所有接口实现,不需要再写implements Observer。

为什么能调用子类的同名方法?靠多态!

你提到的“调用与父类方法同名的子类方法”,本质是Java的多态特性在起作用:

  1. 因为Filter里的update()是抽象方法,所有非抽象的Tester子类必须强制实现这个方法(否则编译会报错);
  2. 当Observable调用update()方法时,它会根据实际创建的对象实例类型来执行对应的方法。举个具体的例子:
    // 写一个具体的Tester子类
    public class ConcreteTester extends Tester {
        @Override
        public void update(Observable o, Object arg) {
            System.out.println("子类的update方法被调用啦:" + arg);
        }
    }
    
    // 测试代码
    public class Main {
        public static void main(String[] args) {
            Observable myObservable = new Observable();
            Observer tester = new ConcreteTester(); // 父类引用指向子类对象
            
            myObservable.addObserver(tester);
            myObservable.setChanged();
            myObservable.notifyObservers("测试更新内容");
        }
    }
    
    运行这段代码,你会看到输出的是ConcreteTester里的update()实现——这就是多态的魔力,不管你用Observer还是Filter还是Tester类型的引用,只要实际对象是子类实例,就会执行子类的方法。

总结一下

  • 子类不需要再implements Observer,继承Filter就足够;
  • 只要子类实现了抽象的update()方法,Observable通知时会自动调用子类的实现;
  • 如果Tester本身还是抽象类,那它可以不用实现update(),把这个任务交给它的非抽象子类就行。

内容的提问来源于stack exchange,提问作者j.s

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:00:40