ローカルインナークラスについての質問

このQ&Aのポイント
  • ローカルインナークラスとは、メソッド内で宣言されるクラスです。
  • インナークラスはfinalで宣言されたローカル変数しか使えない。
  • ローカルクラスは外部クラスのメンバ変数への参照更新が可能である。
回答を見る
  • ベストアンサー

ローカルインナークラス

ローカルインナークラスとは、 メソッド内で宣言されるクラス、 ですよね? ある問題に 「メソッドのブロック内でローカルインナークラスを定義した場合正しいものを選びなさい。 ○、インナークラスはfinalで宣言されたローカル変数しか使えない」 ???? ローカルクラスは「外部クラスのメンバ変数への参照更新は可能」ですよね??? 例 class Outer{   int count=0;     void func(){       class Inner{         void display(){           count++;         }       }     } } 外部クラスのcountにアクセスできますよね?? 問題が間違っているのか、 私が考え違いをしているのか、教えてください。

  • Java
  • 回答数1
  • ありがとう数4

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

  • ベストアンサー
  • UKY
  • ベストアンサー率50% (604/1207)
回答No.1

どちらかというと、問題が間違っているということになるでしょうか。ちょっと誤解しやすい表現になっていますね。確かに、「ローカルクラスは外部クラスのメンバ変数への参照更新は可能」なんですが、問題のいいたいことはそこじゃなくて…… こういうことです。 class Outer{   void func(){     final int x = 0; // メソッド内のfinalローカル変数     int y = 0;    // メソッド内の普通のローカル変数     class Inner{       int getX(){         return x; // xはfinalローカル変数だからOK       }       int getY() {         return y; // yはfinalじゃないローカル変数だからNG       }     }   } } ローカル変数はメソッドがreturnするとなくなってしまいますが、メソッド内で作られたInnerのインスタンスはメソッドがreturnしてもなくなるとは限りません。(メソッドの戻り値として返された場合など) そうなった場合、すでになくなっているローカル変数の値をInnerから参照してしまう可能性があります。 そこで、ローカル変数の値をメソッドがreturnした後まで別のところに取っておく必要がありますが、finalじゃないローカル変数はメソッド内で何回も代入できるので、いつ代入された値をとっておけばよいのかわからなくなってしまいます。そこで、変数をfinalにして1回しか代入できないようにして、混乱を防いでいるのです。 もちろん、finalローカル変数はちゃんと代入しておかなくてはいけません。また、メソッドの引数やキャッチされる例外も同様の扱いを受けます。 なんだかちょっとややこしいですが、とにかく「インナークラスからアクセスされるローカル変数はfinal」です。

参考URL:
http://oshiete1.goo.ne.jp/kotaeru.php3?q=768511
azicyan
質問者

お礼

本当にいつもお世話になりっぱなしです。 やはり問題に言葉が足りませんよね。 この場合yにアクセスできないというのはわかります。 勉強したばかりでした。 しかし外部のcount(私の書いた例)にはアクセスできる、 そのことをやっと理解したばかりなのに、 この別の本の例題で、 「finalだけ」 と無情に・・・(^_^;) >「インナークラスからアクセスされるローカル変数はfinal」 もしかしてそういうことかな?とも思ったのですが、 「だけ」と断言されてしまうと、 countにアクセスできるのも何かの間違え・・・?? とも思えてきてしまい、真相を知りたくて質問させていただきました。 秀和システムのテキストはとても丁寧なのですが、 翔泳○のテキストはおかしな記述が多いです。 とても助かりました。 ほっといたしました。

azicyan
質問者

補足

ローカル変数にアクセスさせたい場合には、 finalとする、ということですよね?

関連するQ&A

  • 内部クラスのインスタンスを外部クラスが保持する場合

    C++での内部クラスの宣言の仕方なのですが、例えば、 class Outer { private:    class Inner; public:    Outer();    ~Outer(); }; class Outer::Inner { public:    Inner();    ~Inner(); }; のように単純に内部クラスが宣言されているだけならば、 その具体的な定義を外側に書くことは可能と思うのですが、 class Outer { private:    class Inner    {    public:       Inner();       ~Inner();    }; public:    Outer();    ~Outer();    Inner inner; //内部クラスのインスタンス }; のように外部クラスが内部クラスのインスタンスを保持していた場合には、 上記のようにインスタンス作成より上で外部クラスの宣言内に内部クラスの定義を書かないと、 コンパイルが通らない(VC++2008)と思います。具体的な中身がないままインスタンスを 作っているのでエラーを吐く理由もわからないでもないですが、 見易さ的に上の例のようにかけないのかなとも思ったりします。 インスタンスを外部クラスに持たせずともどうとでもなるのですが、 あえて上のようなことをしたくなった場合には下のような方法で記述する以外ないのでしょうか?

  • インナークラスについて

    JAVAについて友人に質問されたのですが、 わかりやすく解説をすることが出来ませんでした。 よろしくお願い致します。 ----------------------------------------------- インナークラスについてですが、 ローカルクラスの修飾子はabstractと finalのみ可なのは、どういった理由からですか? それと、ローカルクラスと匿名クラスは、 そのクラスを宣言しているメソッドの final変数のみ参照が可能というのは どういった理屈でfinalのみなのでしょうか?

    • ベストアンサー
    • Java
  • フレンドクラスにできない

    mediatorクラスからCOuterクラスのメンバ変数にアクセスできるようにフレンドクラスにしたつもりなんですが、 うまくアクセスができずコンパイルエラーになってしまいます。 どこが悪いのか分からず困っています。 どなたか助けていただけませんか? mediator.h ----------------------------------------------------- template <class T> class mediator { public: mediator(T* p=NULL) : m_p(p) {} void SetOutClass(T*p) { m_p = pT;} T& GetOutClass() const { return *m_p;} private: T* m_p; }; #define outer GetOutClass() ----------------------------------------------------- COuter.h ----------------------------------------------------- class COuter { private: int m_a; public: void func() { class CInner : public mediator<COuter> { public: CInner(COuter *p) : mediator<COuter>(p) {} void func() { // フレンドクラスなのにアクセスできない!? outer.m_a = 1; } }; CInner inner(this); inner.func(); } friend class mediator<COuter>; }; -----------------------------------------------------

  • インナークラスの身近な例

    Javaにインナークラスってあるじゃん。理解が難しいのですが、身近な例がありますでしょうか? スーパークラスとサブクラスは分かり易いですよね。 class Car{ void accelerate(){System.out.print("加速");} void stop(){System.out.print("停止");} } class Taxi experience Car{ void pay(){System.out.print("交通費を支払う");} } こんな感じで、自動車とタクシーの親子関係が分かります。Javaの解説書にもよく書いてある例だね。 その一方で、インナークラスはドーかしら? class OuterClass{ void outer(){System.out.print("外");} class InnerClass{ void inner(){System.out.print("内");} } } これだと、必要性がわかりにくいです。「クラスの中にもクラスが書けるのね」とは思うのですが、「クラスの中にクラスを書きたい」とは思いません。 色々と解説書を調べて見たのですが、どれもこれもプログラム例がこんなのばっかです。 class Train{ void gateopen(){System.out.print("切符で改札を入る");} class GreenCar{ void check(){System.out.print("乗務員にグリーン券を見せる");} } } こんな感じ?

  • 内部クラスのスコープについて。

    内部クラスのスコープ、friendクラスのスコープについて詳しいかたお願いします。 以下のクラス構成の場合に、 1.Outerクラスのすべてメンバー関数からはInnerクラスのすべての関数にアクセスできるのでしょうか? 2.InnerクラスからOuter::outerPrivateFunction(); を利用するためにはInnerクラスをOuterクラスのfriendにする方法以外にありますでしょうか? 3.InnerクラスからOuter::outerInt にどのようにしてもアクセスできません。ためした方法はInnerクラスをOuterクラスのfriendにする方法です。 このようなクラス構成にしてしまうと不可能なのでしょうか? 4.friendにしたクラスはprivateの変数、関数にアクセス可能になるはずですが、 それは外部クラスに限ってのことで内部クラスには当てはまらないのでしょうか? class Outer { private: class Inner { Innerfunction(); Onter* pOuter; } outerPrivateFunction(); int outerInt; } 説明に不足があれば補足いたしますのでお詳しいかた宜しくお願いします。

  • 無名インナークラスからアクセスされるローカル変数の扱いについて

    はじめまして。Javaの初心者です。質問があります。 ローカル変数が無名インナークラスからアクセスされるときは、 ローカル変数にfinalをつけないと、コンパイルエラーになります。 なぜなのでしょうか?どうかご教授お願いします。

    • ベストアンサー
    • Java
  • sjcpの試験勉強--インナークラスの疑問

    JAVAのsjcp(310-035)の試験勉強をしています。 インナークラスの問題で、 public class A{ public void MethodA(final int a){ int b = 1; class Inner{ private void innerMethod(int c){ -----ここ------- } } } } という例題があり、質問は -----ここ-------(6行目) で参照できる変数は?というものです。 答えはfinal がついてる変数aと、自身のメソッドの引数cです。 finalがついてないメソッド内の変数bにはアクセスできません。 解説を読んで、 cは分かるんですが、 どうしてfinalがついてないとアクセスできないのでしょうか。 暗記として覚えてもいいのですが、理由が分かられる方、アドバイス宜しくお願いします。

    • ベストアンサー
    • Java
  • C++ クラスをメンバにもつクラスについて

    お世話になります。C++初心者でうまくコードが書けません(><) クラス1と2があり、クラス1のメンバにはクラス2があります。 メインでクラス1をインスタンス化してクラス2のfunc2を呼び出します。 func2ではクラス1のインスタンスから呼び出された場合にクラス1の m_int1を取得します。 Class Class1{ public:  int m_int1;  Class2 m_Class2; }; Class Class2{ public: void func2(); }; void Class2::func2(){  /*ここの記述方法が分かりません*/  /*C1から呼び出されたらC1のm_int1に100を入れる*/  /*以下間違え*/  class1 C2_1;/*別のclass1のオブジェクトなのでこれに入れてもダメっぽい*/  C2_1.m_int1 = 100; } void main(){  class1 C1;  C1.m_int1 = 10;  C1.m_class2.func(); } C1.m_class2.func()の中から呼び出したC1にアクセスする方法が 分かりません(TT)。実体がまだあるのだからアクセスする方法は あると思うのですが・・・ どなたかよろしくお願いします。

  • Cygwinでg++がグローバル関数をはじいてしまう

    現在Win XP上にGygwinを導入し C++の勉強をしています。 書籍を購入し、以下のプログラムを試したところ グローバル関数宣言をしているにもかかわらず main() とfunc1()中で変数”count”が undeclared (first use this function) として弾かれてしまいます。 どうしてなのでしょうか? よろしくお願いします。 //example global variavle. #include<iostream> using namespace std; void func1(); void func2(); static int count; //This is global variavle. int main() { int i; //This is local variavle. for(i=0; i<10 ; i++){ count = i * 2; func1(); //calling func1(). } return 0; } void func1() { cout << "count: " << count; //access global "count" cout << "\n"; func2(); //calling func2(). } void func2() { int count; //define local "count" for(count=0;count<3;count++) { cout << "."; } }

  • Xcodeのクラスについてお聞きします。

    何らかのクラスをつくり、ViewControllerからクラスを生成して そのクラス(以下TestClass)のメソッドにアクセスします。 TestClassのメソッドから呼び出し元のViewControllerの変数若しくはメソッドに アクセスすることはできるのでしょうか? 例) @interface ViewController : UIViewController{ UIlabel *label; //TestClassから書き込みたい } @end @implementation ViewController -(void)viewDidLoad{ TestClass *class = [[TestClass alloc] init]; [class labelWrite];//クラス呼び出し } - (void)hoge{ //TestClassからここにアクセスしたい //処理 } @end @interface TestClass : NSObject @end @implementation TestClass - (void)labelWrite{ //ここからViewControllerのlabelに書き込みたい //もしくはViewControllerのhogeメソッドにアクセスしたい } @end

専門家に質問してみよう