如果方法不能是静态的,则更新整数
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 设为 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
做事。在那种情况下,使它成为 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);}
我正在使用 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 设为 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
做事。在那种情况下,使它成为 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);}