我正在用Java(代号为One)编写一个Android应用程序。我从事Java大约3年了(Swing,FX,经过一年的Python生涯),但不是一名专业程序员。因此,对于周围的专业人士,请多多包涵。
这是我的问题:我已经注意到,一个项目可以以完全不同的方式运行,这取决于是否在for循环中或在类的开头启动了var。
以下是一些代码:
在第一种情况中,在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行为,还是引擎盖下发生了我不知道的事情?
任何人都可以解释吗?
答案 0 :(得分:2)
这是我的问题:我已经注意到一个项目可以完全运行 不同的是,取决于var是在for循环内启动还是在 在课程开始时。
一些说明:
场景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
引用或指向一个存储位置。请注意,上面的代码在方法内部以及在块(for循环)之内-因此button
是局部变量或方法变量。
对于for循环的每次迭代,都会创建一个新的Button
对象,并将引用(内存位置)存储或添加到form
中。如果for循环运行3次,则存在三个不同 Button
对象和三个引用。
方案2:
private Button button;
上面的语句声明一个button
引用变量(Button类型)。这是一个 instance变量;对于声明它的类的一个对象,只有一个实例。这意味着,每当创建类Test
的对象(例如Text test = new Test()
或{{ 1}}),那么内存中将只有一个变量new Test()
和一个位置。
button
第一次运行代码public void animation() {
for (int i = 0; i < list.size(); i++) {
button = new Button("test");
form.add(button);
时,在for循环中,实例变量button = new Button("test");
被分配了一个新的button
对象(新的Button(“ test”))。这指向Button
变量的存储位置。对于for循环的第二次迭代,将创建另一个新的button
对象,并将其分配给 same 按钮变量(内存位置),等等。
因此,Button
实例变量的存储位置被一次又一次地重新分配,这就是您看到这种“不协调”行为的原因。
注释:
请参阅我撰写的这篇文章:Object References in Java。
此外,尝试了解什么是Java中的堆内存。