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

时间:2012-11-24 03:55:55

标签: java

不想要任何代码,只是想要某种指导。我想保持学术诚信;)

我一直在收到那个恼人的错误。我需要为每个Room实例调用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());
    }
}

4 个答案:

答案 0 :(得分:4)

您不应该尝试在Room类上调用toString(),而是在Room 对象上调用。在该方法中,使用for循环遍历房间数组,并通过为数组中保存的每个Room对象调用toString()来返回返回的String,因为这是您的方法应该执行的操作。

例如

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

答案 1 :(得分:0)

由于错误已经是状态,因此不要在静态上下文中调用实例方法。

房间是一个阶级,而不是一个对象。 toString是一个实例方法。所以在这种情况下,Room.toString()编译器会查找静态方法toString。但toString是一个实例方法,因此它引起了一个问题。

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

答案 2 :(得分:0)

你可能正在做的是在课堂上调用toString(),而不是它的实例。例如,而不是写:

Room.toString()

写:

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

答案 3 :(得分:0)

看看下面的代码,你可以用一个没有新对象的静态变量编译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)