• ベストアンサー

newの基本的な使い方が理解できていません

以下のソースコードで【Super s = new Sub();】となっているのですが、これはSuperを見ているのでしょうか?またはSubでしょうか? この考え方がいまいち理解できません。 次の【System.out.println(s.d);】では、class Superの10を返しているようですが、その次の行でのs.meth(); ではclass Subの20を返しているようです。 また、クラスsuperのint dおよび、boid meth()をstaticにすると、そちらをみているようなのですが、混乱して理解できません。 すみませんが、どのようになっているか教えて頂けませんでしょうか? class Super{ int d = 10; void meth(){ System.out.println(d); } } class Sub extends Super{ double d =20.0; void math (){ System.out.println(d); } } class Test{ public static void main(String args[]){ Super s = new Sub(); System.out.println(s.d); s.meth(); } }

質問者が選んだベストアンサー

  • ベストアンサー
  • guccii
  • ベストアンサー率31% (14/44)
回答No.2

仕様は観察されたとおりです。メンバ変数とstaticメソッドのオーバーライドは多態性によりハイドされません。メンバ変数には仮想関数表がありませんから多態性は利用できませんよね。staticメソッドもインスタンスに関連付けられていないので、参照時に動的に判断することがでないので、参照の「型」によりコンパイル時に参照する先が決定されます。逆にいえば、多態性は(saticメソッドを除く)メソッドに適用されるということです。わかりにくく感じるのは、クラス解決演算子を参照と同じ記述にした副作用でしょう。違うものを同じに扱っているかのように見えてしまうので... いずれにしてもこれは多重継承と同じ問題で、言語文法のトリビアです。資格試験のペーパーテストでしか役にはたたないので、細かなところまで正確に理解する必要はありません。 実際のコーディングの場合には、このような問題があることと、それに巻き込まれないようにすることが重要です。 この問題の場合には、名前付定数以外のメンバ変数はすべてprivateにしてアクセッサ(get/set)を介してアクセスすることとし、直接メンバ変数を参照することを禁止することです。また、名前つき定数については、インスタンスではなく、クラス名でスコープ解決すべきです。たとえ正しく動いている(ように見えても)許容してはいけません。コーディングした人or時は正しく理解できても、修正・変更する人or時に正しく理解できないかもしれませんから。

その他の回答 (1)

noname#24040
noname#24040
回答No.1

スーパークラスのメソッドはmeth ではなくmathですよね。 オーバーライドと多様性の問題で、前のスレッドにも同じようなことが書いてると思います。