java类没有通信?

时间:2013-02-04 15:54:47

标签: java class parameters

我正在为一个类开发一个非常简单的文本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

7 个答案:

答案 0 :(得分:5)

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

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

Room a = new Room(mySize);

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

将其更改为:

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

阅读有关构造函数here的更多信息。

答案 1 :(得分: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

答案 2 :(得分:3)

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

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

请改用:

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

并使size非静态。

说明:

您实际上已声明static方法和变量,这些方法和变量并非特定于实例,但属于。您想要创建Room的实例,因此构造函数和必须特定于每个实例的成员不能是静态的。

如果你在没有任何参数的情况下运行它,它正确编译的原因是,如果你没有指定任何构造函数,就像你在这里一样,编译器提供了一个默认的无参数构造函数。

有关类和实例成员的更多信息,请查看this page of the official tutorial

答案 3 :(得分:2)

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

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

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

它会起作用。

答案 4 :(得分:1)

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

您可能还想将尺寸字段更改为非静态

您可以使用System.out.println(new Room().size);

在主页中对其进行测试

答案 5 :(得分:1)

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

这似乎是你试图创建构造函数,但它不是创建的方式。

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

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

Static大小将打破Room Object的封装,它应该是私有的。

Room a = new Room(mySize);

Reference

答案 6 :(得分:0)

构造函数不会返回任何内容,因此将p public static void Room(int n)更改为Room(int n)public Room(int n)并记住您不能沿构造函数放置返回类型,如int,String,void,double,byte ,简称,Graphics2D等