黑马程序员技术交流社区

标题: 请教:关于关于改变初始化值的问题; [打印本页]

作者: 黑龙江—刘鹏    时间: 2012-7-11 20:45
标题: 请教:关于关于改变初始化值的问题;
本帖最后由 黑龙江—刘鹏 于 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 呢?
是跟数据类型有关?
还是为什么?
作者: 黑马振鹏    时间: 2012-7-11 20:53
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

作者: dev    时间: 2012-7-11 20:54
因为你在show方法中,只是把X+2的值赋给了y
这与x无关,所以x打印的值依然是原来初始化的值,即0。
而且y只是show方法中的局部变量x是主函数中的局部变量,
这两者并没有直接关系。


作者: 全海波    时间: 2012-7-11 21:01
是的,上面很详细了
作者: 黑龙江—刘鹏    时间: 2012-7-11 21:09
翁游龙 发表于 2012-7-11 20:54
因为你在show方法中,只是把X+2的值赋给了y,
这与x无关,所以x打印的值依然是原来初始化的值,即0。
而且y ...

哦        谢谢啦

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

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

作者: 李志群    时间: 2012-7-11 21:53
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, 下载次数: 38)

这是改后的

这是改后的

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

这是楼主的代码

这是楼主的代码

作者: 李志群    时间: 2012-7-11 21:54
希望您能够采纳 求分哦{:soso_e100:}
作者: 李志群    时间: 2012-7-11 21:54
希望您能够采纳 求分哦{:soso_e100:}
作者: 张天天    时间: 2012-7-11 22:00
呵呵,这个与参数的类型是无关的

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

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

在main方法中的x,不会因为另一个与它无关的变量y的值的改变而改变
因为在内存中它们指向的是不同的地址
作者: 李志群    时间: 2012-7-11 22:01
你原代码的那 我貌似分析错了 楼主 show(x);
将x赋值给Y   Y执行了 但是 也你在主函数里面没有储存x的东西 所以show方法执行完后 直接弹栈了 刚才大意了呵呵 不好意思
作者: 陈淑飞    时间: 2012-7-11 22:02
我是版主,我肯定给你加1分,鼓励下。

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

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


哥们,顶你。{:soso_e179:}
作者: 李志群    时间: 2012-7-11 22:02
和我 给你那个示例的差不多 呵呵
作者: 黑龙江—刘鹏    时间: 2012-7-11 22:08
陈淑飞 发表于 2012-7-11 22:02
我是版主,我肯定给你加1分,鼓励下。

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

哈哈{:3_53:}
作者: 朱东方    时间: 2012-7-11 22:37
本帖最后由 朱东方 于 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, 下载次数: 51)

捕获.JPG

作者: 刘笑    时间: 2012-7-12 00:08
李志群 发表于 2012-7-11 21:53
class Demo
{
public static void main(String[] args)

请教一下:第二步中x不应该存放在栈中么?怎么进堆里了呢?堆里不是存放对象和数组么?
作者: 李志群    时间: 2012-7-12 16:55
刘笑 发表于 2012-7-12 00:08
请教一下:第二步中x不应该存放在栈中么?怎么进堆里了呢?堆里不是存放对象和数组么? ...

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

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

完了完了 哥 你把我弄蒙了啊·····:'(   
作者: 刘笑    时间: 2012-7-12 20:09
李志群 发表于 2012-7-12 16:56
完了完了 哥 你把我弄蒙了啊·····

呵呵,我记得变量是存放在栈内存中,数组和对象存放在堆内存中。相互交流,共同进步!
作者: 李志群    时间: 2012-7-12 21:45
刘笑 发表于 2012-7-12 20:09
呵呵,我记得变量是存放在栈内存中,数组和对象存放在堆内存中。相互交流,共同进步! ...

嗯嗯嘿嘿 谢谢
一定 一起加油呼呼 以后有问题 多多指出嘿嘿 我现在 对内存老感兴趣了哈哈 :)就想以后像毕老爷说的那样
去面试 要把面试官 干倒才叫NB哈哈  整猛他哈哈
作者: 刘笑    时间: 2012-7-12 22:46
李志群 发表于 2012-7-12 21:45
嗯嗯嘿嘿 谢谢
一定 一起加油呼呼 以后有问题 多多指出嘿嘿 我现在 对内存老感兴趣了哈哈 就想以后像 ...

哈哈,一定




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2