• 締切済み

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)) ; } } } =========================================================================

  • htgo
  • お礼率33% (407/1224)
  • Java
  • 回答数7
  • ありがとう数2

みんなの回答

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.7

それか C1 c_1 = new C1() ; C2 c_2 = c_1.new C2() ; と、c_1を先に宣言 なんにせよ、エラーメッセージは重要なヒントです。 自分で解決するにせよ、人に直してもらうにせよ、まずは、エラーメッセージの内容を確認することから始まります。 「エラーになった」だけじゃ、答えようがありません。

  • wormhole
  • ベストアンサー率28% (1619/5653)
回答No.6

>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)
回答No.5

冷やかす? 手元ではちゃんと動くんだがなぁ. その「色々試した」ってのは, 具体的にはどうやった? そして, 「全てエラーでした」ってのは, それぞれに対してどんなエラーメッセージが出たんだ?

  • wormhole
  • ベストアンサー率28% (1619/5653)
回答No.4

#3 です。 >C1のインスタンスメソッド中でやってないのが間違ってる。 すいません間違ってますね・・・ C1のインスタンスなしでやってるのが間違ってる。 が正しいですね。

  • wormhole
  • ベストアンサー率28% (1619/5653)
回答No.3

>「new C2();」でインスタンス化をしてると考えているのですが、その考えはどこが間違っているのでしょうか。 C1のインスタンスメソッド中でやってないのが間違ってる。 以下がダメなのと同じ。 public Class C1 { int a; public static void main(String[] args) { System.out.println("a=" + a); } }

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

詳細は「内部クラス」とか「インナークラス」とか「inner class」とかで調べてください. #1 に書いたんだけど, 「new C2() でインスタンス化する」ためにはクラスC1 のインスタンスを必要とします. そして, 変数 c_1 にクラスC1 のインスタンスがあれば c_1.new C2() という形で「c_1 に付随する C2 のインスタンス」を作ることができます. このようにして作った C2 のインスタンスは, c_1 のメンバーに対し無条件に (アクセス指定を無視して) アクセス可能です.

htgo
質問者

お礼

c_2 = c_1.(new C2()) ; c_2 = new (c_1.(new C2()) ; その他色々試しましたが、全てエラーでした。 冷やかしはやめて下さい。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

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

htgo
質問者

お礼

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

関連するQ&A

  • 内部クラス?のエラー

    内部クラス?のエラー  今晩は、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); } } ====================================================================

    • ベストアンサー
    • Java
  • java

    次のコード中の括弧内で下に示す11通りの各コードを実行した場合の実行画面を正確に答えよ。 class A{ public void func1(){System.out.println("A1");} public void func2(){System.out.println("A2");} } class B extends A{ public void func1(){System.out.println("B");} } class C{ public int x=0, y=1; } class D extends C{ public int x=2; public void func1(int x){System.out.println(x);} public void func2(int x){System.out.println(this.x);} public void func3(int x){System.out.println(super.x);} public void func4(int x){System.out.println(this.y);} public void func5(int x){System.out.println(super.y);} } class E{ public void func1(int n){ try{ System.out.println("E1"); int[] ary=new int[n]; System.out.println("E2"); }catch(NegativeArraySizeException e){ System.out.println("E3"); }finally{ System.out.println("E4"); } } } (1) A a=new A(); a.func1(); (2) A a=new B(); a.func1(); (3) B b=new B(); b.func1(); (4) B b=new B(); b.func2(); (5) D d=new D(); d.func1(3); (6) D d=new D(); d.func2(3); (7) D d=new D(); d.func3(3); (8) D d=new D(); d.func4(3); (9) D d=new D(); d.func5(3); (10) E e=new E(); e.func1(5); (11) E e=new E(); e.func1(-2); (1) A1 (2)B (3)B (4) A2 (5) 3 (6) 2 (7) 0 (8) 1 (9) 1 (10) E1E2E4(11) E1E3E4 と答えになるんですがなぜこうなるのかわかりません。教えてください

    • ベストアンサー
    • Java
  • java iを1づつ増やすプログラムと2づつ増やすプログラム

    次のようにすればiを1づつ増やして表示されます。 class Calc{   int i=1;   int add(){     return i++;   } } class Count{   public static void main(String[] args){     Calc calc = new Calc();     System.out.println("i = " + calc.add());     System.out.println("i = " + calc.add());     System.out.println("i = " + calc.add());   } } 実行結果 i = 1 i = 2 i = 3 しかし次のように2づつ増やそうとすると、 class Calc{   int i=1;   int add(){     return i+2;   } } class Count{   public static void main(String[] args){     Calc calc = new Calc();     System.out.println("i = " + calc.add());     System.out.println("i = " + calc.add());     System.out.println("i = " + calc.add());   } } 実行結果 i = 3 i = 3 i = 3 このようになってしまいます。どこがおかしいのでしょうか?

    • ベストアンサー
    • Java
  • publicクラス

    クラスの修飾子にpublicをつける理由を教えて下さい。 さらに、なにも修飾子をつけなときは 同一パッケージ(ファイル)内からでしかアクセスできないはずですよね? Test.javaとBase.javaを以下のように定義します。 class Test { public static void main(String[] args) { Base b = new Base(); } } class Base { public void show() { System.out.println("hello!"); } } この2つのファイルは同じディレクトリにあります。 public修飾子をつけていないにも関わらず、なぜインスタンス化ができるのでしょうか? よろしくおねがいします。

    • ベストアンサー
    • Java
  • JAVAコンストラクタについて

    JAVA のコンストラクタ定義の際に、下記のようにコンストラクタにvoidを付けた時と付けない時の処理結果が変わるのはなぜでしょうか。 (1) class O { protected int d; O(){ System.out.println("O = " + d); } } class Study_6_3main_void { public static void main(String args[]) { int i = 1; O OO = new O(); System.out.println("O = "); } } (2) class O { protected int d; void O(){ System.out.println("O = " + d); } } class Study_6_3main_void { public static void main(String args[]) { int i = 1; O OO = new O(); System.out.println("O = "); } } 実行結果 (1) O = 0 O = (2) O = 以上です。回答の程よろしくおねがいします。

    • ベストアンサー
    • Java
  • javaでOXゲーム

    学校で出たjavaの課題に取り組んでいます。 javaでのOXゲームをコマンドプロンプト上で実現したいのですが。どのようなソースコードにすればよいのでしょうか。 皆目検討もつかない状況に陥ってしまいました。 import java.io.*; //盤面クラス class Board{ public void Board(){ int[] board; board = new int[9]; board[0] = 1; board[1] = 2; board[2] = 3; board[3] = 4; board[4] = 5; board[5] = 6; board[6] = 7; board[7] = 8; board[8] = 9; } public void show(){ System.out.println(board[0]+board[1]+board[2]); System.out.println(board[3]+board[4]+board[5]); System.out.println(board[6]+board[7]+board[8]); } } //先攻クラス class First{ } //後攻クラス class Second{ } //判定クラス class Judge{ } //メイン class Game{ public static void main(String[] args)throws IOException { System.out.println("OXゲーム!"); Board b = new Board(); } }

  • クラス変数/メソッドとインスタンス変数/メソッドの見え方について

    Javaの言語仕様(?)についてお教え下さい。 参照変数の型がインスタンスのスーパークラスの型の時、クラス変数/メソッドとインスタンス変数/メソッドの見え方が納得いかずに困っています。 以下のような条件の時です。   ・クラスが2つあり、1つはもう1つのクラスを継承しています。     それぞれを「スーパー」「サブ」と以下で呼びます。   ・インスタンスは"サブ"の型です。   ・上記インスタンスへの参照変数は"スーパー"のクラスの型です。   ・"スーパー"、"サブ"ともに【同名】の「クラス」変数/メソッド、「インスタンス」変数/メソッドがあります。 この場合に、"サブ"のインスタンスを参照している"スーパー"の型の変数を介し、それらにアクセスしたらどれが見えるか?という疑問です。 実験結果では以下のようになりました。           [フィールド]  [メソッド]   [1.static ]  スーパーの   スーパーの   [2.非static]  スーパーの   サブの 納得いかないのは「2.非static」で「フィールド」が、「スーパーの」になるところです。 これも「サブの」になると思っていました。 なぜサブクラスのが見えないのでしょうか? 同名の変数なのでスーパークラスのはサブクラスので隠れされ、サブクラスのが見えると思っていたのですが。 参考書には以下のように書いてありました。   フィールドの場合、参照変数の型のものが見える。   メソッドの場合、インスタンスの型のものが見える。 私には不自然に感じられるのですが、「こういう仕様だから。」と納得するしか無いのでしょうか? 「なぜこうなるか」について説明がある文献、サイトなどありましたらお教えください。 参考までに以下が実験したサンプルコードと結果です。長くて申し訳ありません。 「サンプルコード」 public class Super { static int staticField = 10; int instanceField = 100; static void staticMethod() { System.out.println( "staticField = " + staticField ); } void instanceMethod() { System.out.println( "instanceField = " + instanceField ); } } public class Sub extends Super { static int staticField = 90; int instanceField = 900; static void staticMethod() { System.out.println( "staticField = " + staticField ); } void instanceMethod() { System.out.println( "instanceField = " + instanceField ); } } public class TestStatic { public static void main(String[] args) { // インスタンスはSub、参照変数もSub、という状態。 Sub sub = new Sub(); System.out.println( "実験1" ); System.out.println( "1.クラス変数      " + sub.staticField ); System.out.print( "2.クラスメソッド    " ); sub.staticMethod(); System.out.println( "3.インスタンス変数   " + sub.instanceField ); System.out.print( "4.インスタンスメソッド " ); sub.instanceMethod(); // インスタンスはSub、参照変数はSuper、という状態。 Super sup = new Sub(); System.out.println( "実験2" ); System.out.println( "5.クラス変数      " + sup.staticField ); System.out.print( "6.クラスメソッド    " ); sup.staticMethod(); System.out.println( "7.インスタンス変数   " + sup.instanceField ); System.out.print( "8.インスタンスメソッド " ); sup.instanceMethod(); } } 「結果」 実験1 1.クラス変数      90 2.クラスメソッド    staticField = 90 3.インスタンス変数   900 4.インスタンスメソッド instanceField = 900 実験2 5.クラス変数      10 6.クラスメソッド    staticField = 10 7.インスタンス変数   100 8.インスタンスメソッド instanceField = 900 納得が行かないのは7のところです。 以上よろしくお願いいたします。

    • ベストアンサー
    • Java
  • Javaのプログラムについて教えてください!

    //Sub.java package prac; class Super{ public void A(){ String address = new String("Osaka"); System.out.println(address); } } public class Sub extends Super{ public void A(){ String address = new String("Kyoto"); System.out.println(address); } public int A(String tmp){ return Integer.parseInt(tmp); } } このプログラムを他のクラスのmain関数から呼び出す場合どのようなコードになりますか?また、間違えているところがあれば合わせて教えてください。

    • ベストアンサー
    • Java
  • Javaのコンストラクタについて教えてください

    Javaを勉強している初心者です。 次のようなプログラムがあります。 このプログラムでclass aおよびclass bのデフォルトコンストラクタ a() {}とb() {}をコーディングしていないとコンパイルエラーになります。 b() {}についてはclass bのパラメータのあるコンストラクタb(String s)がサブクラスclass cから明示的に呼ばれていないのでデフォルトコンストラクタb() {}をコーディングしないとエラーになる…と考えればよいのでしょうか。 それでは、a() {}はなぜ必要なのでしょうか。 どなたか教えてください。 class a { a() {} a(String s) { System.out.println("In a's constructor..."); System.out.println(s); } } class b extends a { b() {} b(String s) { super(s); System.out.println("In b's constructor..."); System.out.println(s); } } class c extends b { c(String s) { System.out.println("In c's constructor..."); System.out.println(s); } public void some() { System.out.println("something..."); } } public class appJ01 { public static void main(String args[]) { c obj = new c("Hello from Java!"); } } 

  • java コンパイルエラー (初心者です)

    次のようなソースコードを入力してコンパイルすると、 class, interface, or enum expectedというエラーが出ます。 なぜでしょうか?{}の数はあってると思いますが... dentaku.java class dentaku{ public static void main (String args[]){ //3つの変数「a」と「b」と「c」を宣言 int a =0; int b =1; int c =1; System.out.println("xを10進数,aを2進数の1の位、bを10の位、cを100の位とするとと" + (x=a^2+b^2+c^2) + "です。"); } }

    • ベストアンサー
    • Java

専門家に質問してみよう