java - 为什么我的数组被覆盖了java

标签 java arrays arraylist encapsulation

<分区>

我还在学习封装。我有一个 GrammarList,其中封装的每个 Grammar 都有一个数组 listRule 及其所有 setter 和 getter。如这里所见:

public class Grammar {

private enum Type {Left, Right, NULL};
private String Nom;
private static Type type = null;
private static ArrayList<Rule> listRule;

public Grammar(String nom, Type type) {
    this.Nom = nom;
    this.type = type;
    this.listRule = new ArrayList<Rule>();
}
...
}

现在在我的程序中,我注意到每次添加新语法时我的数组 listRule(添加了与语法关联的规则)都会被覆盖。我已经能够确定错误发生在 Grammar grammar = new Grammar(parametre[0], null); 行上,它清空了所有其他语法的 listRule 的内容,因此 listRule 似乎是每个语法都一样。是我的数组 listRule 创建不正确还是我的循环?

    try {
        while ((strLine = br.readLine()) != null) {
            String[] parametre = strLine.split(",");
            Grammar G = GrammarList.containsNom(parametre[0]);
            if (G == null) {
                Grammar grammar = new Grammar(parametre[0], null);
                grammarList.add(grammar);
                for (int i = 1; i < parametre.length; i++) {
                    SyntaxCheck check = new SyntaxCheck(parametre[i]);
                    if (check.isValid())
                        grammar.AddRule(check.Rule, check.Sens);
                }
            }
        }
    } catch (IOException e1) {
        e1.printStackTrace();
    }

最佳答案

您的 listRule 字段是static,这意味着每个实例共享同一个对象。

删除 static 关键字:

private ArrayList<Rule> listRule; // not static

关于java - 为什么我的数组被覆盖了java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46802633/

相关文章:

java - 如何从java中的属性文件中检索整数数据

java - 找不到适合响应类型的 HttpMessageConverter - 自定义 RestTemplate

java - 如何在 Java 矩阵(二维数组)中的 10 x 10 0 矩阵周围制作 "border"的 1

c 编程 - 一位 parent 和 4 个 child 之间的双向沟通​​没有结果

javascript - lodash 将对象数组转换为单个键数组和多个值数组

javascript - 如何将字符串转换为javascript数组

java - 编辑后继续打印整个数组列表

Java 遍历带有 HashMap 的 ArrayList

java - Asynctask 非 Activity 类中的预执行时未打开进度对话框

java - 在 For 循环中重新启动 ArrayList