2013-10-03 21 views
1

免責聲明這些對象:THIS IS HOMEWORK我有對象的arrway,現在我想,以填補串

嗨,

目標:創建具有不同的房間,一平/公寓房,可以通過租用一個人(租房者)。我可以讓新的租客(如果有免費房間),並在他們想離開時刪除租房者。

我有什麼:

我已經創建了一個名爲平帶客房的自定義數組。

首先,我已經創建了一個陣列(沒有ArrayList的,因爲我知道數組的大小預先)

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

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

其次,我已經添加了承租人對象進入室內,這些將在NULL首先是因爲我想檢查房間是否是空的。

public class Room { 
renter Renter; 

    Room() { 
     renter = null; 
    } 
} 

所以,現在我有房間的陣列與renter對象被設置爲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; 
    } 

好到目前爲止好:

現在我想承租添加到一個房間,如果房間可用。

所以在我平級的,我有一個方法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對象。

我的解決方案不起作用

這種感覺就像我應該這樣做「其他方式」以防萬一。首先創建一個空對象,然後用正確的數據填充這些對象。

例如,在我的房客類,我可以有下面的構造:

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

要問題(S)我的經驗主要有因爲我想用靜態方法(retrieveNameRenter)選擇一個對象的值(這是非靜態的)。

現在我的問題:

1)我的解決方案是否有意義?

2)如果是這樣,我該如何解決這些錯誤(我已經嘗試了很多不同的,類,公共,私人等等,等等)

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

把你的錯誤,並在搜索字段複製粘貼(不含特定的變量名)。 –

回答

6

你不能訪問類實例的方法以static的方式,即只使用類名。您需要創建一個類的實例來調用實例方法。這些都是不正確的語句:

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

使用新創建承租人類的實例,並調用使用實例的方法,這裏提到:

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

瞭解更多有關實例和類變量和方法,在這裏: http://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html

+0

嗯。是的,我明白,但它不起作用(還)。這可能是因爲: 1)我已經創建了我的新Renter對象在我的扁平類,如果它通過if語句(有一個免費房間可用)。 2)我的出租對象存儲在Flat數組中。 謝謝你的回答:) – swennemen

1

你嘗試調用一個非靜態方法靜態方法。靜態方法定義爲class而不是類的每個實例。您可以在class Renter的實例上撥打setName(String name)

想想下一個問題:如果你已經增加了五個租房到你的房間,這承租人你除了有名稱設置?你可以這樣做:

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因爲你知道的大小提前開始。我建議你閱讀ArrayListlink的文檔。 有一個構造函數可以讓你指定初始大小。請注意0​​和set()。試試:

List<String> l = new ArrayList<>(10); 
l.set(5, "str"); 
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 
    } 
}