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

时间:2015-05-01 17:17:21

标签: java swing jframe int

我正在使用JFrame,而我想知道为什么要使用JFrame' a'没有更新。如果我运行这个程序,这就出来了:: 10 三十 10

我想要

10 三十 30

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

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);

    }
}

3 个答案:

答案 0 :(得分:3)

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

a成为您班级的属性,或者从a返回您想要的initialize值:

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是一种按值传递的语言,甚至引用都是通过值传递的。因此,你不能"取消"引用并将其重新分配给其他内容。但是可以做的是调用引用上的方法或更改公共属性。这是因为即使它是按值传递,引用仍然指向与调用者中的对象相同的对象,因此您基本上仍在修改基础对象。这是一种微妙,往往会让人们有时绊倒。也就是说,您仍然无法使用Integer(或任何其他原始类型的自动编排等效项)或String,因为这些是不可变对象。

答案 1 :(得分:2)

Java是Pass by Value - 换句话说,当initialize返回时,该范围内a的值不会改变。要使值更改,必须在该范围内设置值。这可以通过让initialize返回新值来完成,并将该范围中的a设置为返回值:

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

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

答案 2 :(得分:0)

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

您可以在班级声明变量 要么 你可以做一件事就是将initialize方法的返回类型更改为int,并将方法initialize的返回值传递给方法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);}