繁体   English   中英

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

[英]non-static method toString() cannot be referenced from a static context

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

我不断收到那个烦人的错误。 我需要为每个 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());
    }
}

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

例如

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]);
}
System.out.println(Arrays.toString(arr));

在这一行中,当你写 arrays 时,会出现一个下拉菜单,在那里你会看到默认的 package 或java.util package。你需要 select java.util 884373

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

房间是一个类,而不是一个对象。 toString 是一个实例方法。 所以 Room.toString() 在这种情况下编译器会寻找一个静态方法 toString。 但是 toString 是一个实例方法,所以它会导致问题。

永远记住实例方法是用类的对象调用的,而不是类本身。

您可能正在做的是在类 Room 上调用toString() ,而不是它的实例。 例如,不要写:

Room.toString()

写:

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

看下面的代码,你可以用静态变量编译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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM