为什么按钮对象的行为取决于声明的位置

时间:2018-12-28 01:26:27

标签: java android object reference

我正在用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行为,还是引擎盖下发生了我不知道的事情?

任何人都可以解释吗?

1 个答案:

答案 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中的堆内存。