构造方法中不应调用可被覆盖的方法

    子类可以从父类(超类)继承所有的非私有的方法和变量,但子类不继承父类的构造函数。
    每个类至少有一个构造函数,如果不写一个构造函数,Java编程语言将提供一个,该构造函数没有参数,函数体为空。如果增加一个带参数的构造函数声明到一个类中,该类以前没有显式构造函数,那么将失去该缺省构造函数。基于这一点,对new Xxxx()的调用将会引起编译错误,这一点很重要.(必须在new的时候写入的参数new Xxxx(xxx,xx),它的子类也必须显式的批定构造函数。
    在继承中,构造方法中不应调用可被覆盖的方法,无论是直接调用还是间接调用。如果违反了这奥规则,很可能导致程序失败。下面来看一个例子:
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 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 new Sub();
        s.overrideMe();
    }
}

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

    总结:构造器绝不能调用可以被覆盖的方法。构造器中唯一能安全调用的是基类中的private和final方法,因为他们不会被覆盖。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值