質問編集履歴

1 初心者アイコンの追加

shutosg

shutosg score 19

2015/06/17 07:11  投稿

privateメソッドをオーバーライドする
###概要
Processingでクラスの継承をテストしていて理解し難い現象が起きました。何が起こっているのか分からないので、どなたか解説お願いします。
###前提
Javaはインスタンスをアップキャストしていようがしていまいが、メソッドを実行した時実体のメソッドが呼ばれます。つまりアップキャストしても実行時にはオーバーライドされたメソッドが呼ばれて"sub"をアウトプットします。
```lang-Processing
class Super {
void a(){
println("super");
}
}
class Sub extends Super {
void a() {
println("sub");
}
}
void setup() {
Super superClass = new Sub(); //アップキャスト
Sub subClass = new Sub();
superClass.a(); //output sub
subClass.a(); //output sub
}
```
###発生している問題・エラーメッセージ
ここで、上記のプログラムの**継承元のSuperクラスのaメソッドをprivateにすると**、Superでアップキャストした方は"super"をアウトプットします。つまり実体はSubクラスのインスタンスであるにもかかわらず、スーパークラスのaメソッド(super.a())を実行していることになります。
```lang-Processing
class Super {
private void a(){
println("super");
}
}
class Sub extends Super {
void a() {
println("sub");
}
}
void setup() {
Super superClass = new Sub();
Sub subClass = new Sub();
superClass.a(); //output super
subClass.a(); //output sub
}
```
そもそもJavaの仕様としてprivateメソッドはオーバーライドできないらしいのですが、コンパイルエラーにならないのも理解できません。そして、この時いったいどんなことが起きているのでしょうか?どなたかご説明お願いします。
  • Java

    17362 questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Processing

    387 questions

    Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る