2008年10月28日火曜日

親子クラスで同じフィールド定義があると、、、

トランザクション指定を変えてのテスト中、「CommitInterval」を2以上にしても動作に変化がなく、Debuggerで調べてみて発見。
 子クラス定義で親クラスと同じフィールドを宣言していた。こうした場合、実際のInstanceには同名の2つのフィールドが存在することになり、それぞれ別のデータを保有する。実際には呼び出されるコードが親のものか子のものかによってアクセスする対象が変わることになる。
 Javaでは、こうしたフィールドやアトリビュートの重複定義をハイディングといい、アクセスタイプ(private,public など)や型を含めて制限されていない。つまり、ついうっかり子クラスで親と同じフィールドとアクセッサを定義してしまうと、実行時には親クラスのフィールドは初期値のままということになる。もちろんコンパイルエラーも実行時エラーも出ない。
まさに、調査していたコードがそうであった。しかも子クラスで独自に使用する必然性が感じられないため、たんならミスか?と思われる

参考:
Hishidama's Java Memo
Java言語仕様 第3版
Javaの日々

0 件のコメント: