フィールドの隠蔽
http://d.hatena.ne.jp/irof/20110305/p1 でコメント頂いたネタ。
ちょっとしたクイズになるのかな。
どんな結果になるか難なく判るなら、初心者*1からは脱していると思います。難なくじゃなくても、悩めるならたぶん大丈夫です。
public class Quiz { public static void main(String[] args) { SuperClass clz1 = new SuperClass(); System.out.println(clz1); System.out.println(clz1.field); System.out.println(clz1.method()); System.out.println(clz1.getField()); SubClass clz2 = new SubClass(); System.out.println(clz2); System.out.println(clz2.field); System.out.println(clz2.method()); System.out.println(clz2.getField()); SuperClass clz3 = new SubClass(); System.out.println(clz3); System.out.println(clz3.field); System.out.println(clz3.method()); System.out.println(clz3.getField()); } } class SuperClass { String field = "superField"; String method() { return "superMethod"; } String getField() { return field; } } class SubClass extends SuperClass { String field = "subField"; String method() { return "subMethod"; } }
結果。
blog.SuperClass@55f33675 superField superMethod superField blog.SubClass@527c6768 subField subMethod superField blog.SubClass@65690726 superField subMethod superField
同名フィールドのサブクラスでの定義はバグりますから禁止…。挙動を理解してわざわざ使う人なんて居ないよね。こうしてクイズネタにする以外の上手い使い方思いつかないし。Eclipseも警告出せるけど、デフォルトはIgnoreなんですかね。あれErrorにしちゃって良いと思うくらい。
ところでしゃどーいんぐって覚えてたんだけど、はいでぃんぐの方が正解っぽい。以下はプログラミング言語第4版より。
用語隠蔽(hidding)は …中略… 継承されたメンバーがローカルに宣言されたメンバーにより隠蔽されている場合です。そして、他の状況は、シャドウ(shadowing)と呼ばれます。この違いは、本書では重要ではないので、単に「隠蔽」と呼ぶことにします。
太字は私による、私のための強調。特に重要じゃないよね!…すみません。はいでぃんぐはいでぃんぐ。よし覚えた。
shadowingはクラスフィールドに対して同名のメソッドフィールドを定義する場合とかを言うっぽいかな。こっちは特に意識せず適切な名前だと判断すれば使います。スコープが一目でわかる程度に限定できていれば混乱しないし。もっとも、大きなメソッドで使うのはNGです。そもそもそんな大きなメソッド自体がNGですけど。
ちなみに上記例に対して、こう書いてもコンパイル出来たりします。困った話です。これだけでも使わない方がいい理由になると思うのです。
class SubClass extends SuperClass { int field = 0; String method() { return "subMethod"; } }
プログラミング言語Java (The Java Series)
- 作者: ケン・アーノルド,ジェームズゴスリン,デビッドホームズ,柴田芳樹
- 出版社/メーカー: ピアソンエデュケーション
- 発売日: 2007/04
- メディア: 単行本
- 購入: 38人 クリック: 1,044回
- この商品を含むブログ (73件) を見る
*1:いわゆる初心者本を読んで「文法は何となく判った」程度