【问题标题】:How to fix the error of making a static reference to a non-static method using array lists [duplicate]如何修复使用数组列表对非静态方法进行静态引用的错误[重复]
【发布时间】:2018-05-09 16:02:34
【问题描述】:

目前我只是在java中做一些练习:

主要:

import java.util.ArrayList;
import java.util.Random;
import javax.swing.JOptionPane;
import settelersofcatan.playerinformation;

public class settlersofcatanhelper 
{
     private ArrayList<playerinformation> PlayerArray = new ArrayList<playerinformation>();
     public static void main(String[] args) 
     {
         String NumberOfPlayersString = JOptionPane.showInputDialog("How many player");
         int NumberOfPlayers = Integer.parseInt(NumberOfPlayersString);


         for (int Counter = 0; Counter < NumberOfPlayers; Counter++)
         {
             String Name = JOptionPane.showInputDialog("Name of player " + Counter);
             String Colour = JOptionPane.showInputDialog("which colour are you playing with");
             playerinformation PlayerDetails = new playerinformation(Name, Colour, Counter);
             addplayer(PlayerDetails);
         }

     }

    public void addplayer(playerinformation player)
    {
    this.PlayerArray.add(player);
    }
}

助手类:

package settelersofcatan;

public class playerinformation {
    String PlayerName;
    String Colour;
    int Position;

    public playerinformation(String name, String colour, int position) 
    {
        setPlayerName(name);
        setColour(colour);
        setPosition(position);

    }

    public String getPlayerName() {
        return PlayerName;
    }
    public void setPlayerName(String playerName) {
        PlayerName = playerName;
    }
    public String getColour() {
        return Colour;
    }
    public void setColour(String colour) {
        Colour = colour;
    }
    public int getPosition() {
        return Position;
    }
    public void setPosition(int position) {
        Position = position;
    }
}

我现在遇到的问题是我正在尝试添加玩家的信息并得到响应“无法从类型setttersofcatanhelper 对非静态方法addplayer(playerinformation) 进行静态引用”。 我查看了我有这个工作的代码,但看不出有什么不同或为什么它不起作用的原因。谁能帮帮我?

【问题讨论】:

  • public void addplayer(playerinformation player) 是非静态的,但您从main(即static)调用它。阅读 Java 中 static 的副本和/或信息。
  • @notyou 会读一读,看看它是否对我有帮助
  • @notyou,我明白了,但是我怎样才能让它工作,我必须为它制作单独的方法吗?
  • 您必须首先了解静态的含义。它基本上意味着它是独立的,并且在任何时候都不依赖于类的状态。通过让静态方法引用类中的属性并对其进行干扰,本质上使其依赖于类的状态,因此不是有效的静态方法,因此会失败。
  • 一目了然,您可以将addplayer 设为静态,但您也需要将PlayerArray 设为静态,这可能不是您想要的。哦,this 可能也会在addplayer 中给出同样的错误,所以你可以使用settlersofcatanhelper.PlayerArray.add(player);。但我仍然会阅读static 并弄清楚。另外,请查阅 Java 命名约定(类以大写字母开头,变量为驼峰式等)。

标签: java class object compiler-errors


【解决方案1】:

您需要了解“静态”一词的含义。 您可以在这里查看其他地方: https://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html(文档) https://www.javatpoint.com/static-keyword-in-java(易读教程)

如果你在任何方法中应用 static 关键字,它被称为静态方法。 静态方法属于类而不是类的对象。 无需创建类的实例即可调用静态方法。 静态方法可以访问静态数据成员并且可以改变它的值。

因此,您不能从静态(类)方法调用非静态(对象)方法。您需要创建一个对象并在对象引用上调用该方法:

settlersofcatanhelper a = new settlersofcatanhelper();
a.addPlayer(PlayerDetails);

如果这是您想要做的,或者将方法更改为静态方法(我不能判断,取决于您要实现的目标),但请记住 this 变量不能从静态内容中调用(列表本身也必须是静态的)。

private static ArrayList<playerinformation> PlayerArray = new ArrayList<playerinformation>();

[...]

public static void addplayer(playerinformation player) {
    this.PlayerArray.add(player);
}

" 另外(不完全关于这个主题),我建议你阅读 java 中的命名约定 :)

编辑:

我尝试掌握它的想法是使用public static void main(String[] args) 方法(仅此而已)创建一个单独的类(称为“测试”或其他),然后从那里开始。静态和非静态成员之间的区别在开始时可能会有点混乱,并且为您的“逻辑”单独放置一个位置可能有助于区分您可以使用和不能使用的静态内容。

那么您的 main 方法可能类似于:

public static void main(String[] args) {
    settlersofcatanhelper object = new settlersofcatanhelper();
    // do what you want with your object (which is an instance of settlersofcatanhelper class)
}

【讨论】:

  • 感谢您的意见。我只是不完全确定如何特别修复我的程序。我在我的公共类的开始时创建了一个对象
  • 是的,我会阅读 Java 命名约定,但我首先想让程序运行起来,然后再让它变得整洁。
  • @Outlander 我在您的帖子下的评论中提供了一个解决方案,这将消除错误,但请确保这是您想要的 static 方法和变量。
  • @notyou,我明白你的意思,但我只是不明白我如何才能让程序按我想要的方式工作,而不是仅仅删除错误
  • @Outlander 这里的问题是你实际上从来没有创建任何settlersofcatanhelper 的实例-我认为阅读类和对象之间的区别是要走的路ncl.ucar.edu/Document/HLUs/User_Guide/classes/classoview.shtml这里的问题是您正在尝试从类方法中使用对象方法。
【解决方案2】:

您正在从静态方法(main)调用非静态方法(addplayer)。您可以修复它,只需将 addplayer 设为静态即可。

【讨论】:

  • 不会锁定
【解决方案3】:

main 方法是静态的; addplayer 方法是一个实例方法。因此,您需要一个 settlersofcatanhelper 的实例才能在其上调用 addplayer

【讨论】:

  • 那么我是否必须创建一个调用它的主类,使其成为非静态的?
  • 不,你可以在同一个班级里做,但是单独做一个真的不那么混乱。这也是一种更好的做法,因为这为每个类赋予了单一职责。
猜你喜欢
  • 2014-06-08
  • 2021-08-31
  • 2014-11-19
  • 1970-01-01
  • 2012-09-19
  • 2013-03-31
  • 2019-07-13
相关资源
最近更新 更多