java - 为什么按钮对象的行为会因声明位置的不同而不同

标签 java android object reference

我正在用 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 对象并赋值给(=)变量 buttonbuttonButton 类型的引用变量。并且,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/

相关文章:

java - 进程死后如何使用异常堆栈跟踪

java - SurfaceView 作为背景

android - 如何将 ViewPager 的高度包装到其当前 Fragment 的高度?

android - 如何在 Android 的动态壁纸中设置剩余天数

java - 我的 maxSumDigits 方法正确吗?

java - 什么是IndexOutOfBoundsException?我该如何解决?

C++静态对象类函数

html - pushState:状态对象到底是做什么用的?

java - 从java中的另一个类访问变量

java - 初始化 SSLContext 失败