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.

考虑下一个问题:如果您已经在房间中添加了五个租户,除了设置名称之外,您还会选择哪个租户?您可以执行以下操作:

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 回答