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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 黑龙江—刘鹏 于 2012-7-11 21:10 编辑

class Demo
{
public static void main(String[] args)
{
  int x  =0;
      
  show(x);
  System.out.println(x);
  
}
public static void show(int y)
{
  y= y +2 ;
}
}
为什么输出结果是  x = 0 呢?
是跟数据类型有关?
还是为什么?

21 个回复

倒序浏览
public class Demo {

                public static void main(String[] args)
                {
                  int x  =0;
                     
                  show(x);
                  System.out.println(x);
                  
                }
               
                public static void show(int y)
                {
                  y= y +2 ;
                  System.out.println("show():"+y);                }
}

输出:
show():2
0
回复 使用道具 举报
因为你在show方法中,只是把X+2的值赋给了y
这与x无关,所以x打印的值依然是原来初始化的值,即0。
而且y只是show方法中的局部变量x是主函数中的局部变量,
这两者并没有直接关系。

回复 使用道具 举报
是的,上面很详细了
回复 使用道具 举报
翁游龙 发表于 2012-7-11 20:54
因为你在show方法中,只是把X+2的值赋给了y,
这与x无关,所以x打印的值依然是原来初始化的值,即0。
而且y ...

哦        谢谢啦
回复 使用道具 举报
这个问题其实就是参数传递的问题,关于参数传递,具体分析如下:
参数传递主要分为:值传递和引用传递。
1.按值传递
  适用范围:8种基本数据类型、String对象
  特点:在内存中复制一份数据,把复制后的数据传递到方法内部
  作用:在方法内部改变参数的值,外部数据不会跟着发生改变
  2.按址传递
  适用范围:数组、除String以外的其他所有类型的对象
  特点:将对象的地址传递到方法内部
  作用:在方法内部修改对象的内容,外部数据也会跟着发生改变

在这个程序中,x是一个整型变量,当被传递进方法体时,只是相当于在堆内存中把x有复制了一份,在方法中改变的是x的复制体,
而x本身并没有发生过改变,这就是最终打印出x=0的原因。

评分

参与人数 1技术分 +1 收起 理由
黑马张扬 + 1

查看全部评分

回复 使用道具 举报
class Demo
{
public static void main(String[] args)
{
   int x  =0;
      
   show(x);
   System.out.println(x);
   
}
public static void show(int x)
{
  x= x +2 ;
}
}楼主不知道你的结果是什么 我又给你添个程序帮你分析了 希望能明白

你原来代码的:也有分析图class Demo
{
public static void main(String[] args)
{
   int x  =0;
      
   show(x);
   System.out.println(x);
   
}
public static void show(int y)
{
   y= y +2 ;
}
}

2222.png (39.83 KB, 下载次数: 37)

这是改后的

这是改后的

01.png (40.67 KB, 下载次数: 43)

这是楼主的代码

这是楼主的代码

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
希望您能够采纳 求分哦{:soso_e100:}
回复 使用道具 举报
希望您能够采纳 求分哦{:soso_e100:}
回复 使用道具 举报
呵呵,这个与参数的类型是无关的

你在main方法中定义的x与在show方法中定义的y是两个变量,
而且这两个变量只限在本方法中使用。

原因是几乎所有语言执行方法时都是以压栈、出栈的方式来执行的,
因此在show方法中对变量y的值的操作会在show方法执行完后自动释放掉
也就是出栈了

在main方法中的x,不会因为另一个与它无关的变量y的值的改变而改变
因为在内存中它们指向的是不同的地址
回复 使用道具 举报
你原代码的那 我貌似分析错了 楼主 show(x);
将x赋值给Y   Y执行了 但是 也你在主函数里面没有储存x的东西 所以show方法执行完后 直接弹栈了 刚才大意了呵呵 不好意思
回复 使用道具 举报
我是版主,我肯定给你加1分,鼓励下。

虽然这个问题,不是什么技术题了。

但你这认真的态度,让人敬服。


哥们,顶你。{:soso_e179:}
回复 使用道具 举报
和我 给你那个示例的差不多 呵呵
回复 使用道具 举报
陈淑飞 发表于 2012-7-11 22:02
我是版主,我肯定给你加1分,鼓励下。

虽然这个问题,不是什么技术题了。

哈哈{:3_53:}
回复 使用道具 举报
本帖最后由 朱东方 于 2012-7-11 23:09 编辑

class Demo
{
public static void main(String[] args)
{
   int x  =0;
      
   show(x);
   System.out.println(x);
   
}
public static void show(int y)  //这里考的是和数组的区别,基本类型传递没有任何指向,show()函数结束,都将消失。
{
   y= y +2 ;
}
}


捕获.JPG (46.41 KB, 下载次数: 49)

捕获.JPG

评分

参与人数 1技术分 +1 收起 理由
刘笑 + 1 赞一个!

查看全部评分

回复 使用道具 举报
李志群 发表于 2012-7-11 21:53
class Demo
{
public static void main(String[] args)

请教一下:第二步中x不应该存放在栈中么?怎么进堆里了呢?堆里不是存放对象和数组么?
回复 使用道具 举报
刘笑 发表于 2012-7-12 00:08
请教一下:第二步中x不应该存放在栈中么?怎么进堆里了呢?堆里不是存放对象和数组么? ...

放了啊 我没写哦 呵呵忘记了 因为show得到了main的地址值哦  show的那个好像没有指向堆啊 可能我画错了 不知道我分析的对不啊  请教老黑马照顾下嘿嘿  我也是新学的 因为今天刚学这个 也有点模模糊糊呵呵:L·
回复 使用道具 举报
刘笑 发表于 2012-7-12 00:08
请教一下:第二步中x不应该存放在栈中么?怎么进堆里了呢?堆里不是存放对象和数组么? ...

放了啊 我没写哦 呵呵忘记了 因为show得到了main的地址值哦  show的那个好像没有指向堆啊 可能我画错了 不知道我分析的对不啊  请教老黑马照顾下嘿嘿  我也是新学的 因为今天刚学这个 也有点模模糊糊呵呵:L·
回复 使用道具 举报
刘笑 发表于 2012-7-12 00:08
请教一下:第二步中x不应该存放在栈中么?怎么进堆里了呢?堆里不是存放对象和数组么? ...

完了完了 哥 你把我弄蒙了啊·····:'(   
回复 使用道具 举报
李志群 发表于 2012-7-12 16:56
完了完了 哥 你把我弄蒙了啊·····

呵呵,我记得变量是存放在栈内存中,数组和对象存放在堆内存中。相互交流,共同进步!
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马