无法从静态函数中引用?

时间:2011-11-06 19:40:32

标签: java

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

public class LootGenerator{

public static void main (String[] args)
    throws FileNotFoundException{
        System.out.println("This program simulates the random item generator");
        System.out.println("from the game Diablo II.  Happy hunting!");
        System.out.println();
        String file="monstats.txt";
        Monster[] array = getArray(file);
        //Monster alex=getRandomMonster(array);
        }

public Monster getRandomMonster(Monster[] array){
  int randMonster = (int)(Math.random() * array.length);
    return array[randMonster];
}

public Monster[] getArray (String file)
    throws FileNotFoundException{
Scanner sc = new Scanner (new File (file));
Monster[] array = new Monster[sc.nextInt()];
sc.next(); //takes away the word Class
sc.next(); //takes away the word Type
sc.next(); //takes away the word Level
sc.next(); //takes away the word TreasureClass
for(int a = 0; a < array.length; a++)
{
    array[a] = new Monster(sc.next(), sc.next(), sc.nextInt(), sc.next());
}
return array;
}

}

  class Monster{
    private String monsterClass;
private String type;
    private int level;
    private String treasureClass;

public Monster(String myClass, String myType, int myLevel, String myTreasureClass){
    monsterClass = myClass;
      type = myType;
    level = myLevel;
    treasureClass = myTreasureClass;
}

public String getMonsterClass(){
    return monsterClass;
}

public String getType(){
    return type;
}

public int getLevel(){
    return level;
}

public String getTreasureClass(){
    return treasureClass;
}

}

我无法弄清楚我的计划有什么问题...有什么建议吗?我一直认为它无法从静态上下文引用 - 即Monster [] array = getArray(file)。该程序的目标是从文本文件中随机生成一个怪物 - 如果您需要查看文本文件本身,则分配在此处:http://www.cis.upenn.edu/~cis110/hw/hw06/index.html

7 个答案:

答案 0 :(得分:3)

您尝试从静态方法调用常规方法,这是不可能的。您可以实例化LootGenerator然后调用方法或使方法静态(只需将静态修改器添加到方法中)。

一个解决方案:

public static void main (String[] args)
    throws FileNotFoundException {
        System.out.println("This program simulates the random item generator");
        System.out.println("from the game Diablo II.  Happy hunting!");
        System.out.println();
        String file = "monstats.txt";
        LootGenerator lg = new LootGenerator();
        Monster[] array = lg.getArray(file);
        Monster alex = lg.getRandomMonster(array);
}

您可以找到有关实例和班级成员here的更多信息。

简而言之,实例方法只能在类的实例上调用。静态方法属于该类,可以从任何地方调用,但它们不能访问实例变量或调用实例方法,除非它们实际上具有对类实例的引用。

答案 1 :(得分:2)

get array不是静态方法,需要启动一个对象或使其静态

答案 2 :(得分:1)

getArray是一种实例方法,您可以从main调用它,并将其声明为static。如果您将getArray更改为静态,则会进行编译。

getRandomMonster也会遇到同样的问题。

答案 3 :(得分:1)

你应该

public Monster[] getArray (String file)
    throws FileNotFoundException

静态,以便您可以从当前正在执行的main()内部调用它,您不需要实例化类LootGenerator来调用它(如果方法是静态的,它属于类声明它的地方,可以在不使用该类的任何实例的情况下调用它。)

答案 4 :(得分:1)

您不能直接从静态方法(getArray)引用与特定对象相关的非静态方法(main),该方法与特定对象无关。

要修复它,您可以简单地将方法更改为静态:

public static Monster[] getArray (String file) {
    // ...
}

答案 5 :(得分:1)

getArray()getRandomMonster()是非静态的 - 它们需要调用对象的实例。您的主要方法是静态的,因此您没有实例。你必须创建它:

LootGenerator generator = new LootGenerator();
generator.getArray(..);
generator.getRandomMonster(..);

答案 6 :(得分:1)

main函数是static,这意味着它可以作为一个整体在类上调用,而不仅仅是该类的特定实例。 getArray未定义为静态,因此如果您调用它,则必须在LootGenerator的特定实例上调用它,但您尝试在整个类中调用它。我在getArray中没有看到任何非静态代码,因此您应该能够将其声明为静态。