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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 翟宝海 中级黑马   /  2013-5-27 23:46  /  1892 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 翟宝海 于 2013-5-28 10:08 编辑
  1. class Demo
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 int x = 4;
  6.                 show(x);
  7.                 System.out.println(x);
  8.         }
  9.         public static void show(int x)
  10.         {
  11.                 x = 2;
  12.         }
  13. }
  14. //为什么运行结果是4?
  15. class Demo
  16. {
  17.         int x = 3;
  18.         public static void main(String[] args)
  19.         {
  20.                 Demo d = new Demo();
  21.                 d.x = 10;
  22.                 show(d);//show(new Demo());
  23.                 System.out.println(d.x);
  24.         }
  25.         public static void show(Demo d)
  26.         {
  27.                 d.x = 6;
  28.         }
  29. }
  30. //运行结果是6;
  31. class Demo
  32. {
  33.         public static void main(String[] args)
  34.         {
  35.                 int[] arr = new int[2];
  36.                 show(arr);
  37.                 System.out.println(arr[0]);
  38.         }
  39.         public static void show(int[] arr)
  40.         {
  41.                 arr[0]++;
  42.         }
  43. }
  44. //运行结果是1;
复制代码
第二个和第三个可以理解,第一个还有些迷糊,试请诸位达者指点迷津!

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

8 个回复

倒序浏览
第一个运行结果为4,怎么会是2呢?

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
你要理解局部变量,这个问题主要是牵扯到局部变量,主函数中定义的局部变量x和show函数参数中定义的局部变量x不是同一个,因为局部变量只在局部内有效,和别的部分没有任何关系

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
同意LS的,
明确一点,public static void show(int x)中的x为形式参数 show(x);中的x为实际参数,
函数被调用时会在内存中开辟空间,之后会将实参的值复制给形参,再在他的空间里进行各种操作,但是实参的值没有改变,
所以 show(x);只是在他自己的那一片空间里将x的值改为了2,之后随着函数运行完也就释放了,没有其他动作了,做为实参,也就是最后打印的x的值还是一开始定义的4

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 王瀛 于 2013-5-28 07:26 编辑

解释都在代码注释中了,按照一,二,三...的顺序看。另:原Demo我改成了Test01其他没动
  1. class Test01
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 int x = 4;//一.注意,这里的x是局部变量,并非成员变量
  6.                 show(x);//三.这里的x相当于主函数中的x,即show(4)。但是!!!这里传递的是x的值,而并不是x
  7.                 System.out.println(x);//五.由于"三"相当于没起作用,所以这里的x打印的是"一"中的x
  8.         }
  9.         public static void show(int x)//二.这里的x也是局部变量,局部变量随着方法的调用结束而释放(消亡)
  10.         {
  11.                 x = 2;
  12.         }//四.由于x是局部变量,所以这里的x=2前并没有省略"this.",操作的仍然是传递进来的x。又因为是局部变量,所以当此方法执行到这个"}"的地方时,show()中的局部变量x被释放,所以相当于做的无用功,或者说show(方法在卖萌)
  13. }
  14. //为什么运行结果是4?
  15. class Test01
  16. {
  17.         int x = 3;//一.这里的x定义在类的成员位置上,是成员变量。成员变量随着对象的创建而存在于堆内存中,只有当对象没有被指向(引用)时,所占的堆内存才会被垃圾回收器收走
  18.         public static void main(String[] args)
  19.         {
  20.                 Test01 d = new Test01();//二.在本类中创建本类对象,d指向了本类的一个实例化对象
  21.                 d.x = 10;//三.实例化对象中的x被赋值
  22.                 show(d);//show(new Demo());四.===>show(刚刚创建的对象)
  23.                 System.out.println(d.x);//八.打印实例化对象中的成员变量x,x的值经过三、四、六后变为6,被打印出来
  24.         }
  25.         public static void show(Test01 d)//五.show方法会接收一个Test01类型的引用,并对引用中的内容操作
  26.         {
  27.                 d.x = 6;//六.这里的d是局部变量,只不过与"二"中new出来的实例化对象同名。当"四"被执行后,传入了创建的实例化对象,并对实例化对象中的x进行赋值。
  28.         }//七.此函数调用结束,原来在栈内存中的局部变量d被释放。但是!!!实例化对象确实已经被操作,即show方法的效果被创建的实例化对象所保留,所以这里的show()没有卖萌,起到了应有的作用。
  29. }
  30. //运行结果是6;
  31. class Test01//这个的解释与上面(结果为6)的类似,因为数组也是引用型变量
  32. {
  33.         public static void main(String[] args)
  34.         {
  35.                 int[] arr = new int[2];
  36.                 show(arr);
  37.                 System.out.println(arr[0]);
  38.         }
  39.         public static void show(int[] arr)
  40.         {
  41.                 arr[0]++;
  42.         }
  43. }
  44. //运行结果是1;
复制代码

评分

参与人数 1技术分 +2 收起 理由
滔哥 + 2

查看全部评分

回复 使用道具 举报
方法出栈,方法中的变量就死掉了。

但是对象创建后,对象持有对类的引用。只用当类的引用结束。对象才会变成垃圾

总之一句话:看内存

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
lpflpy 中级黑马 2013-5-28 09:26:03
7#
第一句是传值,故原值不变
第三句是穿引用地址,故可以改变数组中的元素值

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 HM张博文 于 2013-5-28 09:58 编辑

第一段程序中的show方法根本就没有任何意义,相当于自娱自乐
public static void show(int x)

        {

                x = 2;

        }

在这段程序里面,x只是形参,给形参赋值,完全没意义。按原来的程序,调用show(4)相当于执行的是4=2这样的错误指令。
根据楼主的意思,调用show(4)的时候是希望将4的值赋给X,那函数应该这样写
public static int show(int x)

        {

                int y = x;
               return y;

        }

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 赞一个!

查看全部评分

回复 使用道具 举报
王瀛 发表于 2013-5-28 07:21
解释都在代码注释中了,按照一,二,三...的顺序看。另:原Demo我改成了Test01其他没动 ...

解释得很详细,有拨云见月之感,多谢释疑!谢谢几位热心助人的同学了!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马