为什么更新匿名类方法引用的原始实例变量值不会更新其方法中的值?

Why updating a primitive instance variable value referring by the method of an anonymous class does not update the value in the method of it?

提问人:Tel lui 提问时间:6/15/2023 最后编辑:Tel lui 更新时间:6/16/2023 访问量:26

问:

这是我在维护旧应用程序时遇到的一个问题,以下是演示代码: 首先,我创建了一个类,该类的字段innerComp由匿名类的实例值,以及一个在innerComp方法中使用的字段adjustNum:

public class InnerComparator {
private int adjustNum = 0;

public InnerComparator() {

}

public InnerComparator(int adjustNum) {
    this.adjustNum = adjustNum;
}

public void setAdjustNum(int adjustNum) {
  //        adjustNum = adjustNum;
      this.adjustNum = adjustNum;
}
private Comparator innerComp = new Comparator() {
    @Override
    public int compare(Object o1, Object o2) {
        System.out.println(adjustNum);
        return adjustNum;
    }
};

public Comparator getInnerComp() {
    return innerComp;
}

public void sort(List list) {
    Collections.sort(list, innerComp);
}

}

这里演示了我如何使用它:

public class CheckInnerClassUpdate {
public static void main(String[] args) {
    InnerComparator comparator = new InnerComparator();
    List<String> list = Arrays.asList(new String[]{"1", "2", "3"});
    comparator.sort(list);
    comparator.setAdjustNum(1);
    comparator.sort(list);
    InnerComparator comparator2 = new InnerComparator(1);
    // comparator.sort(list);
    comparator2.sort(list);
}

}

结果是: 0 0 1 1 1 1

(已过时) 结果是: 0 0 0 0 0 0 我想问一下产生结果的机制。结果似乎表明,传递给匿名类实例的 adjustNum 引用了 adjustNum 的 init 值。在示例代码中,即使我通过构造函数传递值,传递给 innerComp 的值仍然是 0。我缺少一些我不知道的知识,希望有人能提供帮助。谢谢。

(更新) 如前所述,错别字会引起混淆。我已经修复了代码和 注释掉原始代码。

Java 匿名类

评论

2赞 6/15/2023
老实说,我真的不明白你想做什么以及你的问题描述。但我可以告诉你,你的 current 毫无意义,什么也没做,因为你只是将传递的参数分配给自己:.也许你的意思是,但由于我不知道你甚至期望最终结果是什么,我不能告诉你这是否会导致它。public void setAdjustNum(final int adjustNum)adjustNum = adjustNumthis.adjustNum = adjustNum;
0赞 Samuel Marchant 6/15/2023
匿名类不能访问它们的封闭类变量,除非它们是最终的,因为如果变量具有完全相同的名称,它将不被视为与封闭类变量(不同的声明变量)相同。您似乎正在尝试从匿名类中传出在其外部封闭类中声明的变量中的值。
0赞 Tel lui 6/16/2023
对不起,大家。我发现我的代码有错别字,我现在没有任何问题......

答:

1赞 Davide Lorenzo MARINO 6/15/2023 #1

我在您的代码中至少发现了一个错误:

public void setAdjustNum(int adjustNum) {
    adjustNum = adjustNum;
}

此方法不执行任何操作,因为它重置作为参数传递给函数的 adjustNum。如果需要设置类的 adjustNum 字段,则必须将代码更新为

public void setAdjustNum(int adjustNum) {
    this.adjustNum = adjustNum;
}

因此,引用实例的属性,而(不带此属性)引用传递给函数的参数。在这种情况下,您实际上设置了调用方法this.adjustNumadjustNumadjustNumsetAdjustNum

评论

0赞 Tel lui 6/16/2023
谢谢你,戴维德。我还发现最后一行没有像我想要的那样使用 comparator2。对不起,这个愚蠢的错误。