我正在用 Java 编写一个 Android 应用程序(代号为 One)。我接触 Java 大约 3 年(Swing、FX,经过一年的 Python),但不是专业程序员。所以,身边的高手,还请多多包涵。
这是我的问题:我注意到一个项目的运行方式可能完全不同,这取决于 var 是在 for 循环内还是在类的开头启动。
这是一些代码:
在第一种情况中,按钮在for 循环内实例化,调用按钮或通过列表添加按钮。运行项目时,结果是一样的:
for (int i = 0; i < list.size(); i++) {
Button button = new Button("test"); // OR
Button button = new Button(list.get(i));
form.add(button);
};
在第二种情况中,按钮在 for 循环之外实例化。在这种情况下,当我使用 ArrayList 或按钮时,结果会有所不同。
public class Test {
private Button button;
public void animation() {
for (int i = 0; i < list.size(); i++) {
button = new Button("test"); // OR
button = new Button(list.get(i));
form.add(button);
}
}
}
项目中还有一个计时器,当我用第二种方法添加一个按钮时,组件以不协调的方式显示,而当我使用第一种方法时不会发生这种情况。
我已经解决了编程部分,但是,不管对项目的直接影响如何,为什么在 Java 中它很重要,在 for 循环内部或外部实例化一个变量?为什么我是否使用 ArrayList 很重要?
对我来说,这没有意义。这是意外的 Java 行为,还是背后发生了一些我不知道的事情?
谁能解释一下?
最佳答案
Here is my issue: I have noted that a project can run quite differently, depending on if a var is initiated inside a for-loop or at the beginning of a class.
一些说明:
场景 1:
for (int i = 0; i < list.size(); i++) {
Button button = new Button("test"); // OR
Button button = new Button(list.get(i));
form.add(button);
};
考虑语句:Button button = new Button("Press me");
new Button()
创建一个新的 Button
对象并赋值给(=
)变量 button
。 button
是Button
类型的引用变量。并且,button
引用或指向内存位置。请注意,上面的代码在一个方法中,也在一个 block (for 循环)中 - 所以 button
是局部变量或方法变量。
对于 for 循环的每次迭代,都会创建一个新的 Button
对象,并将引用(内存位置)存储或添加到 form
。如果 for 循环运行 3 次,则存在三个不同 Button
对象和三个引用。
场景 2:
private Button button;
上面的语句声明了一个button
引用变量(Button 类型)。它是一个实例变量;对于声明它的类的一个(一个)对象,它只有一个实例。这意味着,每当创建类 Test
的对象时(例如,Text test = new Test()
,或new Test()
),将只有一个变量button
和内存中的一个位置。
public void animation() {
for (int i = 0; i < list.size(); i++) {
button = new Button("test");
form.add(button);
代码button = new Button("test");
第一次运行时,在for循环中,实例变量button
被赋值了一个新的按钮
对象(新按钮(“测试”))。这指向 button
变量的内存位置。对于 for 循环的第二次迭代,将创建另一个新的 Button
对象并将其分配给相同 按钮变量(内存位置)等。
因此,button
实例变量的内存位置被一次又一次地重新分配,这就是您看到这种“不协调”行为的原因。
注意事项:
请参阅我撰写的这篇文章:Object References in Java .
此外,尝试了解什么是 Java 中的堆内存。
关于java - 为什么按钮对象的行为会因声明位置的不同而不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53952701/