非静态方法toString()无法从静态上下文中引用

7

不需要任何代码,只需要一些指导。希望保持我的学术诚信 ;)

我一直在遇到那个烦人的错误。我需要为每个房间实例调用toString方法。有什么建议吗?如果可能的话,我希望在2小时内得到答案。

public class Hotel
{
    //constant
    public static final int NUM_ROOMS = 20;

    //variables
    public Room[] theRoom;
    public String name;
    public int totalDays;
    public double totalRate;
    public int singleCount;
    public int doubleCount;
    public int roomsRented;
    public int NOT_FOUND;

    public Hotel(String newName) {
        name = newName;
        Room[] Rooms = new Room[NUM_ROOMS];
    }

    public double getTotalRentalSales() {
        return totalRate + roomsRented;
    }

    public double getAvgDays() {
        return roomsRented/totalDays;
    }

    public double getAvgRate() {
        return totalRate/roomsRented;
    }

    public int getSingleCount() {
        return singleCount;
    }

    public int getDoubleCount() {
        return doubleCount;
    }

    public String printRentalList() {
        System.out.println("Room Information: " + Room.toString());
    }
}

加1分因为没有要求代码解决方案。这是正确的态度! - Hovercraft Full Of Eels
5
请注意,您在寻求志愿者帮助时不应尝试急于催促或施加压力,因此请在您的问题中避免提及“截止日期”等内容。通常而言,问题的质量与获得满意答案的速度直接相关。一个好的问题是否包含所需信息并且易于理解? - Hovercraft Full Of Eels
6个回答

5

不应该直接调用 Room 类的 toString() 方法,而应该在 Room 对象 上调用。在该方法中,使用 for 循环遍历房间数组,并打印调用数组中每个 Room 对象的 toString() 方法返回的字符串,因为这似乎是该方法应该做的事情。

例如:

System.out.println("All Foos held here include: ");

// using a "for-each" loop, assuming an array called fooArray that holds Foo objects
for (Foo foo: fooArray) {
   System.out.println(foo);
}

显然,您需要根据您的代码更改类型和变量名称。

编辑2:虽然您必须使用标准的for循环而不是for-each循环,因为您不会循环遍历整个数组,而是在达到roomsRented计数时退出。

System.out.println("All Foos held here include: ");

// using standard for loop, assuming an array called fooArray that holds Foo objects
for (int i = 0; i < someMaxNumber; i++) {
   System.out.println(fooArray[i]);
}

2
+1 给超棒的用户名。 :D (但是认真地,给答案加一分。) - asteri
@Hovercraft Full Of Eels 我还在努力学习中,哈哈...显然我是新手。感谢您的时间和耐心 =D - WannaBeDroidProgrammer
@user1848879:不客气。继续努力,继续实验。 - Hovercraft Full Of Eels
顺便说一下,下次我会确保不提及截止日期 =) - WannaBeDroidProgrammer

1
你可能正在调用类Room的toString()方法,而不是它的一个实例。例如,你写的代码可能是这样的:
Room.toString()

写:

Room r = new Room()
r.toString()

1
System.out.println(Arrays.toString(arr));

在编写数组时,会出现一个下拉菜单,在那里您可以看到默认的包或java.util包。您需要选择java.util包,问题就会解决。


1

由于错误已经说明,请不要在静态上下文中调用实例方法。

Room是一个类,而不是一个对象。toString是一个实例方法。因此,在这种情况下,编译器会寻找一个静态方法toString。但是toString是一个实例方法,所以它会引起问题。

请始终记住,实例方法是使用类的对象调用的,而不是使用类本身调用的。


@Hovercraft Full Od Eels 唉,我的代码无法正确发布....在代码的"System.out.println(Room[i]);"一行中,我不断收到“无法找到符号”的错误提示。(我已经决定放弃使用toString方法,这样至少可以完成代码,哈哈。您有什么建议吗? - WannaBeDroidProgrammer

1

看下面的代码,你可以使用静态变量而不需要新对象来编译toString,但它只会在运行时抛出异常

demo>cat Test.java 
class Water {
  public String toString() {return "whatever";}
}

public class Test { 
  static Water water;
  public static void main(String...args) {
    System.out.println(water.toString());
  }
}

demo>javac Test.java 
demo>java Test
Exception in thread "main" java.lang.NullPointerException
    at Test.main(Test.java:8)

1
一个答案很久以前就已经被接受了。你的回答是否为原帖增加了有价值的内容?在重新回答这样一个老问题之前,请先考虑一下。 - Marco Scabbiolo

0
当你调用classname.method()时,这意味着你正在调用一个静态方法。我们使用类名来调用静态方法。
这里的类是:Room
方法是:toString()
toString()不是一个可以用类名调用的静态方法。
toString()是Object类的方法。
因此,您应该使用room.toString(),其中'room'是Room类的对象。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接