java - 如果方法不能是静态的,则更新整数

标签 java swing jframe int

我正在使用 JFrame,我想知道为什么 int 'a' 不更新。如果我运行这个程序,结果是: 10 30 10

我想要得到

10 30 30

但是我无法将方法initialize 或initialize2 更改为静态方法,因为在使用JFrame 时这是不可能的。在示例中看起来可以,但在我的实际程序中却不能。有人有什么想法吗?所以我的问题是,如何更新我的 int a ?谢谢。

import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JSpinner;
import javax.swing.SpinnerNumberModel;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;


public class test {

    private JFrame frame;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {

        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    test window = new test();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the application.
     */
    public test() {
        int a = 10;
        initialize(a);
        initialize2(a);
    }

    /**
     * Initialize the contents of the frame.
     * @param a 
     */
    public int initialize(int a) {
        frame = new JFrame();
        frame.setBounds(100, 100, 450, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(null);

        System.out.println(a);

        a = a + 20;

        System.out.println(a);

        return a;


    }
    public void initialize2(int a){

        System.out.println(a);

    }
}

最佳答案

原语是值类型。您已在构造函数中定义了 a,并且它仅在该范围内是本地的。 initialize 中的 a 是一个完全不同的整数,并且仅在该函数的范围内是本地的。因此,当您修改它时,您正在修改 initialize 范围内的本地变量,而不是 test 中的变量。

要么使 a 成为类的属性,要么从 initialize 返回您想要的 a 值:

public class test {

    private int a;

    ...

}

public class test {

    private test() {
        int a = initialize(a);

        ...
    }

    public void initialize(int a) {
        ...
        return a;
    }    
}

取决于您是否希望其他方法稍后使用 a 执行操作。在这种情况下,将其作为类的属性会更好。关于命名约定的注释。类通常以大写字母命名,因此您的类应称为 Test 而不是 test

这里需要注意的重要一点是,即使你传入了Integer,这仍然不起作用,因为Java是一种按值传递语言,甚至引用也是按值传递的。因此,您不能“取消”引用并将其重新分配给其他对象。但是您可以做的是调用引用上的方法或更改公共(public)属性。这是因为即使它是按值传递的,引用仍然指向与调用者中的对象相同的对象,因此您本质上仍在修改底层对象。这种微妙之处有时会让人绊倒。也就是说,您仍然无法使用 Integer (或任何其他自动装箱的基本类型的等效项)或 String 来做到这一点,因为它们是不可变的对象。

关于java - 如果方法不能是静态的,则更新整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29991647/

相关文章:

java - 在文本到 PDF 转换过程中使用 Itext 创建新页面

java - 中缀表达式计算错误

java - 为什么在构造的 JPanel 中表达了组件的某些属性,而没有表达其他属性?

java - 反序列化一个值,可以是数组或原子

java - 在Java中改变RGB颜色

java - Java中识别两个随机序列

java - 如何通知 TableCellEditor 表行已删除?

java - 是否有将Java Swing应用程序迁移到浏览器的好选择?

java+swing+mvc : how to make a model that interfaces w/multiple controls?

java - 从内部 Action 类调用外部类的方法 getContentPane()