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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 宋玉 中级黑马   /  2014-2-10 16:02  /  1782 人查看  /  15 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class Demo
{
        public static void main(String[] args)
        {
                int x = 4;
                show(x);
                System.out.println(x);
        }
        public static void show(int x)
        {
                x = 2;
        }
}
为什么输出值是4,不是2,求解释?

评分

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

查看全部评分

15 个回复

倒序浏览
int是基本数据类型,而基本数据类型属于值类型,值类型传参,是将实参复制一份(副本)传递给方法的参数,方法内改变这个副本,并不影响实参的值,故打印的结果还是原来的值
对于这个问题,你首先要理解值类型和引用类型

评分

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

查看全部评分

回复 使用道具 举报
show方法里的x是局部变量 方法外的x是全局变量 局部变量改变不影响全局
回复 使用道具 举报
  1. public static void main(String[] args)
  2.         {
  3.                 int x = 4;
  4.                 show(x);
  5.                 System.out.println(x);
  6.         }
  7.         public static void show(int x)
  8.         {
  9.                 x = 2;
  10.         }
复制代码

x都是局部变量,show(x);只是把mian方法的x当做参数传递给了show方法,在show方法中并没有打印x的值啊 ,你那个show方面里面x=2;只是改变了show方法局部变量x的值,并不会影响到mian方法的x值,你打印的依然是mian方法局部变量x的值,所以是4..

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
   public static void show(int x)
        {
                x = 2;
        }
此函数没有返回值,也就是说show方法中的参数x的影响范围仅在show方法之中
int x = 4;
show(x);//调用时,参数x仅在此句产生作用,而x=2;不能改变参数x的值
如果给show返回值,则可以改变
public static int show(int x)
        {
               return x = 2;
        }
接收返回值x = show(x);

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
你的方法参数和你的方法执行有什么关系呢 因为都是void
这个就好比
  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 int show(int x)
  10.         {
  11.                  x=3;
  12.             return x;
  13.         }
  14. }
复制代码

LZ认为这个show里面和X和 主方法的X难道是同一个么 显然不是 既然不是同一个为什么会影响最终打印结果呢
既然x为4 那么打印结果肯定就是4 毫无疑问

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
kira 中级黑马 2014-2-10 16:53:36
7#
本帖最后由 kira 于 2014-2-10 16:55 编辑
郭运川 发表于 2014-2-10 16:41
public static void show(int x)
        {
                x = 2;

那样是改变不了的 除非主方法里
打印  
System.out.println(new Integer(show(x))); 这样可以:)
回复 使用道具 举报
这就要说起生命周期了,

  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只会存活于这个函数内部
  12.                 x = 2;
  13.         }
  14. }
复制代码

你这个并不是修改了原来的变量,而是新建变量,然后赋值,没有意义,如果是C/C++的话,可以使用指针实现,java的话,不是很清楚,你可以百度.

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
这是我画的这道题的内存中的运行形式,希望对你理解有所帮助

QQ截图20140210203242.png (83.83 KB, 下载次数: 26)

QQ截图20140210203242.png

评分

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

查看全部评分

回复 使用道具 举报
class Demo
{
        public static void main(String[] args)
        {
                int x = 4;
                show(x);
                System.out.println(x);
        }
        public static void show(int x)
        {
                x = 2;
        }
}
为什么输出值是4,不是2,求解释?main方法中调用show(x),值传递(即复制一份)4到形参x,main方法中的x值依然为4(原始值)
在show方法中(复制版本)x被赋值为2
show方法结束,局部变量(复制版本)x从栈中消失
执行到main方法打印x,输出结果4
结论:show方法局部变量x的变量作用域仅在其方法体内,随着该方法执行结束,局部变量x消失

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
楼下回答的很详细了    不错
回复 使用道具 举报
因为在你那个show方法里面,没有输出也没有返回,所以主函数就是输出以前的。
回复 使用道具 举报
class Demo
{
         public static void main(String[] args)
         {
                 int x = 4;
                 show(x);
                 System.out.println(x);
         }
         public static void show(int x)
         {
                 x = 2;
         }
}为什么输出值是4,不是2,求解释?
首先,x在main函数中定义的,是全局变量,而且存在于堆内存中。在show方法中,定义了一个局部
变量x并将其赋值为2,存在于栈内存中。调用show方法,只是将main方法中x的副本(复制一份)传递给了show方法。
show方法一结束,栈内存中的x就消失了,对main函数中定义的x没有半点影响。所以最终返回的就是4。

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
这个在C++中很好理解,因为可以从指针的角度去分析。比如:
主函数中的x的地址假设是p1, *p1 就是p1指向的内容,即x;
当你调用函数把x传进去操作时,实际上是重新开辟了一个地址空间,比如p2, 只是*p2即p2指向的值是x;
当你对函数内的x操作时,实际上操作的事*p2,而非主函数内的*p1;两个x只是值相同,而不是同一个地址上的,可以想象成只是两个相同的东西罢了。你把弄坏了,另一个是不变化的。
所以 你在函数内的操作,是不影响主函数的x的。。。
明白了么
回复 使用道具 举报
我觉得虽然JAVA 屏蔽了指针,但是道理应该是一样的
回复 使用道具 举报
  1. <div class="blockcode"><blockquote>public class Test {
  2.         public static void main(String[] args) {
  3.                 int[] arr = {4};
  4.                 show(arr);
  5.                 for(int i = 0; i < arr.length; i++) {
  6.                         System.out.println(arr[i]);
  7.                 }
  8.         }

  9.         public static void show(int arr[]) {
  10.                 arr[0] = 2;
  11.         }
  12. }
复制代码

public static void main(String[] args)
        {
                int x = 4;
                show(x);
                System.out.println(x);
        }
        public static void show(int x)
        {
                x = 2;
        }关于这个问题要首先弄明白什么是值传递、什么是引用传递。那些基础数据类型在方法间进行传递时,只是将这个值的一个副本传给了方法,当这个副本的值发生改变时,不会影响到原来的值。所以在这里打印出来的还是4,不是2。如果这个方法接收的值的类型为引用传递时,将地址传递给了方法,修改的是同一个位置(即同一个值),比如数组,那么它的值会发生改变,例如:
这样写的话,值就会发生改变。如果还不明白的话,继续讨论

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马