您的位置:首页 > 其它

构造器决不能调用可被覆盖的方法

2012-08-29 12:10 519 查看
在继承中,构造器决不能调用可被覆盖的方法,无论是直接调用还是间接调用。如果违反了这条规则,很可能导致程序失败。下面来看一个例子:

import java.util.ArrayList;

class Super {

    public Super() {

        overrideMe();

    }

    public void overrideMe() {

        System.out.println("调用父类方法");

    }

}

public class Sub extends Super {

    private ArrayList list = new ArrayList();

    Sub() {

    }

    @Override

    public void overrideMe() {

        System.out.println("调用子类方法");

    }

    public static void main(String[] args) {

        Super s = new Sub();

        s.overrideMe();

    }

}
输出结果是:

调用子类方法

调用子类方法

因为超类中的构造器调用overrideMe方法是会调用子类中的覆盖版本,这是多态的特性。稍微改动一下代码:

import java.util.ArrayList;

class Super {

    public Super() {

        overrideMe();

    }

    public void overrideMe() {

    }

}

public class Sub extends Super {

    private ArrayList list = new ArrayList();

    Sub() {

    }

    @Override

    public void overrideMe() {

        System.out.println(list.size());

    }

    public static void main(String[] args) {

        Super s = new Sub();

        s.overrideMe();

    }

}
这时会抛出NullPointerException,因为子类中的overrideMe覆盖版本将会在子类实例化完成之前就被父类构造器调用,而此时list尚未被实例化,因此抛出异常。

总结:构造器绝不能调用可以被覆盖的方法。构造器中唯一能安全调用的是基类中的private和final方法,因为他们不会被覆盖。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐