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

© hg3093483 中级黑马   /  2013-3-30 20:55  /  2127 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 hg3093483 于 2013-3-31 19:58 编辑

public static void main(String[] args){
    int a=4,b=5;
    change(a,b);
    System.out.println(“a=”+a+”,b=”+b);
}
public static void change(int a,int b){
    b+=a;
    a++;
System.out.println(“a=”+a+”,b=”+b);
}

我的结果是a=5,b=9

a=4,b=5        为什么是这样

评分

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

查看全部评分

7 个回复

倒序浏览
因为chang()方法中的a,b.只在chang(){}这个方法区域类有效,而上主函数中的a,b只在主函数有效.就像成员变量在整个类中有效,而局部变量只在局部方法中有效.而这里的main()也是一个方法,与chang()是同级的

评分

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

查看全部评分

回复 使用道具 举报
作用域的问题,你把public static void change(int a,int b)里面的ab换成xy,可能就好理解了,这里面的ab和和主函数打印语句的ab不是一个a,b

你的代码我没有看明白,你的change()函数里面有打印语句吗?如果有,那应该是打印两行,肯定是第一行a=5,b=9,第二行是a=4,b=5

评分

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

查看全部评分

回复 使用道具 举报
第一个很好理解,
第二个因为main函数中将a,b传了进去,a,b在全局中还是没有发生改变,输出当然还是4 ,5了

评分

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

查看全部评分

回复 使用道具 举报
本帖最后由 袁梦希 于 2013-3-30 22:36 编辑

其实你这问题问的挺好,这是关于值传递和引用(数组)传递的问题    我话个图给你解释一下吧



这是一个堆内存,当我们声明了a和b都在main方法中,当你调用chenge方法的时候,a和b的值的传递进入了change方法中
这时候无论在change方法中怎样操作变量,当chenge方法执行完毕,chenge方法的这个空间就会消失,所以main()如果输出了还是原来
在main方法中声明的值,这是值传递,对象传递我就不解释了,可以加我好友慢慢探讨。
回复 使用道具 举报
我想楼主想要得到的结果是一样的话,则可以进行这样修改;
  1. package com.ctj.www;

  2. public class Democ {
  3.         public static void main(String[] args) {
  4.                 int a=4,b=5;
  5.                 //change(a,b);
  6.                 System.out.println(change(a,b));
  7.                 //System.out.println("a="+a+",b="+b);
  8.         }
  9.         public static String change(int a,int b){
  10.                 b+=a;
  11.                 a++;
  12.                 System.out.println("a="+a+",b="+b);
  13.                 return "a="+a+",b="+b;
  14.                 //System.out.println("a="+a+",b="+b);
  15.         }
  16. }
复制代码
回复 使用道具 举报
这个问题很经典呀 当初我学习java值的传递的时候也弄不明白

说一下啊我的理解吧 希望对你有所帮助

在你的主方法中把a和b传给change(),a和b的传递实际上是个拷贝的过程,叫什么按什么传递来着,好像。。反正理解成拷贝就行了

就是说,chang()方法的参数,形式参数有它自己的内存空间  。。 跟主方法不一起的 主方法里的a和b还是原来的a和b  拷贝到change方法里的“a和b的副本”在形参内存空间里完成了改变。

在main方法里,调用完change后,就调用完了。。。。a和b还是a和b

不知道你明白了么 我说的不是很好 哈哈
回复 使用道具 举报
楼主想要的结果是输出a=5,b=4吧?
一般而言我们都会用第三方变量来存储变量用来交换。即int temp =a;a=b;b=temp;
这个时候打印输出的a就是5,而b是4.
但是使用没有返回值的change方法就无法得到这个结果了,因为int是基础数据类型,传递进change方法的只是指值而不是引用。change方法交换后没有返回值,传入的a和b的值作用域仅仅是change方法本身,change方法执行结束,局部变量a和b的生命周期就结束了。在调用的方法中打印结果也只能是原本的a=4,b=5;
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马