2

クラス向けの非常にシンプルなテキスト RPG のようなゲームに取り組んでいます。すべてがうまくいっているように感じますが、次のクラスを実行すると、コンパイル エラーが発生します。

これは私の「部屋」クラスです:

import java.io.*;
import java.util.*;

public class Room {

    public static int size;

    public static void Room(int n) {
        size = n;
    }

    public static void showSize() {
        System.out.println(size);
    }
}

これを呼び出すクラスは次のとおりです。

import java.io.*;
import java.util.*;

public class Dungeon {
    public static void main(String [] args) {
        int mySize = 10;
        Room a = new Room(mySize);

        a.showSize();
    }
}

奇妙な部分は、Room() コンストラクターでパラメーターなしで実行しても問題ありませんが、(変数で、または int で明示的に) サイズを渡そうとすると、次のようになります。

Dungeon.java:8: cannot find symbol
symbol  : constructor Room(int)
location: class Room
        Room a = new Room(mySize);
                 ^
1 error
4

7 に答える 7

5
public static void Room(int n){
    size = n;
}

コンストラクターではなく、静的メソッドです。だから、あなたがしようとするとき

Room a = new Room(mySize);

Java は、パラメーターを使用してコンストラクターを探し、コンパイル時エラーを表示します。

次のように変更します。

public Room(int n){
        size = n;
    }

コンストラクターの詳細については、こちらをご覧ください。

于 2013-02-04T15:55:54.923 に答える
5

コンストラクターを呼び出そうとしてRoomいますが、何も定義していません。あなたはこれを持っています:

public static void Room(int n){
    size = n;
}

...しかし、それはコンストラクターではなく、単なる静的 void メソッドであり、静的フィールドを設定します。Roomクラスを次のように見せたいと本当に思っていると思います:

public class Room {
    private final int size;

    public Room(int size) {
        this.size = size;
    }

    public void showSize() {
        System.out.println(size);
    }
}

sizeとの両方privateを作成したことに注意してくださいfinal。建設後に部屋のサイズを変更できるようにしたい場合は、 を削除できfinalますが、 フィールド を保持することを強くお勧めしますprivate

于 2013-02-04T15:57:10.783 に答える
3

これは、コンストラクターを宣言する方法ではありません。

public static void Room(int n){
    size = n;
}

代わりにこれを使用してください:

public Room(int n){
    size = n;
}

size非静的にします。

説明:

インスタンスstaticに固有ではなく、クラスに属するメソッドと変数を実際に宣言しました。Room のインスタンスを作成したいので、インスタンスごとに固有でなければならないコンストラクターとメンバーは静的であってはなりません。

パラメーターを指定せずに実行すると正しくコンパイルされる理由は、ここで行ったようにコンストラクターを指定しない場合、コンパイラーが既定のパラメーターなしのコンストラクターを提供するためです。

クラスとインスタンス メンバーの詳細については、公式チュートリアルのこのページを参照してください

于 2013-02-04T15:56:28.987 に答える
2

問題は、コンストラクターをvoid型および静的型にすることはできないため、次のように変更することです。

public static void Room(int n){
    size = n;
}

public Room(int n){
    size = n;
}

そしてそれは動作します。

于 2013-02-04T15:57:52.720 に答える
1

あなたpublic static void Room(int n){はコンストラクターではありませんpublic Room(int n){

サイズフィールドを非静的に変更することもできます

そして、メインでそれをテストできますSystem.out.println(new Room().size);

于 2013-02-04T15:57:03.930 に答える
1
public static void Room(int n) {
        size = n;
    }

これは、コンストラクターを作成しようとしているようですが、作成する方法ではありません。

コンストラクターとサイズ変数を非静的にします。

public class Room{    
   private int size;
   public Room(int n){
      size = n;
   }
}

Staticsize は Room オブジェクトのカプセル化を破り、非公開にする必要があります。

Room a = new Room(mySize);

参照

于 2013-02-04T15:57:14.630 に答える
0

コンストラクターは何も返さないので、ppublic static void Room(int n)Room(int n)orpublic Room(int n)に変更し、int、String、void、double、byte、short、Graphics2D などのコンストラクターに沿って戻り値の型を配置できないことに注意してください。

于 2013-02-04T16:41:42.073 に答える