A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

class Test
{
        public static void main(String[] agrs)
        {
                int i=1;
                show(i);
                System.out.println(i);
        }
        public static void show(int i)
        {
                 return i=2;
        }
}

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 新人鼓励

查看全部评分

8 个回复

倒序浏览
首先int是值类型,main方法里面的i和show方法里面的i是两个完全不相干的变量,当在mian方法里调用show(i)的时候只是把i里面的值复制一份传递到show方法里,在show方法里又声明了一个变量i来接收刚刚传过来的值,而这个i是show方法里的局部变量,当执行完show方法就是两个{}括号之后这个i就会被回收掉,而mian方法里面的i的值还是1,没有改变过,所以你打印出来的还是1.      其实值类型的传递就好像你复制了两个文件,这两个文件毫无关系,而引用类型的传递就是复制快捷方式

评分

参与人数 1黑马币 +3 收起 理由
黄玉昆 + 3 赞一个!

查看全部评分

回复 使用道具 举报
  1. public static void main(String[] args) {

  2.                 int i = 1;
  3.                 //有返回值需要用东西接受,因为方法是修改i的值,可以用i接受修改后的值,这样就可以把i修改成2
  4.                 i = show(i);
  5.                 System.out.println(i);
  6.         }

  7.         public static int show(int i) {
  8.                
  9.                 return i=2;   //如果你要返回int值,方法类型不能用void,应该用int。
  10.         }
复制代码
回复 使用道具 举报
show方法的返回值类型写的有问题,void 类型的方法不能有返回语句。打印结果是1因为,你的main方法中的i,和show方法中的i,是两个局部变量。完全不相干。
回复 使用道具 举报
在I调用show方法后,返回值I赋值为I=2
作为一个局部变量存在,被分配于内存的栈中,而当没有栈中的引用变量对其进行引用的时候,也就是SHOW方法执行结束后,I=2这个变量将会变成垃圾被JAVA中的垃圾回收器释放掉.而这个时候I的指向是重新赋予原来的值1 (i=1)
所以当执行到System.out.println(i)时,打印的是SHOW方法释放后的赋值

评分

参与人数 1黑马币 +6 收起 理由
黄玉昆 + 6 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 明锦添 于 2013-3-5 22:59 编辑

在java中有两种引用,一种是值引用,一种是地址值引用。
通常基本类型的变量的引用是值引用,对象的引用都是地址值引用。
上文中的 i 是基本类型,是值引用,方法show(int i)中的 i 引用的值实际上只是前文定义的 i 的副本,
虽然在方法中对 i 进行了重新赋值,只改变了 i 的副本的值,并没有改变原本 i 的变量的值。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 鼓励鼓励

查看全部评分

回复 使用道具 举报
你的代码有错的。
如下,请看:
这是你的代码
class Test
{
        public static void main(String[] agrs)
        {
                int i=1;                                            //i是方法内部的局部变量,作用范围只在main方法中,传值给别的方法后,在其他的方法中变量的改变不会反映到原方法里的变量
show(i);                                               
                System.out.println(i);                          //输出的还是原来i的值,1.
        }
        public static void show(int i)                   //show()方法既然有return,就是有返回值,但你却用的void,ok!
{
                 return i=2;
        }
}
修改后,正确的代码:
class Test
{
        public static void main(String[] agrs)
        {
                int i=1;
                int i2=show(i);                             //若把show(i)赋值再给i,即i=show(i),则System.out.println(i);输出为2                             
System.out.println(i);                    //输出为1
System.out.println(i2);                    //输出为2
        }
        public static int show(int i)
        {
                 return i=2;
        }
}

评分

参与人数 1黑马币 +12 收起 理由
黄玉昆 + 12 赞一个!

查看全部评分

回复 使用道具 举报
这是因为值传参的问题。
所谓值传递,就是将实际参数值的副本(复制品)传入方法内,而参数本事不会受到任何影响。【Java里的参数传递类似与《西游记》里的孙悟空,孙悟空复制了一个假孙悟空,这个假孙悟空具有和孙悟空同样的能力,可以降妖除魔。但不管这个假孙悟空遇到什么事,真孙悟空不会受到任何影响。呵呵这里打了一个简单的比方】。
回复 使用道具 举报
i是局部变量
而且不是int类型在内存中不是以引用-对象的形势存在的
只是一个值
你改变的只是show里面的i
而main方法里的i并没有变化
所以输出结果也没有变化
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马