在 java 的 main 方法中调用内部 class

Calling an inner class in a main method in java

所以我已经尝试查找导致此问题的原因并将我的代码与其他人的任何可能错误进行比较,但我还没有找到任何其他可能导致此问题的内容。

我正在尝试调用内部 class 对以存储数据。

关于我的项目的快速信息。

获取投票数据并确定某人的政治立场。 现在我只是想解析数据。 示例数据

Rep1[tab]D[tab]-+-+-++---

我将其存储为...

ArrayList<Pair<String,String>>

所以 rep1 是 ArrayList 中的位置,然后 D 和 -++-+-++--- 是一对。

但我在尝试实例化 Pair 时遇到问题 class“无法从静态上下文中引用的非静态变量”

特别是

C:\Users\Stephanie\Desktop>javac DecisionTree.java
DecisionTree.java:26: error: non-static variable this cannot be referenced from a static context
                        Pair pair = new Pair();
                                    ^
1 error

代码:

public class DecisionTree{  
public static void main(String[] args)
{
    ArrayList<Pair> data = new ArrayList<Pair>();
    FileReader input = new FileReader ("voting-data.tsv");
    BufferedReader buff = new BufferedReader(input);
    String line = null;

    while((line=buff.readLine())!=null)
    {
        Pair pair = new Pair();
        String[] array = line.split("\t");
        pair.setLabel(array[1]);
        pair.setRecord(array[2]);
        data.add(pair);
    }
}


/**
* Private class to handle my inner data
*/
public class Pair
{
    private String label;
    private String record;
    /**
    * contructor
    *@param String label, the label of the person's party
    *@param String record, their voting record
    */
    private Pair(String label, String record)
    {
        this.label = label;
        this.record = record;
    }
    /**
    * empty contructor
    */
    private Pair()
    {

    }
    /**
    * get the label
    *@return String label, the label of the person's party
    */
    private String getLabel()
    {
        return label;
    }       
    /**
    * get the record
    *@return String record, their voting record
    */
    private String getRecord()
    {
        return record;
    }       
    /**
    * set the label
    *@param String label, the label of the person's party
    */
    private void setLabel(String label)
    {
        this.label=label;
    }       
    /**
    * set the record
    *@param String record, their voting record
    */
    private void setRecord(String record)
    {
        this.record=record;
    }   
}

}

谢谢!我觉得我缺少一些非常基本的东西,我已经有很长时间没有使用 Java

让你的 Pair static,即:

public static class Pair

否则不能在main()中构造Pair对象,因为它是静态方法。内部 classes(与静态嵌套 classes 相对)需要周围的实例。

您的评论还说 Pair 是私人的,但 class 被标记为 public。如果这是您的意图,请private

非静态内部 class 与 Java 中封闭 class 的一个实例相关联。这意味着您示例中 class Pair 的实例属于 DecisionTree 的特定实例。您只能在 DecisionTree 的实例上下文中创建它。您不能在 main() 方法中使用 new Pair() 直接创建 Pair,因为该方法是静态的(因此,它不与 DecisionTree 的实例相关联)。

如果您不想要这个,请将内部 class static:

public class DecisionTree {
    // ...

    public static class Pair {
        // ...
    }
}

对是内在的class。内部 class 的实例与它们所属的 class 的实例相关联,并且只能在父实例的上下文中创建。 如果你声明 Pair static 它将变成一个嵌套的 class,这更像是一个常规的 class。封闭的 class 仅提供其名称。