public class T { static void change(Integer i){ i = 7777; } public static void main(String[] args) { Integer i = new Integer(8888); change(i); System.out.println(i); } } 输出怎么还是8888
楼上答得很好,但似乎不是我想知道的答案我问的是传值与传地址的问题如果i是一个对象,那么传的应该是地址,如果是地址,那么值就应该变了,但结果没变我就搞不清楚new 出来的怎么存的就不是地址呢把这段代码改一下,假设一个Person类,有个name属性public class T { static void change(Person p){ p.setName("ddd") ; } public static void main(String[] args) { Person p = new Person(); p.setName("abc"); change(i); System.out.println(p.getName()); } } 这么一来输出的就应该是ddd了,对吧
Person p = new Person(); p里面存的一定是地址
String str = new String("abc");//str存的是地址吧 public class T { static void change(String str) { str = "dfds"; } public static void main(String[] args) { String str = new String("dsf"); change(str); System.out.println(str); } } 结果打印的是: dsf而不是dfds
String str = new String("abc");//str存的是地址吧 String 是一个特殊类,虽然使用了new运算符,但对象是在栈空间里面的,而不是堆,str也不是存的地址,而是值
我已经把自己说服了: Integer i = new Integer(123); i中保存的是什么,是地址(与String的对象一样,Integer等包装类的对象,都是常对象(即:内部值不可更改的对象)
我的理解是: 当执行到main方法中的 Integer i = new Integer(1); i 中存的是指向一个对象的引用;然后调用change方法,将这个引用传过去. 然后执行i=12;实际上 i 指向了另外一个对象的引用.但是 main方法中的 i 与 change 方法中的 i 并不是同一个.
int 基本类型 Integer是int的引用型
我个人认为存的是地址(因为它是引用型嘛),虽然System.out.println(new Integer(123))结果是123(这个应该是它
自己重写toString()的结果
i = 12;
}
public static void main(String[] args) {
Integer i = new Integer(1);
change(i);
System.out.println(i);
}
}这段代码输出值是什么?是1,如果i是地址,那么他应该改变才对呀请高手赐教
对于其他数,按新建对象处理,存的就是地址
网上的例子很多的,可以看看
public class T { static void change(Integer i){
i = 7777;
} public static void main(String[] args) {
Integer i = new Integer(8888);
change(i);
System.out.println(i);
}
} 输出怎么还是8888
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
也就是活此方法会返回对象的虚拟地址,因为对象地址都是由jvm管理的,不允许对内存进行操作,所以说是虚拟的,当然你也可以认为就是对象的地址。2:但是,int的封装类复写了toString()方法。它将返回一个表示该 Integer 值的 String 对象。所以打印的是Integer的值,而非地址,要想查看的话,可以调用 对象.hanshCode()查看。不知说清楚了没有。
p.setName("ddd") ;
} public static void main(String[] args) {
Person p = new Person();
p.setName("abc");
change(i);
System.out.println(p.getName());
}
} 这么一来输出的就应该是ddd了,对吧
Person p = new Person();
p里面存的一定是地址
public class T { static void change(String str) {
str = "dfds";
} public static void main(String[] args) { String str = new String("dsf");
change(str);
System.out.println(str);
}
}
结果打印的是: dsf而不是dfds
String str = new String("abc");//str存的是地址吧
String 是一个特殊类,虽然使用了new运算符,但对象是在栈空间里面的,而不是堆,str也不是存的地址,而是值
1)当然传的是对象的引用(就是对象的地址)
2)change(p); 这个不是改变p,而是改变的是p所指的那个对象中的内容(p本身的值永远不会被改变)
因此:楼主要注意区分:对象的引用与对象之间的区别
3)楼主要记住:与String的对象一样,Integer等包装类的对象,都是常对象(即:内部值不可更改的对象)
引用 13 楼 ty_tarena_pger 的回复:
String str = new String("abc");//str存的是地址吧 Java code public class T { static void change(String str) {
str = "dfds";
} public static void main(String[] args) { String str = new String("dsf");
change(str);
System.out.println(str);
}
}
void change()里面的str与main里面的str不是一回事,所以上述程序没啥意义
i中保存的是引用,传入change方法的参数也确实是引用,你的这个测试代码之所以没有得到想要的结果,主要是对i=12;这个语句没有搞明白,实际上这个语句就相当于i=new Integer(12);只是重新创建了一个对象,原来传进来的对象的值并没有改变。可惜Integer没有setValue方法,否则如果调用i.setValue(12);你就能够看到效果了。
看看这里也许,对这个问题有帮助
这个应该是因为Java中都是传值调用的问题吧……
当进行change(i)的时候,内部实际上是重新在change()的范围内定义了一个i的值,并对这个值进行操作。
但是这个i并不能在change()外可见,也不能对原本的i产生影响,除非写了i=change(i);——当然了,这个时候change()的返回类型需要改成int,并且在最后加上return i的语句……
这不是说:这个对象内部有什么特别之处,而是说:这个对象的类就没有提供修改其内部值的方法。
Integer i = new Integer(123);
i中保存的是什么,是地址(与String的对象一样,Integer等包装类的对象,都是常对象(即:内部值不可更改的对象)
我的理解是:
当执行到main方法中的 Integer i = new Integer(1);
i 中存的是指向一个对象的引用;然后调用change方法,将这个引用传过去.
然后执行i=12;实际上 i 指向了另外一个对象的引用.但是 main方法中的 i 与 change 方法中的 i 并不是同一个.
会给出什么呢?
i = 12;
}中的i作为change方法的参数,此参数的值是main方法中1对象的地址,此参数现在指向1对象,而当执行到i = 12;时,它就指向12这个对象了;自始至终,main中的i值都没有变化,它始终指向1对象。这道题的迷惑人之处在于change方法的参数也是i,如果改成j,就一目了然了。
i中保存的是地址。这是典型的引用传递,
static void change(Integer i){
i = 12;
}
中的i作为change方法的参数,此参数的值是main方法中1对象的地址,此参数现在指向1对象,而当执行到i = 12;时,它就指向12这个对象了;自始至终,main中的i值都没有变化,它始终指向1对象。这道题的迷惑人之处在于change方法的参数也是i,如果改成j,就一目了然了。
对于基本类型变量,直接将值保存在栽中
对于引用类型变量,其保存的是对象(new 出来的)在堆中地址的值
的确,Integer i中的i与Integer i = new Integer(1); 中的i不是同一个值,第一个是参数,而第二个是一变量。
我觉得这儿可能是输出的问题,只是输出的是值,而没有输出i地址。
包装类的值作为数值形参时是无法在程序中改变的,所以在change函数中是无效的
i保存的是对象的内存地址应该记住的是包装类定义了就不能改!
对于其他数,按新建对象处理,存的就是地址
public Integer(int value)构造一个新分配的 Integer 对象,它表示指定的 int 值。 参数:
value - Integer 对象表示的值。
=======================================================================================
因为i表示是引用对象,它指向Integer(int value)构造一个新分配的 Integer 对象,它表示指定的 int 值。
======================================================================================
在这里i保存的是123,是值.
static void change(Integer i){
i = 12;
}
中,i是一个变量,它只是用来存放一个integer类型的对象的引用,所以调用这个方法的时候才开始i是指向1的,也就是存储1的引用,但是由于i=12这个语句,产生了一个新的对象,i此时存放这个新对象的引用,所以这个i同主函数里面的i是两码事,这样就造成了上面的输出结果,小弟的理解就这么多,应该说的很详细了