1

免責事項: これは宿題です

やあ、

目標: 人 (賃借人) が借りることができる、複数の部屋があるフラット/アパートを作成します。新しい賃借人を作成し(空き部屋がある場合)、退去したいときに賃借人を削除できます。

私が持っているもの:

Flat with rooms というカスタム配列を作成しました。

まず、配列を作成しました(配列のサイズが事前にわかっているため、ArrayListはありません)

Flat(int a) {
    rooms = new Room[a];

    for (int i = 0; i < rooms.length; i++) {
        rooms[i] = new Room(); 
    }
}

次に、Renter オブジェクトを部屋に追加しました。部屋が空かどうかを確認したいので、最初は NULL になります。

public class Room {
renter Renter; 

    Room() {
        renter = null; 
    }
}

これで、null に設定された賃借人オブジェクトを含む部屋の配列ができました。

第二部:

Renterというクラスがあります。

賃借人は名前と姓で構成されている必要があります。そして、このデータはスキャナー クラスを使用して入力されます。私の賃借人クラスは次のようになります。

public Class Renter {

    private String name; 
    private String lastName; 

    public void setName(String name) { 
        this.name = name; 
    }

    public void setName(String lastName) { 
        this.lastName = lastName; 
    }

わかりました これまでのところとても良いです:

部屋が空いている場合は、部屋に賃借人を追加したいと考えています。

したがって、Flat クラスには、次のようなメソッド newRenter があります。

void newRenter() {
       (if freeRooms > 0) {
          for (int i = 0; i < rooms.length; i++) {
            if (rooms[i].renter == null) {
                rooms[i].renter = new Renter(); 
            }
          }
        } else {
           System.out.println("No rooms available"); 
    }

今、私が迷っている部分です。この新しく作成されたレンター オブジェクトにスキャナー クラスを使用してデータを入力する方法がわかりません。

うまくいかない私の解決策

これを「別の方法」で行う必要があるように感じます。最初に空のオブジェクトを作成し、次にこれらに適切なデータを入力します。

たとえば、私の賃借人クラスでは、次のコンストラクターを使用できます。

Renter() {
    name = ""; 
    lastname = ""; 
}

この値に正しいデータを入力してください。そこで、セッターを作ろうと思いました。

public void setName(String name) {
    this.name = name; 
}

public void setLastname(String lastname) {
    this.lastname = lastname; 

次に、ユーザーと対話するクラスで、スキャナー クラスを使用し、これらのセッターに正しい情報を入力します。

public class userInput() {
String name;  
String lastname; 

    public static String retrieveInput() {
    Scanner input = new Scanner(System.in);      
    if (input.hasNextLine()) {    
    } 
    return input.nextLine(); 
}

    public static void retrieveNameRenter() {
        System.out.println("Please give your firstname:");
        name = userInput(); 
        System.out.println("Please give your lastname:");
        lastname = userInput();

            //GIVE THE SETTERS MY INFO
            Renter.setLastname(lastname);
            Renter.setname(name);

私が経験する問題の主な理由は、静的メソッド (retrieveNameRenter) を使用してオブジェクト (非静的) の値を取得したいからです。

今私の質問:

1) 私の解決策は理にかなっていますか?

2)そうであれば、どうすればこれらのエラーを修正できますか(私は多くの異なるクラス、パブリック、プライベートなどを試しました)

error: non-static method setLastname(String) cannot be referenced from a static context
        Renter.setLastname(lastname);  
4

3 に答える 3

6

staticクラス名だけを使用して、クラス インスタンス メソッドにアクセスすることはできません。インスタンス メソッドを呼び出すには、クラスのインスタンスを作成する必要があります。これらは間違った記述です:

Renter.setLastname(lastname);
 Renter.setname(name);

ここで説明されているように、new を使用して Renter クラスのインスタンスを作成し、そのインスタンスを使用してメソッドを呼び出します。

Renter renter = new Renter();
renter.setLastname(lastname);
renter.setname(name);

インスタンス変数とクラス変数およびメソッドの詳細については、http: //docs.oracle.com/javase/tutorial/java/javaOO/classvars.htmlを参照してください。

于 2013-10-03T14:00:56.163 に答える
1

非静的メソッドを静的メソッドとして呼び出そうとしています。静的メソッドはclass、クラスのすべてのインスタンスではなく、インスタンスに対して定義されます。setName(String name)のインスタンスを呼び出すことができますclass Renter

次の質問について考えてみてください。すでに部屋に 5 人の賃借人を追加した場合、どの賃借人を除いて名前を設定しますか? 次のようなことができます:

public static void retrieveNameRenter(Renter instanceToSet) {
    System.out.println("Please give your firstname:");
    name = userInput(); 
    System.out.println("Please give your lastname:");
    lastname = userInput();

    //GIVE THE SETTERS MY INFO
    instanceToSet.setLastname(lastname);
    instanceToSet.setname(name);  }

ArrayList最初に、サイズが事前にわかっているためではなく、配列を使用すると書いています。ArrayList リンクのドキュメントを読むことをお勧めします。初期サイズを指定できるコンストラクターがあります。と に注意しadd()てくださいset()。試す:

List<String> l = new ArrayList<>(10);
l.set(5, "str");
于 2013-10-03T14:29:17.940 に答える
0

なぜあなたは静的メソッドを持っているのですか? public static void main(String[] args)アプリケーションの出発点としてメソッドがあるからですか?その場合、そのメソッドでこのクラスのオブジェクトを作成するだけです。

public class Start {
    public static void main(String[] args) {
        Start start = new Start();
        start.go();
    }

    public void go() {
         //your code goes here, you can invoke non-static methods here
    }
}
于 2013-10-03T14:39:16.083 に答える