gpt4 book ai didi

java - 为什么我的对象看到构造函数中没有给它的变量?

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:18:13 26 4
gpt4 key购买 nike

我有以下代码。哪个是“正确的”,哪个我不明白:

private static void updateGUI(final int i, final JLabel label) {
SwingUtilities.invokeLater(
new Runnable() {
public void run() {
label.setText("You have " + i + " seconds.");
}
}
);
}

我创建了一个 Runnable 类的新实例,然后在该实例的 run 方法中我使用了变量 labeli。它有效,但我不明白为什么它有效。为什么所考虑的对象会看到这些变量的值。

根据我的理解,代码应该是这样的(而且是错误的):

private static void updateGUI(final int i, final JLabel label) {
SwingUtilities.invokeLater(new Runnable(i,label) {

public Runnable(int i, JLabel label) {
this.i = i;
this.label = label;
}

public void run() {
label.setText("You have " + i + " seconds.");
}

});
}

因此,我会将 ilabel 变量提供给构造函数,以便对象可以访问它们...

顺便说一下,在 updateGUI 中,我在 ilabel 之前使用了 final。我想我使用了 final 因为编译器需要它。但我不明白为什么。

最佳答案

final 封闭方法中声明的变量可以被该方法中的匿名内部类访问。如果您将参数设置为非最终参数,您会看到编译器报错。

您不能在匿名内部类中声明构造函数。人们有时会通过编写初始化 block 来解决这个问题

new Runnable() {
{ /* this code is executed */ }

public void run() {
// ...
}
};

我认为无法访问非最终变量的原因是因为如果您创建匿名内部类对象,然后会更改非最终变量——匿名内部类是否应该使用更新后的值?当函数终止执行并且变量被销毁时,它如何处理这种情况?如果它只能使用 final 变量,那么语义很清楚:它将拍摄 final 变量值的快照。

关于java - 为什么我的对象看到构造函数中没有给它的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2484214/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com