首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 问个据说是 华为的面试题 - 将方法的局部变量作为参数传给另一个另一个方法中。。 [已结贴,结贴人:beguile]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • beguile
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 揭贴率:
    发表于:2008-08-22 22:16:41 楼主
    <span style="color: #000000;">
    public class Argument{
    public static void changeStr(int str){
    str = 2;
    }

    public static void changeStr(String str){ 
    str = "name"; 


    public static void main(String[] args) {
    int str = 1;
    changeStr(str);
    System.out.println(str);

    String str2 = null;
    changeStr(str2); 
    System.out.println(str2);
    }
    }
    </span>
    为啥输出是 1 和 null, str str2 却没有改变呢?如何改变它们呢?
    10  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • beguile
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 22:18:411楼 得分:0
    为啥自己写 <span>不能插入代码
    =====================
    Java code
    public class Argument{ public static void changeStr(int str){ str = 2; } public static void changeStr(String str){ str = "name"; } public static void main(String[] args) { int str = 1; changeStr(str); System.out.println(str); String str2 = null; changeStr(str2); System.out.println(str2); } }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • milooxu
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 23:09:312楼 得分:1
    java只有值传递,基本类型传的是值,对象类型传的是地址的拷贝。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • m582445672
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 23:15:133楼 得分:0
    引用 2 楼 milooxu 的回复:
    java只有值传递,基本类型传的是值,对象类型传的是地址的拷贝。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • beguile
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 23:23:154楼 得分:0
    基本类型传的是值。那为什么这个方法 没有改变int str = 1; 的值???

    public static void changeStr(int str){
            str = 2;
        }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • fox000002
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 23:28:315楼 得分:0
    引用 2 楼 milooxu 的回复:
    java只有值传递,基本类型传的是值,对象类型传的是地址的拷贝。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • shadow55
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 23:29:506楼 得分:0
    方法执行的只是变量的一个拷贝
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • fox000002
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 23:32:577楼 得分:0
    lz 好像不明白什么是传值
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wangwenjun69
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 23:54:068楼 得分:0
    局部变量只在自己的作用域中有效,也就是说,在static方法中str=2只是在他的方法中有效,但是在方法体外面是无效的
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lsgsunny
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-23 00:26:249楼 得分:0
    两个方法的str变量不是同一个变量,在内存中是两个变量
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • beguile
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-23 08:51:2710楼 得分:0
    引用 8 楼 wangwenjun69 的回复:
    局部变量只在自己的作用域中有效,也就是说,在static方法中str=2只是在他的方法中有效,但是在方法体外面是无效的

    到目前为止 我觉得这种解释好 那是不是说一个方法不能改变其他方法局部变量的值?

    其他那些说传值怎么怎么样的解释得并不清楚
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hidance
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-23 09:20:3311楼 得分:0
    该回复于2008-08-23 18:34:54被版主删除
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • liujiaqwer
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-23 10:15:4512楼 得分:0
    pass by value
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zishizhilong
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-23 10:29:4413楼 得分:0
    引用 2 楼 milooxu 的回复:
    java只有值传递,基本类型传的是值,对象类型传的是地址的拷贝。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • beguile
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-23 13:06:2414楼 得分:0
    java只有值传递,基本类型传的是值,对象类型传的是地址的拷贝。
    这个答案对吗?我觉得够呛
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • beguile
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-23 16:27:3415楼 得分:0
    ding yi xia
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ZangXT
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-23 17:33:1716楼 得分:0
    没有办法改变。
    java中所有的参数都是pass by value.
    可以通过数组,改变数组的元素来实现,或者提供一个新的类,把你要改变的数据作为这个类的field,通过在方法中修改对象的field来实现。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • still_rain
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-23 17:47:0417楼 得分:0
    Java code
    public static void changeStr(int[] str){ str[0] = 2; } …… int str[] = {1}; changeStr(str); System.out.println(str[0]);

    那个也类似。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zhao_tk
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-23 18:05:5818楼 得分:0
    引用 2 楼 milooxu 的回复:
    java只有值传递,基本类型传的是值,对象类型传的是地址的拷贝。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • AWUSOFT
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-23 18:45:0419楼 得分:1
    首先理解两个东西,一个是实参与形参,另一个就是java的传值问题了.

    实参就是传给方法的变量,而形参就是方式的变量.它们是两个变量.当形参与实参都是基本变量的时候,调用方法时形参与实参的值都是一样的.
    相当于下边的:
    int a=10;
    int b=a;//这里相当于调用方法的时候,b是方式的形参,而a是调用时的实参数.
    b=20;//这样,如果你改变b的值,a的值是不会改变的.也就是题目中的为什么会输出1了.


    第二个String的问题是差不多的.
    String str2=null;
    String  str=str2;//看看形参与实参
    str="abc";//这里改变了形参引用的对象.但没有改变实参的值


    比较下边的了:
    int a[]={0,0,0};
    int b[]=a;//数组对象
    //情况一:
    b=new int[10];//这里改变了b的引用对象,不会改变a

    //情况二
    b[2]=10;//这样没有改变a,但改变了a[2]


    方法调用的时候:

    我(方法)要有一个变量(形参)去接收你的这个对象,我有可以是通过这个变量去而改变你原来的值(数组情况二).有可能我用这个变量去放其它的对象了(数组情况一).我可以放你传过来的,当然也可以重新放其它对象了.


    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • justinavril
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-23 19:05:5620楼 得分:0
    我还是觉得理解成方法的变量  比较好理解
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • gdc19
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-23 20:26:2221楼 得分:0
    java中一般数据类型是值传递,其它类型是将栈中的指针拷贝一份,因此形参和实参实际上都是指向同一对象的两个指针地址。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • beguile
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-23 20:29:2622楼 得分:0
    ding yi xia 再听听其他答案
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • joejoe1991
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-23 20:51:3823楼 得分:0
    方法的参数永远都是复制品。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • SARA520
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-23 22:04:4024楼 得分:1
    打个比方:我有一根烟,我copy了一根给你,你把我给你的那根烟抽了,那我这根烟还在啊,还是不变啊


    public class Argument{
    public static void changeStr(int str){ //形参,这里的str只是值等于main里的那个str(也就是从main里的那个值拷贝过来的),俩个不是同一个变量
    str = 2; //这里的str形参里的那个str,也不是main里的那个.那你说改变这个会改变main里的那个str么???
    }

    public static void changeStr(String str){//同上.只不过这里的str是一个引用变量
    str = "name"; 


    public static void main(String[] args) {
    int str = 1;
    changeStr(str);
    System.out.println(str);

    String str2 = null;
    changeStr(str2); 
    System.out.println(str2);
    }
    }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • beguile
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-23 22:11:5625楼 得分:0
    现在我明白为什么那么多人引用2楼了
    只是传参数值而已,而不是改变那个参数。应该是这样理解吧?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • SARA520
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-23 22:23:5326楼 得分:1
    引用 25 楼 beguile 的回复:
    现在我明白为什么那么多人引用2楼了
    只是传参数值而已,而不是改变那个参数。应该是这样理解吧?


    值类型传递的就是数值
    引用类型传递是也是数值,不过他的值是地址
    你可以通过这个地址(相当于C++中的指针)改变对象的值,但不能改变这个地址


    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • bhl_1986
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-24 00:05:0527楼 得分:0
    又一个值传递问题。。。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xxc3303
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-24 09:30:5728楼 得分:2
    其实不用讲那么复杂
    Java code
    public class Argument{ public static int changeStr(int str){ str = 2; return str; } public static string changeStr(String str){ str = "name"; return str; } public static void main(String[] args) { int str = 1; str = changeStr(str); System.out.println(str); String str2 = null; str2 = changeStr(str2); System.out.println(str2); } }

    这样不就得到想要的效果了么,这样能明白些不,你前面的只不过是给另外一个变量赋值,和你当前的没有关系,输出当前的变量当然还是原来 main里定义的了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yhef
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-24 10:55:3529楼 得分:1
    我觉得28楼的说得很好,
    要得到正确答案就照他做,
    要知道为什么会出现你说的那种结果,那是因为传值和变量作用域的问题。
    修改 删除 举报 引用