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

Update integer if method can't be static

我正在使用 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);

    }
}

Java 是 Pass by Value - 换句话说,当初始化 returns 时,该范围内的 a 的值不会改变。为了更改值,您必须在该范围内设置值。这可以通过初始化 return 新值,并将该范围内的 a 设置为 returned 值来完成:

int a = 10;
a = intialize(a);

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

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

要么将 a 设为 class 的 属性,要么将 return 设为 initializea 值:

public class test {

    private int a;

    ...

}

public class test {

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

        ...
    }

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

取决于您以后是否希望其他方法用 a 做事。在那种情况下,使它成为 class 的 属性 会更好。关于命名约定的注释。 类 通常以大写字母命名,因此您的 class 应该被称为 Test 而不是 test

这里需要注意的一点是,即使你传入了Integer,这仍然行不通,因为Java是一种传值语言,甚至传递引用按价值观。因此,您不能 "unseat" 引用并将其重新分配给其他内容。但是您可以 做的是在引用上调用方法或更改public 属性。这是因为即使它是按值传递,引用仍指向与调用者中的对象相同的对象,因此您实际上仍在修改基础对象。这是一个有时容易使人绊倒的微妙之处。也就是说,您仍然不能使用 Integer(或任何其他原始类型的自动装箱等价物)或 String,因为它们是不可变对象。

您正在将参数作为 "a" 传递,并且 a 的值在构造函数中为 10。 a 的值在 test() 中没有改变。

您可以在 class 级别声明变量 要么 您可以做一件事,将初始化方法的 return 类型更改为 int 并将方法初始化的 returned 值传递给方法 initialize2 而不是 a。 像这样::

public test() 
{
int a = 10; 
int b = initialize(a); 
initialize2(b); 
} 

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 b){ 
System.out.println(b);}