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

 今晩は、javaの初心者です。宜しく願いします。

 下のようなコードを書いたら、「アクセス可能な型 C1 のエンクロージング・インスタンスが
ありません。
 型 C1 のエンクロージング・インスタンスで割り振りを限定する必要があります
(たとえば x.new A() で、x は C1 のインスタンス)。」
とエラーが出ました。

 eclipseでは、「C2 c_2 = new C2() ;」の箇所で赤いエラーマークが表示されています。
 C1クラスとC2クラスを分けてやると正常に実行されます。

 C1クラスの中にC2クラスを作ると文法的にどこがまずいのでしょうか。
 あるクラスの中に別のクラスを書いているプログラムを見たような気もするのですが。
 C1クラスとC2クラスをわかるのとはJAVA的に何がいけないのでしょうか。
 原因がさっぱり分りません、宜しくお願いいたします。

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

public class C1
{
int a = 9 ;
int b = 8 ;
int c = 7 ;
int d = 6 ;

//C2 c_2 ;

public void Calc1()
{
System.out.println("a+b= " + (a+b)) ;
}

public static void main(String[] args)
{
C2 c_2 = new C2() ;
c_2.Calc2() ;

C1 c_1 = new C1() ;
c_1.Calc1();
//c_1.Calc2();
}


class C2
{
//int c = 7 ;
//int d = 6 ;

public void Calc2()
{
System.out.println("c-d= " + (c-d)) ;
}
}
}

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

A 回答 (7件)

それか


C1 c_1 = new C1() ;
C2 c_2 = c_1.new C2() ;
と、c_1を先に宣言

なんにせよ、エラーメッセージは重要なヒントです。
自分で解決するにせよ、人に直してもらうにせよ、まずは、エラーメッセージの内容を確認することから始まります。
「エラーになった」だけじゃ、答えようがありません。
    • good
    • 0

>c_2 = c_1.(new C2()) ;


>c_2 = new (c_1.(new C2()) ;

>その他色々試しましたが、全てエラーでした。
>冷やかしはやめて下さい。

それは、あなたの書き方が間違ってるから。
書くなら

c_2 = c_1.new C2();
c_2 = new C1().new C2();

だし。
    • good
    • 0

冷やかす? 手元ではちゃんと動くんだがなぁ.



その「色々試した」ってのは, 具体的にはどうやった? そして, 「全てエラーでした」ってのは, それぞれに対してどんなエラーメッセージが出たんだ?
    • good
    • 0

#3 です。


>C1のインスタンスメソッド中でやってないのが間違ってる。

すいません間違ってますね・・・

C1のインスタンスなしでやってるのが間違ってる。

が正しいですね。
    • good
    • 0

>「new C2();」でインスタンス化をしてると考えているのですが、その考えはどこが間違っているのでしょうか。



C1のインスタンスメソッド中でやってないのが間違ってる。
以下がダメなのと同じ。

public Class C1 {
int a;

public static void main(String[] args) {
System.out.println("a=" + a);
}
}
    • good
    • 0

詳細は「内部クラス」とか「インナークラス」とか「inner class」とかで調べてください.



#1 に書いたんだけど, 「new C2() でインスタンス化する」ためにはクラスC1 のインスタンスを必要とします. そして, 変数 c_1 にクラスC1 のインスタンスがあれば
c_1.new C2()
という形で「c_1 に付随する C2 のインスタンス」を作ることができます. このようにして作った C2 のインスタンスは, c_1 のメンバーに対し無条件に (アクセス指定を無視して) アクセス可能です.
    • good
    • 0
この回答へのお礼

c_2 = c_1.(new C2()) ;
c_2 = new (c_1.(new C2()) ;

その他色々試しましたが、全てエラーでした。
冷やかしはやめて下さい。

お礼日時:2012/09/29 13:43

C2 は static じゃないから, クラスC2 のインスタンスを作るためにはクラスC1 のインスタンスが必要.

    • good
    • 0
この回答へのお礼

 Tacosanさん、回答ありがとうございます。
 
 C2クラスがC1クラスの中に入れ子見たいにあるのと、別クラスになるのとは文法的にどのように違う
のでしょうか。
 「new C2();」でインスタンス化をしてると考えているのですが、その考えはどこが間違ってい
るのでしょうか。

 また、クラスC2 のインスタンスを作るためにはクラスC1 のインスタンス化をしてやるのは、どの
ように具体的に書くのでしょうか。

 宜しくお願いします

お礼日時:2012/09/28 23:57

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