今回は、Javaのプログラミングでやってはいけないコードの書き方を紹介します。
まず、下記のコードを見て下さい。
-------------------------------------------------------------
public class SuperSample {
private void sampleMethod() {
System.out.println("SuperSample#sampleMethod()");
}
public static void test(SuperSample object) {
object.sampleMethod();
}
}
public class SubSample extends SuperSample {
public void sampleMethod() {
System.out.println("SubSample#sampleMethod()");
}
}
-------------------------------------------------------------
上記のコードでは、スーパークラス(SuperSample )で
private 宣言されているメソッド(sampleMethod)と
同じ名前のメソッドをサブクラス(SubSample )で定義しています。
次に、SubSample クラスを下記のような方法で実行してみます。
-------------------------------------------------------------
SubSample subSample = new SubSample();
subSample.sampleMethod();
SuperSample.test(subSample);
#実行結果
SubSample#sampleMethod()
SuperSample#sampleMethod()
-------------------------------------------------------------
スーパークラス(SuperSample )のsampleMethodメソッドが、
publicで宣言されていれば、
SuperSample.test(subSample);
の実行結果は、「SubSample#sampleMethod()」となるはずです。
ですが、上記のようにスーパークラスで private 宣言されているメソッドと
同じ名前のメソッドをサブクラスで定義してしまうと、
private メソッドはオーバーライドされず別のメソッドとして扱われてしまいます。
この実装方法は、バグの元になるので絶対にやってはダメです。
発見するのがかなり難しいです。
私はこれをやられて大変な目にあいました。
このような実装がされているなんて夢にも思わなかったので。。。