java知识有一个地方不懂,请高手指点,谢谢

Edward1688 2012-05-24 10:10:22
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());
}
}


请问这个为什么输出的结果是0呢?
...全文
493 39 打赏 收藏 转发到动态 举报
写回复
用AI写文章
39 条回复
切换为时间正序
请发表友善的回复…
发表回复
shangzhihaohao 2012-05-28
  • 打赏
  • 举报
回复
java中基本类型是使用值传递的方式为方法传递变量的,而对象是使用引用传递的方式来传递参数的。


package shang;

class Obj{
int val;
Obj(int i){
val = i;
}
}

public class Arg {
public static void main(String[] args){
Obj obj = new Obj(1);
int val = 1;
valfn(val);
objfn(obj);
System.out.println(val);
System.out.println(obj.val);

}
public static void valfn(int i){
i++;
}
public static void objfn(Obj o){
o.val++;
}
}



这段代码输出的结果是:

1
2
sdojqy1122 2012-05-28
  • 打赏
  • 举报
回复
这种问题错过一个,不会想错第二次的。
A_545571406 2012-05-28
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
public class Test{
public static void add3(Integer i){
int val=i.intValue();
val+=3;
i=new Integer(val);//这是个新对象,你懂得
}
[/Quote]
不是作用域的原因也不是什么内部类的东东,参数是值传递,但是我标注的部分又创建了一个对象,引用变量i的值已经改变,指向新的对象,而新对象有没有return返回,下面会发生啥你懂得。楼主多看看引用变量和对象的内存图(最好是图,直观)很简单。
l2316623667 2012-05-28
  • 打赏
  • 举报
回复
个人认为是值传递和引用传递引起的!
思想的浪潮 2012-05-28
  • 打赏
  • 举报
回复
值的作用域啊,main里的i初始化就是0啊
shangzhihaohao 2012-05-28
  • 打赏
  • 举报
回复
确实不是因为作用域的问题,只是楼主在不同的地方使用了同一个变量的名字i,让人产生一种误解。
地雷 2012-05-28
  • 打赏
  • 举报
回复
不要觉得。。。想不出就自己test一下。。
[Quote=引用 9 楼 的回复:]

我也觉得是3.。。。感觉是引用类型。int类型被包装成Integer是不是也就跟其他的引用类型一样了。如果一样了就是3,如果不是那就是0.LZ我知道的就这么多呀。。。
[/Quote]
fuguitong163 2012-05-28
  • 打赏
  • 举报
回复
不是作用域的问题,应该是值传递的问题
shine1434 2012-05-28
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

引用楼主 的回复:
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[]){
In……


这个应该是作用域的问题
Java code
……
[/Quote]

我想说7楼是错的!
不是作用域的问题,是值传递和引用传递的问题
看那边 2012-05-28
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]
引用 5 楼 的回复:

引用 4 楼 的回复:
为什么输出0的问题: 应该是值传递问题


那个值怎样传递呢?
我怎么觉得结果是3呢?不是调用那个add()方法吗?

Java中的值传递和c++中的值传递是相似的。不知楼主对c++了解否。值传递,说白了就是在你调用的函数里面只是使用了你所赋予的参数的一个副本,那个副本只在那个被调用的方法中有效,不管在那个被调用的方法里那些参数被……
[/Quote]

这才是正确的。跟7楼说的作用域没一点关系。
阿_伦 2012-05-28
  • 打赏
  • 举报
回复
我觉得应该是传值的问题吧....就相当于把零的值传给方法中的i的值,但是没有返回....
看那边 2012-05-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
下面程序标记处应该插入哪个选项的代码?
class EnclosingOne{
public class InsideOne{}
}
public class InnerTest{
public static void main(String args[]){
EnclosingOne eo=new EnclosingOne();
//insert……
[/Quote]

这里插入的应该是E) EnclosingOne.InsideOne ei=eo.new InsideOne();
这里涉及到得就完全是内部类的关系了。
根据内部类的定义。因为InsideOne是内部类。它是与EnclosingOne相关联的。根据内部类的定义,如果不是static class。那么内部类就不能脱离其从属类。

因此我们在创建内部类的对象的时候,就必须使用通过它从属的类来创建。如果我们不通过它从属的类来创建,那么久违反了java 内部类的定义。
因为我们的创建语法为:E) EnclosingOne.InsideOne ei=eo.new InsideOne();
看那边 2012-05-28
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
引用楼主 的回复:
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[]){
In……


这个应该是作用域的问题

Java code
……
[/Quote]

其实这个跟作用域没关系的。
看那边 2012-05-28
  • 打赏
  • 举报
回复
这里根本你们所说的作用域的原因。跟那个没有任何关系。这里涉及到得知识是引用传递。
首先我们需要搞清楚的是,引用时如何传递的。
1、首先将当前的引用复制一份,然后传递给函数。那么函数使用的就是复制品引用。但是这个引用仍然是指向你所创建的new Integer(0)的。
当你写 i = new Integer(val);时
那么这个复制品引用就指向了new Integer(3)了。
你真正的引用仍然是指向的new Integer(0)。这就是为什么输出的是0了。

如果换成这种情况。
public class Test {
private int i = 0;
public Test(int i) {
this.i = i;
}
public int intValue() {
return i;
}
public static void add3(Test i) {
i.i = 10;
}
public static void main(String args[]) {
Test i = new Test(0);
add3(i);
System.out.println(i.intValue());
}
}

那么这里传递的引用仍然是复制品。
但是我们在写i.i = 10;语句时,其实真是是这样操作的。
使用复制品引用i。但是i指向的是new Test(0);。
然后i.i = 10;就是让复制品引用i指向的内存块new Test(0)中的变量i修改为10。
因此我们打印出的是10.

luffy1010 2012-05-28
  • 打赏
  • 举报
回复
对象是“地址传递”;
8大基本数据类型是“值传递”。
shangzhihaohao 2012-05-28
  • 打赏
  • 举报
回复
正确答案是E,编程思想内部类一章对此有叙述。
[Quote=引用 1 楼 的回复:]

下面程序标记处应该插入哪个选项的代码?
class EnclosingOne{
public class InsideOne{}
}
public class InnerTest{
public static void main(String args[]){
EnclosingOne eo=new EnclosingOne();
……
[/Quote]
lovehuilang 2012-05-27
  • 打赏
  • 举报
回复
个人建议~ 看看 形参和 实参 方法调用 和返回的区别~!
best12345678 2012-05-27
  • 打赏
  • 举报
回复
Integer i=new Integer(0); //利用构造器给i变量赋初值。
add3(i); //因为该方法是void类型的,没有返回值 System.out.println(i.intValue()); //所以i的值一直是'0'。
你如果知道他们之间的内存关系,你就明白是怎么一回事了。
ccg5230 2012-05-26
  • 打赏
  • 举报
回复
同意7楼的观点
李利伟不加V 2012-05-26
  • 打赏
  • 举报
回复
7楼是 详细正解
加载更多回复(19)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧