プロが教えるわが家の防犯対策術!

内部クラス?のエラー

 今晩は、JAVA初心者です、宜しくお願い致します。
 下のようなプログラムを書いてやりました。
 <A>のように全体のプログラムを1つのクラスの中に別のクラスを入れる(内部クラス?)と、
「アクセス可能な型Testのエンクロージング・インスタンスがありません。
 型Testのエンクロージング・インスタンスで割り振りを限定する必要があります。
 (例えばx.new A()でxはテストのインスタンス)」というエラーがでます。

 しかし、<B>のように別のクラスにすると、エラーは出ません。
 この原因がよくわかりません。

====================================================================
<A>

public class Test
{
public static void main(String args[])
{
Calc ca = new Calc();
ca.calcTest(1,2);
}

class Calc
{
void calcTest(int a , int b )
{
int c = a + b ;

System.out.print("a + b = " + c);
}
}


====================================================================
<B>

public class Test
{
public static void main(String args[])
{
Calc ca = new Calc();
ca.calcTest(1,2);
}

class Calc
{
void calcTest(int a , int b )
{
int c = a + b ;

System.out.print("a + b = " + c);
}
}

====================================================================

A 回答 (1件)

フィールドやメソッドと同じく内部クラスもクラスのメンバの一種なので、


それがクラスに属するもの(staticメンバ)なのかインスタンスに属するもの(非staticメンバ)かの区別がある。
<A>のCalcクラスはstaticメンバではないのでstaticであるmainメソッドのコンテクストからは直接newすることはできない。

Test test = new Test();
Calc ca = test.new Calc();

のようにTestクラスのインスタンスを作成して、
そのインスタンスに属するCalcクラスをnewしてやるようにする。

Calc ca = new Test().new Calc();

のように書いてもいいが。

もしくは、Calc ca = new Calc();はそのままにして、

static class Calc

のように宣言してstaticな内部クラスにしても質問のプログラムの範囲では動作するようになる。
この方法ではCalcクラスの宣言が変わるので他でCalcクラスが使用されているなら注意が必要。

<B>のCalcクラスの場合はTestクラスとは別の独立したクラスなのでそういったメンバに課せられる制約はない。
    • good
    • 0
この回答へのお礼

vaguechatさん、有り難うございました

お礼日時:2010/10/01 08:34

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!