継承することを前提に設計する(そしてドキュメントを書く)か継承させないかどっちかにしろ
- Javadocに継承したらどうなるのか書いとけ
- overrideしたらどうなるのか書いとけ
コンストラクタはオーバーライド可能なメソッドを呼んではいけない
スーパークラスのコンストラクタはサブクラスのコンストラクタよりさきに呼ばれるので、初期化される前にオーバーライドしたメソッドが呼ばれる。 public class Yeah { public Yeah(){ test(); }
protected void test(){
}
public static void main(String args[]){
//nullが出力される
new SubYeah();
}
}
class SubYeah extends Yeah{
private final Integer num;
public SubYeah(){
num = 1;
}
@Override
protected void test(){
System.out.println(num);
}
}
finalのフィールドが、nullの時と1のときの2つの状態ができてしまう。 #### CloneableとSerializableインターフェース #### オーバーライド可能なメソッドは自分から呼び出さない形で定義すると激アツ