是否需要在子类重实现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的多态特性在起作用:
- 因为
Filter里的update()是抽象方法,所有非抽象的Tester子类必须强制实现这个方法(否则编译会报错); - 当
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
相关产品推荐
相关产品推荐

