public class IntegerProblem {
public static void main(String[] args) {
Integer ii = 1;
swapInteger(ii);
System.out.println(ii);
}
public static void swapInteger(Integer i){
System.out.println("=="+i);
i = new Integer(56);
System.out.println("=="+i);
}
}
运行结果
==1
==56
1
Integer是包装类。他传递的是引用(的值)吧 可为什么 他的引用的对象没变。。
public class IntegerProblem {
public static void main(String[] args) {
int ii = 1;
swapInteger(ii);
System.out.println(ii);
}
public static void swapInteger(int i){
System.out.println("=="+i);
i = new Integer(56);
System.out.println("=="+i);
}
}
这样都好理解。可是Integer是个包装类 传递的就不是值了。而是引用的值了吧。为什么。谁能解答
public static void main(String[] args) {
Integer ii = 1;
swapInteger(ii);
System.out.println(ii);
}
public static void swapInteger(Integer i){
System.out.println("=="+i);
i = new Integer(56);
System.out.println("=="+i);
}
}
运行结果
==1
==56
1
Integer是包装类。他传递的是引用(的值)吧 可为什么 他的引用的对象没变。。
public class IntegerProblem {
public static void main(String[] args) {
int ii = 1;
swapInteger(ii);
System.out.println(ii);
}
public static void swapInteger(int i){
System.out.println("=="+i);
i = new Integer(56);
System.out.println("=="+i);
}
}
这样都好理解。可是Integer是个包装类 传递的就不是值了。而是引用的值了吧。为什么。谁能解答
java中从来所说的,都是只有单向值传递,而没有引用传递。这里可以这样认为,在另一个函数中,参数相当于一个局部变量,不可能通过更改局部变量试图更改参数传入对象的内存地址,亦即不是C里面传入的&ii。
System.out.println("=="+i);
i += 30000;
System.out.println("=="+i);
}即使在main方法里调用这个方法,Integer变量引用的内容还是没有改变的,可能是由于Integer型的特殊性?谁来解释这个?
/**
* @param args
*/
public static void main(String[] args) throws Exception {
Object object = new Object();
System.out.println(object.hashCode());
test(object);
System.out.println(object.hashCode());
}
private static void test(Object object){
System.out.println(object.hashCode());
object = new Object();
System.out.println(object.hashCode());
}
你的代码,和我这代码的实质是一样的。自己试着去想通吧!画个内存图就明白了。
public class Test {
public static void main(String[] args) {
int ii = 1;
swapInteger(ii);
System.out.println(ii); // 1
}
public static void swapInteger(int i){
System.out.println("=="+i); // 1
i = 56;
System.out.println("=="+i); // 56
}
}===========================
当实参的类型不是基本类型而是引用类型时,值传递的原则也未发生改变。// 例2
public class Test {
public static void main(String[] args) {
Integer ii = 1;
swapInteger(ii);
System.out.println(ii); // 1
}
public static void swapInteger(Integer i){
System.out.println("=="+i); // 1
i = new Integer(56);
System.out.println("=="+i); // 56
}
}问题在于引用类型的值是什么?引用类型的值是所指对象的内存地址,而不是所指对象的内容。
函数内的赋值操作仅仅改变了形参的值,并没有改变原始对象的内容。===========================
至于int与Integer之间的区别,这只不过是Java给我们玩的障眼法而已。
Java只不过为我们提供了简单的可以互换类型的操作,仅此而已。
试想: public static void swapInteger(int i){
System.out.println("=="+i); // 1
i = new Integer(56);
System.out.println("=="+i); // 56
}或者: public static void swapInteger(Integer i){
System.out.println("=="+i); // 1
i = 56;
System.out.println("=="+i); // 56
}甚至: public static void swapInteger(Integer i){
System.out.println("=="+i); // 1
i += 56;
System.out.println("=="+i); // 57
}上述代码修改的仍然是形参的值,不会影响函数参数值传递的本质。
i = new Integer(56); 创建了一个Integer对象,i此时的指向的地址也更改成了此对象的地址!