如果要继承,就要设计和写文档,否则禁止继承。
好的API文档应该打桩一个给定的方法做了什么工作,而不是描述它是如何做到的。
构造器决不能调用可被覆盖的方法,无论是直接调用还是间接调用。这是因为超类的构造器在子类的构造器之前运行,所以,子类中覆盖版本的方法将会在子类的构造器运行之前就先被调用。
//superclass
public class Divide {
List<Integer> result = new ArrayList<>();
public Divide(){
printSth();
}
protected void printSth(){
System.out.println("asd");
}
}
//subclass
public class Inheritance extends Divide {
@Override
protected void printSth() {
super.printSth();
System.out.println("zxc");
}
public static void main(String args[]) {
Inheritance divide = new Inheritance();
// divide.printSth();
}
}
对于这种情况,执行subclass的main方法会打印:
asd
zxc
注意这里main方法中只是new了一个子类实例(相当于执行子类构造函数),执行顺序是:父类构造函数--》子类构造函数。
对于那些并非为了安全地进行子类化而设计和编写文档的类,要禁止子类化。有两种办法可以禁止子类化:第一,把这个类声名为final。第二、把所有的构造器都声名为private,或者包级私有并增加一些静态工厂来替代构造器。
see also:
http://blog.csdn.net/u014723123/article/details/36174769