質問: new B(); obj.func(); System.out.println(obj.num); } } ```
回答: ↓ のアニメーションは eclipse を使っている様子です。 num の変数名のうえにマウスを置くと、どのクラスの num を指しているかポップアップで表示されます。 13 行目の num は クラス A の num でなく、B の num であることがわかります。 !イメージ説明 さらに↓のアニメーションでは、 B の num 宣言をコメントアウトしました。 すると、プログラムでの実行結果は 11 になります。 13 行目の num にマウスを置いたときの ポップアップでは A の num と表示されます。 !イメージ説明 さらに↓のスクリーンショットでは、A の num を private 宣言にしています。 (インスタンス変数は、private にして、 getter/setter メソッドを介してアクセスするほうがよいからです) クラス B の func() 中では、 super.func() ともしています。 これは クラス A の func() を呼び出しています。 main メソッドでは、obj.getNum() と B.num の値を表示させるようにしました。 実行させると、11, 31 が表示されました。 !イメージ説明 以上の挙動がプログラムを実行させたり、eclipse の助けをかりなくてもわかるようになることが必要です。 でも、そもそも num という名前を クラス A, クラス B の両方でつかうことが混乱を招いてしまっています。 コードを読むときに誤解が生じにくくするためには、違う名前をつけるようにするのが好ましいです。