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