2

我正在为一个班级制作一个非常简单的文本 RPG 类游戏。我觉得一切都很好,但是当我运行以下类时,出现编译器错误。

这是我的“房间”课程:

import java.io.*;
import java.util.*;

public class Room {

    public static int size;

    public static void Room(int n) {
        size = n;
    }

    public static void showSize() {
        System.out.println(size);
    }
}

这是调用它的类:

import java.io.*;
import java.util.*;

public class Dungeon {
    public static void main(String [] args) {
        int mySize = 10;
        Room a = new Room(mySize);

        a.showSize();
    }
}

奇怪的是,如果我在 Room() 构造函数中不带任何参数运行它,那很好,但是当我尝试传入一个大小(在变量中或显式使用 int)时,我得到了这个:

Dungeon.java:8: cannot find symbol
symbol  : constructor Room(int)
location: class Room
        Room a = new Room(mySize);
                 ^
1 error
4

7 回答 7

5
public static void Room(int n){
    size = n;
}

不是构造函数,它是静态方法。所以,当你尝试

Room a = new Room(mySize);

Java 查找带参数的构造函数并显示编译时错误。

将其更改为:

public Room(int n){
        size = n;
    }

在此处阅读有关构造函数的更多信息。

于 2013-02-04T15:55:54.923 回答
5

您正在尝试调用Room构造函数,但尚未定义任何构造函数。你有这个:

public static void Room(int n){
    size = n;
}

...但这只是一个静态 void 方法,而不是构造函数 - 它设置了一个静态字段。我怀疑你真的希望你的Room班级看起来像这样:

public class Room {
    private final int size;

    public Room(int size) {
        this.size = size;
    }

    public void showSize() {
        System.out.println(size);
    }
}

请注意,我已经制作sizeprivatefinal。如果你真的希望你的房间能够在建造后改变大小,那么你可以删除final,但我强烈建议你保留字段private

于 2013-02-04T15:57:10.783 回答
3

这不是您声明构造函数的方式:

public static void Room(int n){
    size = n;
}

改用这个:

public Room(int n){
    size = n;
}

并使size非静态。

解释:

您实际上已经声明static了不特定于实例但属于该类的方法和变量。您要创建 Room 的实例,因此必须为每个实例指定的构造函数和成员不能是静态的。

如果您在没有任何参数的情况下运行它可以正确编译的原因是,如果您不指定任何构造函数,就像您在此处所做的那样,编译器会提供一个默认的无参数构造函数。

有关类和实例成员的更多信息,请查看官方教程的这个页面

于 2013-02-04T15:56:28.987 回答
2

问题是构造函数不能是 void 和静态类型,所以改变:

public static void Room(int n){
    size = n;
}

public Room(int n){
    size = n;
}

它会起作用。

于 2013-02-04T15:57:52.720 回答
1

public static void Room(int n){不是构造函数将其更改为public Room(int n){

您可能还想将大小字段更改为非静态

你可以在你的主要测试System.out.println(new Room().size);

于 2013-02-04T15:57:03.930 回答
1
public static void Room(int n) {
        size = n;
    }

这似乎是您正在尝试创建构造函数,但它不是创建方式。

使您的构造函数和大小变量非静态。

public class Room{    
   private int size;
   public Room(int n){
      size = n;
   }
}

Staticsize 会破坏 Room Object 的封装,它应该是私有的。

Room a = new Room(mySize);

参考

于 2013-02-04T15:57:14.630 回答
0

构造函数不返回任何内容,因此将 p 更改public static void Room(int n)Room(int n)orpublic Room(int n)并记住您不能将返回类型放在构造函数中,例如 int、String、void、double、byte、short、Graphics2D 等

于 2013-02-04T16:41:42.073 回答