父类调用子类重写方法
1.如果父类构造器调用了被子类重写的方法,且通过子类构造函数创建子类对象,调用了这个父类构造器(无论显示还是隐式),就会导致父类在构造时实际上调用的是子类覆盖的方法(你需要了解java继承中的初始化机制)。
Java代码
1.public abstract class Father {
2.    public Father() {
3.        display();
4.    }
5.
6.    public void display() {
7.        System.out.println("Father's display");
8.    }
9.}
Java代码
1.public class Son extends Father {
2.
3.    public Son() {
4.    }
5.
6.    public void display() {
7.        System.out.println("Son's display");
8.    }
9.
10.    public static void main(String[] args) {
11.        new Son();
12.    }
13.
14.}
输出为:
Son's display
这种机制有优点,不过有时也存在问题。
优点:通过继承相同的父类,初始化子类时,父类会调用不同子类的不同复写方法,从而实现多态性。
举一个Spring中的例子:
Spring中可以通过为每个DAO注入一个已经用DataSource初始化的JdbcTemplate,来执行SQL语句。但是每个DAO都通过编码实现这个注入就产生了大量代码冗余,于是Spring提供了一个JdbcDaoSupport类,DAO只需继承这个类,就会自动注入已初始化好的JdbcTemplate,那么是如何做到的呢?
查看源码:
JdbcDaoSupport继承了DaoSupport:
Java代码
jdbctemplate是什么
1.public abstract class JdbcDaoSupport extends DaoSupport
DaoSupport实现了InitializingBean接口,该接口只有一个void afterPropertiesSet() throws E
xception;
方法,Spring会在初始化Bean的属相后查看这个Bean是否实现了InitializingBean接口,如果继承了就会自动调用afterPropertiesSet方法。
那么看一下DaoSupport中的afterPropertiesSet是如何实现的:
Java代码
1.public final void afterPropertiesSet() throws IllegalArgumentException, BeanInitializationException {
2.    // Let abstract subclasses check their configuration.
3.    checkDaoConfig();
4.
5.    // Let concrete implementations initialize themselves.
6.    try {
7.        initDao();
8.    }
9.    catch (Exception ex) {
10.        throw new BeanInitializationException("Initialization of DAO failed", ex);
11.    }
12.}
他这里调用了checkDaoConfig方法,此方法是抽象方法,真正运行时会去调用子类重写过的该方法。
查看JdbcDaoSupport如何重写checkDaoConfig():
Java代码
1.@Override
2.protected void checkDaoConfig() {

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。