抽象类
抽象类获得子类的构造参数
此思路来源于:ApplicationEvent
自定义Spring的事件时,这样定义:
package com.example.tmp;
import org.springframework.context.ApplicationEvent;
public class MyEvent extends ApplicationEvent {
public MyEvent(Object source) {
super(source);
}
}
如果不加这个有参构造函数,则会报错:
源码
public abstract class ApplicationEvent extends EventObject { private static final long serialVersionUID = 7099057708183571937L; private final long timestamp; public ApplicationEvent(Object source) { super(source); this.timestamp = System.currentTimeMillis(); } public final long getTimestamp() { return this.timestamp; } }
public class EventObject implements java.io.Serializable { private static final long serialVersionUID = 5516075349620653480L; protected transient Object source; public EventObject(Object source) { if (source == null) throw new IllegalArgumentException("null source"); this.source = source; } public Object getSource() { return source; } public String toString() { return getClass().getName() + "[source=" + source + "]"; } }
ApplicationEvent类关系
总结
Spring最终使用EventObject来存事件数据(source字段),它有抽象的子类(本处是ApplicationEvent),并让抽象子类在构造函数中super父类,参数为事件数据。
一方面:继承了ApplicationEvent的普通类就必须提供一个有参构造函数,且必须要super()来调用ApplicationEvent这个抽象类的构造函数(因为抽象类自己不能直接实例化,必须由子类实例化)
另一方面:因为ApplicationEvent抽象类在构造函数中super父类,参数为事件数据,所以,EventObject就可以存入事件数据了。
EventObject是个基类,它有很多子类(都是抽象类),ApplicationEvent是其中一个子类。EventObject保存事件数据,子类会进行一些扩展,而且子类都像ApplicationEvent一样,有有参构造函数,并在里边super来调用EventObject的构造函数。
接口
多实现类实现同一接口
interface ITop
interface IA extends ITop
class AImpl implements IA
interface IB extends ITop
class BImpl extends AImpl implements IB