• 締切済み

ネストトップクラス・メンバクラスについて

現在、SJC-P取得に向け独学でJavaの勉強中です。 ネストクラス・インナークラスについて勉強している最中なのですが、 数冊テキストを読み込んでも、web検索をしても、イマイチよくわからない・・・というのが正直なところです。 どのクラス(アウタークラス/staticインナークラス/非staticインナークラス)の、 どういうメンバ(static/非static/private/final)が、 どのクラスのどういうメンバにアクセス出来るのかが整理しきれません・・・。 わからないなりに、まとめてみたのですが、理解が不十分で、かつ、この下記の通りの理解で正しいのかどうかもわかりません。 (言葉でうまく表現も出来ていない箇所も・・) また理解すべきポイントに不足があるかと思います。 どこが正しく理解出来ているのか・どこがどう間違っているかの指摘及びその内容・理解不足の箇所・よりわかりやすい例の追加や補記など、どうかよろしくお願い致します。 ●staticなインナークラス(=ネストトップクラス)について ・アウタークラスのインスタンスなしに、staticなインナークラスのインスタンスの生成が出来る。 ・staticなインナークラスからはアウタークラスの非staticメンバを直接アクセス出来ない。 (→ただし、staticアウターメンバになら直接アクセス出来る?staticであればprivateでもアクセス可?) ・staticなメソッド内で非staticなインナークラスのオブジェクトが生成出来ない。 ●非staticなインナークラス(=メンバクラス)について ・非staticなインナークラス内にstaticなメンバを持つことは出来ない。 ・アウタークラスのインスタンスを生成してからでないと非staticなインナークラスのインスタンスは生成出来ない。 ・アウタークラスの非staticメンバ及びstaticメンバに直接アクセス出来る。 ●アウタークラス(=外部クラス)について ・アウタークラスのstaticメソッド内で非staticなインナークラスのインスタンスは生成出来ない。 ・非staticインナークラスのメンバ及び、staticなインナークラスのメンバにアクセス出来る。 --------------------------------------------------------- (例)処理はさておき、定義はこんな感じを思い描いております・・ class Outclass{   private int aa;   private static int bb;   private outMethod1();   private static outMethod2();   class NotStaticInner{     private int cc;     //private static int dd;//不可     private inNotStaicMethod1();     //private static inNotStaticMethod2();//不可   }   class StaticInner{     private int ee;     private static int ff;     private inStaticMethod1();     private static inStaticMethod2();   } } 参考テキスト: 『Sun Certified Programmer for Java2 Platform5.0 Exam【310-055】』のChapter11:「ネストクラス・インナークラス」 参考URL: http://wisdom.sakura.ne.jp/programming/java/java46.html

みんなの回答

回答No.2

まず、大きく分けて3つ。 1.ネストクラス →クラス内で定義されるstaticクラス。 (アクセス修飾子は可能。) 2.インナークラス[内部クラス] →非staticなネストクラス。 (アクセス修飾子は可能。) 3.無名クラス[匿名クラス] →インスタンスの宣言をせずに、サブクラスの定義をした直後に、すぐそのインスタンスを利用するためのクラス。 (コンストラクタは不可。) 上記の中でも特に、2.が良く出題されるので、さらにここだけ掘り下げる。 2.1.ローカルインナークラス[局部内部クラス] →インナークラスをメソッド内で定義したクラス。 (アクセス修飾子は不可。) (もちろん、staticも不可。) (メソッド内からのアクセスは、final指定のみ可能。引数も同じ。) (外側クラスや自メソッド引数は、finalなしでも可能。) こんな感じかな。実際には、あらゆるパターンが出題されるわけではなく、ある程度は出題パターンが決まっているので、問題演習で間違える度に上記のようなまとめに追加していく、といった感じでいいと思う。

honey-mad
質問者

お礼

ご回答ありがとうございます!! なるほど~~この↓↓観点で理解していけばよかったのですね! 1.ネストクラス 2.インナークラス[内部クラス]  -2.1.ローカルインナークラス[局部内部クラス] 3.無名クラス[匿名クラス] それぞれのポイントばかりを抑えようとしてそもそもの観点がブレてしまって 理解し切れなかったのですね、私。。。 また、そもそも私は「static」の特性を理解出来ておらず、 static/非staticの違いをよくわかってなかったみたいです(^^; もう少し勉強を進めたいと思います。 ありがとうございました。

すると、全ての回答が全文表示されます。
  • isle
  • ベストアンサー率51% (77/150)
回答No.1

クラスでなくて、int型のメンバ変数の場合は理解できますか? メンバクラスも同じです。 『クラスの定義』がstaticであるかないか、ということです。 あとはstaticでないメンバクラスにstaticなメンバを含めることはできない、というだけです。 ところで、用語がJava言語仕様(The Java Language Specification)と矛盾しているのが気になりますね。 例えば、言語仕様に従うと「staticなインナークラス」というのは存在し得ません。 メンバクラスのうち明示的にも暗黙的にもstaticと宣言されないクラスをインナークラスと呼ぶのです。

honey-mad
質問者

お礼

ご回答ありがとうございます!! Javaの勉強を始め数週間が経つというのにも関わらず、 staticの特性を理解出来ていませんでした。。。 調べこんでやっとわかるようになりました。 用語の使い方さえも未熟な状態で質問してしまって申し訳ありませんでした。

すると、全ての回答が全文表示されます。

関連するQ&A