无法从静态上下文引用Java非静态方法addInv(int)

时间:2010-07-17 17:56:53

标签: java static compiler-errors

我非常清楚这个错误,但这是我曾经难倒的一次。我知道我不能从main方法调用非静态变量,但这很令人困惑。也许你可以帮忙吗?该错误显示在addInv(1);行...

代码:

import java.io.*;
import java.util.*;
import javax.swing.*;

public class item
{
    public static int attack, defense;
    public static ArrayList<String> arr;
public static String name, desc, typeOf, attackAdd, defenseAdd, canSell, canEat,earnedCoins,canEquip;

    String stats[];

        public static void main(String args[])
        {

            addInv(1);

        }

public void addInv(int e) {

String iname = getItem(1)[0];

String idesc = getItem(1)[1];
int itypeOf = Integer.parseInt(getItem(1)[2]);
int iattackAdd = Integer.parseInt(getItem(1)[3]);
int idefenseAdd = Integer.parseInt(getItem(1)[4]);
boolean icanSell = Boolean.parseBoolean(getItem(1)[5]);
boolean icanEat = Boolean.parseBoolean(getItem(1)[6]);
int iearnedCoins = Integer.parseInt(getItem(1)[7]);


attack = attack + iattackAdd;
defense = defense + idefenseAdd;
System.out.println("You picked up: " + iname);
arr.add("dan");
System.out.println("Description: " + idesc);

}

            // Types of Items
            // 0 - Weapon
            // 1 - Food
            // 2 - Reg Item
            // 3 - Helmet
            // 4 - Armor Legs
            // 5 - Chest Armor
            // 6 - Shield

        public String[] getItem(int e) {

        String[] stats = new String[7];

            String name = "Null";
            String desc = "None";
            String typeOf = "0";
            String attackAdd = "0";
            String defenseAdd = "0";
            String canSell = "true";
            String canEat = "false";
            String earnedCoins = "0";



            if (e == 1) {

        name = "Pickaxe";
        desc = "Can be used to mine with.";
        typeOf = "2";
        attackAdd = "2";
        earnedCoins = "5";
        }

      return new String[] { name, desc, typeOf, attackAdd, defenseAdd, canSell, canEat, earnedCoins};

    }

}

感谢。

4 个答案:

答案 0 :(得分:3)

您无法从静态方法调用非静态方法。所以要么addInv静态:

public class Item {
    ...

    public static void main(String args[]) {
        addInv(1);
    }

    public static void addInv(int e) {
        ...
    }

    public static String[] getItem(int e) {
        ...
    }
}

但是将所有这些方法设置为静态可能不合适,您可能更喜欢在Item中使用main实例:

public class Item {
    ...

    public static void main(String args[]) {
        Item item = new Item();
        item.addInv(1);
    }

}

顺便说一句,我并不是说要粗鲁,但你应该认真研究你的(糟糕的)代码格式和约定,无论是对于读者还是对你而言。

另见

答案 1 :(得分:1)

Java中的

static意味着它是一个类变量或方法,这意味着该方法或变量在类的所有实例之间共享。这也意味着您不需要实例化该类来调用该方法。注意:除非你有充分的理由让事情变得静态,否则它通常不是一个好主意,因为它会产生一堆全局变量和函数。

解决此问题的正确方法是在main中创建类的实例,然后在实例上调用该方法。

注意2:如果你有多个线程,静态变量会遇到问题,这意味着你需要在这些线程之间同步读写。

我会看一下:http://download.oracle.com/docs/cd/E17409_01/javase/tutorial/java/javaOO/classvars.html

编辑:这是没有静态的代码,似乎有效。

import java.util.ArrayList;

public class Item 
{
    public int attack, defense;
    public ArrayList<String> arr = new ArrayList<String>();
    public String name, desc, typeOf, attackAdd, defenseAdd, canSell,
            canEat, earnedCoins, canEquip;

    String stats[];

    public static void main(String args[]) 
    {
        Item anItem = new Item();
        anItem.addInv(1);
    }

    public void addInv(int e) 
    {
        String iname = getItem(1)[0];
        String idesc = getItem(1)[1];

        // Never read
        //int itypeOf = Integer.parseInt(getItem(1)[2]);
        int iattackAdd = Integer.parseInt(getItem(1)[3]);
        int idefenseAdd = Integer.parseInt(getItem(1)[4]);
        // Never read
        //boolean icanSell = Boolean.parseBoolean(getItem(1)[5]);
        // Never Read
        //boolean icanEat = Boolean.parseBoolean(getItem(1)[6]);
        // Never Read
        //int iearnedCoins = Integer.parseInt(getItem(1)[7]);

        attack = attack + iattackAdd;
        defense = defense + idefenseAdd;
        System.out.println("You picked up: " + iname);
        arr.add("dan");
        System.out.println("Description: " + idesc);

    }

    // Types of Items
    // 0 - Weapon
    // 1 - Food
    // 2 - Reg Item
    // 3 - Helmet
    // 4 - Armor Legs
    // 5 - Chest Armor
    // 6 - Shield

    public String[] getItem(int e) 
    {
        // Never read
        // String[] stats = new String[7];
        String name = "Null";
        String desc = "None";
        String typeOf = "0";
        String attackAdd = "0";
        String defenseAdd = "0";
        String canSell = "true";
        String canEat = "false";
        String earnedCoins = "0";

        if (e == 1) {

            name = "Pickaxe";
            desc = "Can be used to mine with.";
            typeOf = "2";
            attackAdd = "2";
            earnedCoins = "5";
        }

        return new String[] { name, desc, typeOf, attackAdd, defenseAdd,
                canSell, canEat, earnedCoins };
    }
}

答案 2 :(得分:1)

    public static void main(String args[])
    {
        item it = new item();
        it.addInv(1);
    }

答案 3 :(得分:1)

你不能在main中调用一个与这样的对象无关的方法。 你需要打电话:

item.addInv(1);

这意味着你的public void addInt(int e)需要是静态的:

public static void addInt(int e)  

这意味着您需要更改该方法的实现,因为您在那里混合了一些概念。

基本上,静态方法是属于它们所在类的方法,因此它们并不特定于该类的任何对象。可以使用类名后跟一个点和方法名来调用此类方法,并且它们的实现不应使用特定的对象值,因为这些方法本身不与类中的任何特定对象相关联。

希望有所帮助