请看下面的代码:
public class Swap {
public static void changeInt(int i){
i = i+1 ;
System.out.println(i);
}
public static void main(String[] argc) {
int k= 10 ;
System.out.println(k);
changeInt(k);
System.out.println(k);
}
}结果是
10
11
10
这个我能理解但是我把代码改成(int k= new Integer(10)处改变)
public class Swap {
public static void changeInt(int i){
i = i+1 ;
System.out.println(i);
}
public static void main(String[] argc) {
int k= new Integer(10) ;
System.out.println(k);
changeInt(k);
System.out.println(k);
}
}
结果为什么不变?我知道java的参数都是按值传递,但是如果按值传递的是一个对象的引用的话,在方法中改变引用的值会引起参数值的同步变化,因为都是指向一个地址。比如参数是一个类的object的话,一定同步变化。但是int k= new Integer(10)中k已经是一个指向堆中内存的引用变量了,为什么不变化呢?
public class Swap {
public static void changeInt(int i){
i = i+1 ;
System.out.println(i);
}
public static void main(String[] argc) {
int k= 10 ;
System.out.println(k);
changeInt(k);
System.out.println(k);
}
}结果是
10
11
10
这个我能理解但是我把代码改成(int k= new Integer(10)处改变)
public class Swap {
public static void changeInt(int i){
i = i+1 ;
System.out.println(i);
}
public static void main(String[] argc) {
int k= new Integer(10) ;
System.out.println(k);
changeInt(k);
System.out.println(k);
}
}
结果为什么不变?我知道java的参数都是按值传递,但是如果按值传递的是一个对象的引用的话,在方法中改变引用的值会引起参数值的同步变化,因为都是指向一个地址。比如参数是一个类的object的话,一定同步变化。但是int k= new Integer(10)中k已经是一个指向堆中内存的引用变量了,为什么不变化呢?
int类型怎么能指向一个引用?
在 java 进行自动解包时,已经不再是类了,所以不存在对象引用问题
同时,顺便说一句,Java是传引用。
这是1.4以上版本才加上的参考.net的自动装箱拆箱。
1.4及一下版本会报错的,编译都通不过。
Because:public static void changeInt(int i){
i = i+1 ;
System.out.println(i);
}
这个方法是 按值传递的, 如果想要改变 K的值 就必须改为
public static int changeInt(int i){
i=i+1;
System.out.println(i);
return i;
}
.....
k=changeInt(k)或把K变为局部变量 方法改为
public static void changeInt(int i){
k = i+1 ;
System.out.println(k);
}
都是值传递,不会引用传递
想测试引用传递,你可以做一个测试类
class MyInt{
public int k;
}
public void changeInt(MyInt mi){
mi.k ++;public test(){
MyInt mi = new MyInt();
mi.k = 10; System.out.pringln(mi.k);
changeInt(mi);
System.out.println(mi.k);
}