- 締切済み
javaのクラスの作り方、エラーの原因が不明です
今晩は、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)) ; } } } =========================================================================
- みんなの回答 (7)
- 専門家の回答
みんなの回答
- kmee
- ベストアンサー率55% (1857/3366)
それか C1 c_1 = new C1() ; C2 c_2 = c_1.new C2() ; と、c_1を先に宣言 なんにせよ、エラーメッセージは重要なヒントです。 自分で解決するにせよ、人に直してもらうにせよ、まずは、エラーメッセージの内容を確認することから始まります。 「エラーになった」だけじゃ、答えようがありません。
- wormhole
- ベストアンサー率28% (1626/5665)
>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(); だし。
- Tacosan
- ベストアンサー率23% (3656/15482)
冷やかす? 手元ではちゃんと動くんだがなぁ. その「色々試した」ってのは, 具体的にはどうやった? そして, 「全てエラーでした」ってのは, それぞれに対してどんなエラーメッセージが出たんだ?
- wormhole
- ベストアンサー率28% (1626/5665)
#3 です。 >C1のインスタンスメソッド中でやってないのが間違ってる。 すいません間違ってますね・・・ C1のインスタンスなしでやってるのが間違ってる。 が正しいですね。
- wormhole
- ベストアンサー率28% (1626/5665)
>「new C2();」でインスタンス化をしてると考えているのですが、その考えはどこが間違っているのでしょうか。 C1のインスタンスメソッド中でやってないのが間違ってる。 以下がダメなのと同じ。 public Class C1 { int a; public static void main(String[] args) { System.out.println("a=" + a); } }
- Tacosan
- ベストアンサー率23% (3656/15482)
詳細は「内部クラス」とか「インナークラス」とか「inner class」とかで調べてください. #1 に書いたんだけど, 「new C2() でインスタンス化する」ためにはクラスC1 のインスタンスを必要とします. そして, 変数 c_1 にクラスC1 のインスタンスがあれば c_1.new C2() という形で「c_1 に付随する C2 のインスタンス」を作ることができます. このようにして作った C2 のインスタンスは, c_1 のメンバーに対し無条件に (アクセス指定を無視して) アクセス可能です.
- Tacosan
- ベストアンサー率23% (3656/15482)
C2 は static じゃないから, クラスC2 のインスタンスを作るためにはクラスC1 のインスタンスが必要.
お礼
Tacosanさん、回答ありがとうございます。 C2クラスがC1クラスの中に入れ子見たいにあるのと、別クラスになるのとは文法的にどのように違う のでしょうか。 「new C2();」でインスタンス化をしてると考えているのですが、その考えはどこが間違ってい るのでしょうか。 また、クラスC2 のインスタンスを作るためにはクラスC1 のインスタンス化をしてやるのは、どの ように具体的に書くのでしょうか。 宜しくお願いします
お礼
c_2 = c_1.(new C2()) ; c_2 = new (c_1.(new C2()) ; その他色々試しましたが、全てエラーでした。 冷やかしはやめて下さい。