免责声明:这是家庭作业
您好,
目标:创建一个包含不同房间的公寓/公寓,可以由一个人(租房者)租用。我可以制作新的租房者(如果有免费房间)并在他们想要离开时删除租房者。
我有什么:
我创建了一个名为Flat with room的自定义数组。
首先,我创建了一个数组(没有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");
}
现在,是我迷路的部分。我不知道如何使用scanner类填充这个新制作的renter对象。
我的解决方案不起作用
感觉我应该以“其他方式”来做这件事。首先创建一个空对象然后用正确的数据填充它们。
例如,在我的租用者类中,我可以使用以下构造函数:
Renter() {
name = "";
lastname = "";
}
我希望这个值填充正确的数据。所以我想我会创建二传手。
public void setName(String name) {
this.name = name;
}
public void setLastname(String lastname) {
this.lastname = lastname;
然后在我与我的用户交互的班级中,我将使用扫描仪类并使用正确的信息填充这些setter:
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);
答案 0 :(得分: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
答案 1 :(得分: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
link的文档。
有一个构造函数可以让您指定初始大小。请注意add()
和set()
。尝试:
List<String> l = new ArrayList<>(10);
l.set(5, "str");
答案 2 :(得分: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
}
}