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

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

码:

 import java.io.*; import java.util.*; import javax.swing.*; public class item { public static int attack, defense; public static ArrayList 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}; } } 

谢谢。

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

 public class Item { ... public static void main(String args[]) { addInv(1); } public static void addInv(int e) { ... } public static String[] getItem(int e) { ... } } 

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

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

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

也可以看看

  • Java编程语言的代码约定
  • 如何为Javadoc工具编写Doc注释
  public static void main(String args[]) { item it = new item(); it.addInv(1); } 

你不能在main中调用一个方法,它与那样的对象没有关联。 你需要打电话:

item.addInv(1);

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

 public static void addInt(int e) 

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

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

希望有所帮助

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 arr = new ArrayList(); 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 }; } }