当前位置: 技术问答>java相关
为什么会这样??急急……
来源: 互联网 发布时间:2015-05-14
本文导语: 为什么结果为:0 实在不懂!!为什么,谢谢! public class Test { public static void add3 (Integer i) { int val = i.intValue(); val += 3; i = new Integer (val); } public static void main (String args [ ] ) { Integer i = new ...
为什么结果为:0
实在不懂!!为什么,谢谢!
public class Test {
public static void add3 (Integer i) {
int val = i.intValue();
val += 3;
i = new Integer (val);
}
public static void main (String args [ ] ) {
Integer i = new Integer (0);
add3 (i);
System.out.println (i.intValue ( ) );
}
}
实在不懂!!为什么,谢谢!
public class Test {
public static void add3 (Integer i) {
int val = i.intValue();
val += 3;
i = new Integer (val);
}
public static void main (String args [ ] ) {
Integer i = new Integer (0);
add3 (i);
System.out.println (i.intValue ( ) );
}
}
|
这个问题知道的时候很简单的,不知道的时候很复杂的。
首先我们要明白java中引用的概念。
我们假设jvm的内存空间有一个对象(objectA),这个对象程序层面上是不可见的,我们使用引用这个概念来使用这个对象。我们程序提供refA,refB两个引用指向这个对象。当然我们这个时候可以通过refA,refB来处理对象objectA了。
其次也是最重要的一点,我们可以把引用指向别的对象。比如jvm中还存在一个对象objectB的话,我们也可以使用引用refB指向objectB(本来refB是指向objectA的)。
最后,函数传参数的时候,基本类型是传值的,但是其他的都是传引用的。实际上传递是引用的copy(*****注意不是引用指向对象的copy******),所以我针对传入参数操作时,操作的是同一个对象。但是这里理解有一个困难的地方就是,我们只能利用对象的成员函数来操作对象,如果我们对引用重新赋值的话(就是你的例子),引用就不是指向原来那个对象了,所以就达不到你要的效果了。
******************************************************
这里的说明对于String类不适合的,因为String在java中很特殊,
自己需要了解的话,请自己研究(看jdk原代码)
******************************************************
当你在函数add3()中的一行;
i = new Integer (val);
执行以后,实际上i已经是指向内存某处的其他对象了,而不是
main函数的
Integer i = new Integer (0);
的那个i了。
首先我们要明白java中引用的概念。
我们假设jvm的内存空间有一个对象(objectA),这个对象程序层面上是不可见的,我们使用引用这个概念来使用这个对象。我们程序提供refA,refB两个引用指向这个对象。当然我们这个时候可以通过refA,refB来处理对象objectA了。
其次也是最重要的一点,我们可以把引用指向别的对象。比如jvm中还存在一个对象objectB的话,我们也可以使用引用refB指向objectB(本来refB是指向objectA的)。
最后,函数传参数的时候,基本类型是传值的,但是其他的都是传引用的。实际上传递是引用的copy(*****注意不是引用指向对象的copy******),所以我针对传入参数操作时,操作的是同一个对象。但是这里理解有一个困难的地方就是,我们只能利用对象的成员函数来操作对象,如果我们对引用重新赋值的话(就是你的例子),引用就不是指向原来那个对象了,所以就达不到你要的效果了。
******************************************************
这里的说明对于String类不适合的,因为String在java中很特殊,
自己需要了解的话,请自己研究(看jdk原代码)
******************************************************
当你在函数add3()中的一行;
i = new Integer (val);
执行以后,实际上i已经是指向内存某处的其他对象了,而不是
main函数的
Integer i = new Integer (0);
的那个i了。
|
xioyoo(xioyoo) 、gja106(中文字符) 解决方法是一样的,都解决了问题。
不过现在你的问题的核心是,可能你认为java和c一样,有传值调用和引用调用。事实上跟你想的不完全一样。
想要弄清问题,如果你有《最新java2核心技术 卷I: 原理》的话看看page119
我想你会明白的。
不过现在你的问题的核心是,可能你认为java和c一样,有传值调用和引用调用。事实上跟你想的不完全一样。
想要弄清问题,如果你有《最新java2核心技术 卷I: 原理》的话看看page119
我想你会明白的。
|
作为参数传进去的i只是一个引用,执行完i=new Integer(val);之后,方法add3里面的i变成了另一个引用,而main方法里面的i仍是原来的引用,所以值不变
|
结果当然是0,请体会下面的代码
public class Test2 {
public static Integer add3 (Integer i) {
int val = i.intValue();
val += 3;
return new Integer (val);
}
public static void main (String args [ ] ) {
Integer i = new Integer (0);
i=add3 (i);
System.out.println (i.intValue ( ) );
}
}
它打印出来的结果可能就是你想要的,仔细考虑一下:)
public class Test2 {
public static Integer add3 (Integer i) {
int val = i.intValue();
val += 3;
return new Integer (val);
}
public static void main (String args [ ] ) {
Integer i = new Integer (0);
i=add3 (i);
System.out.println (i.intValue ( ) );
}
}
它打印出来的结果可能就是你想要的,仔细考虑一下:)
|
main中i从前到后一直都没有改变过。add3方法中的i并没有改变main中的i.
可以改成:
public static Integer add3 (Integer i) {
int val = i.intValue();
val += 3;
i = new Integer (val);
return i;
}
public static void main (String args [ ] ) {
Integer i = new Integer (0);
i = add3 (i);
System.out.println (i.intValue ( ) );
}
可以改成:
public static Integer add3 (Integer i) {
int val = i.intValue();
val += 3;
i = new Integer (val);
return i;
}
public static void main (String args [ ] ) {
Integer i = new Integer (0);
i = add3 (i);
System.out.println (i.intValue ( ) );
}
|
再给一种解决办法,对了,这可能不是解决办法,只是说明有关方法参数的问题:
public class Test {
public static void add3 (MyInteger i) {
int val = i.getValue();
val += 3;
i.setValue(val);
}
public static void main (String args [ ] ) {
MyInteger i = new MyInteger (0);
add3 (i);
System.out.println (i.getValue ( ) );
}
}
class MyInteger {
public MyInteger(int value) {
this.value =value;
}
public void setValue(int value) {
this.value =value;
}
public int getValue() {
return value;
}
private int value;
}
public class Test {
public static void add3 (MyInteger i) {
int val = i.getValue();
val += 3;
i.setValue(val);
}
public static void main (String args [ ] ) {
MyInteger i = new MyInteger (0);
add3 (i);
System.out.println (i.getValue ( ) );
}
}
class MyInteger {
public MyInteger(int value) {
this.value =value;
}
public void setValue(int value) {
this.value =value;
}
public int getValue() {
return value;
}
private int value;
}
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。