###概要
Processingでクラスの継承をテストしていて理解し難い現象が起きました。何が起こっているのか分からないので、どなたか解説お願いします。
###前提
Javaはインスタンスをアップキャストしていようがしていまいが、メソッドを実行した時実体のメソッドが呼ばれます。つまりアップキャストしても実行時にはオーバーライドされたメソッドが呼ばれて"sub"をアウトプットします。
lang
1class Super { 2 void a(){ 3 println("super"); 4 } 5} 6class Sub extends Super { 7 void a() { 8 println("sub"); 9 } 10} 11void setup() { 12 Super superClass = new Sub(); //アップキャスト 13 Sub subClass = new Sub(); 14 superClass.a(); //output sub 15 subClass.a(); //output sub 16} 17
###発生している問題・エラーメッセージ
ここで、上記のプログラムの継承元のSuperクラスのaメソッドをprivateにすると、Superでアップキャストした方は"super"をアウトプットします。つまり実体はSubクラスのインスタンスであるにもかかわらず、スーパークラスのaメソッド(super.a())を実行していることになります。
lang
1class Super { 2 private void a(){ 3 println("super"); 4 } 5} 6class Sub extends Super { 7 void a() { 8 println("sub"); 9 } 10} 11void setup() { 12 Super superClass = new Sub(); 13 Sub subClass = new Sub(); 14 superClass.a(); //output super 15 subClass.a(); //output sub 16} 17
そもそもJavaの仕様としてprivateメソッドはオーバーライドできないらしいのですが、コンパイルエラーにならないのも理解できません。そして、この時いったいどんなことが起きているのでしょうか?どなたかご説明お願いします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/06/17 04:32
2015/06/17 08:05
2015/06/17 11:07