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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 乔青山 中级黑马   /  2014-2-11 15:05  /  1605 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 乔青山 于 2014-2-11 15:22 编辑

public class Java{
    public static void main(String[] args)
    {
            int b =4;
            changeInt(b);
            System.out.println(b);
    }
    public static int changeInt(int a){
            a =2;
            System.out.println(a);
            return a;
    }
}
为什么changeInt(b)之后输出的是4?
把b传到changeInt方法中之后为什么b的值没改变?

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

12 个回复

倒序浏览
生命周期原因
  1. public class Java{
  2.     public static void main(String[] args)
  3.     {
  4.             int b =4;
  5. //如果这里加上这个
  6.             b = changeInt(b);

  7.             System.out.println(b);
  8.     }
  9.     public static int changeInt(int a){
  10.             a =2; //这里的a只会存活这个函数内部
  11.             System.out.println(a);
  12.             return a;
  13.     }
  14. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
当参数为基础数据类型时:实参传递给形参的是值(包括String类型)形参在函数内值的变化不会影响实参
当参数为对象是:实参传递给形参的是堆栈地址,形参在函数内的修改会影响实参的修改

明白了
回复 使用道具 举报
因为b不是引用类型。
如果想b的值没改变,就的改成  b= changeInt(b);

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
  1. public class Java{
  2.     public static void main(String[] args)
  3.     {
  4.             int b =4;
  5.             b=changeInt(b);
  6.             System.out.println(b);
  7.     }
  8.     public static int changeInt(int a){
  9.             a =2;
  10.             System.out.println(a);
  11.             return a;
  12.     }
  13. }
复制代码

因为你没有接收changeInt方法的返回值,所以打印的依然是main方法的局部变量b的值

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
public class Java{
    public static void main(String[] args)
    {
            int b =4;
            changeInt(b);
            System.out.println(b);
    }   //a是局部变量 即形参  
    public static int changeInt(int a){
            a =2;
            System.out.println(a);
            return a;
        //这里a就被释放了   可以这么理解   没有把changeInt这个方法返回的值付给int类型的变量
    }
}
回复 使用道具 举报
b的数据类型是int,int是基本数据类型,基本数据类型在作为参数传递时是直接把值付给形参a的,所以调用changInt函数后面的运算就跟b没有关系了,b的值也就不会改变。
回复 使用道具 举报
  1. public class Java{
  2.     public static void main(String[] args)
  3.     {
  4.             int b =4;
  5.             changeInt(b);
  6.             System.out.println(b);
  7.     }
  8.     //函数changInt只有传值进来,但是函数内没有接收
  9.     public static int changeInt(int a){
  10.             a =2;
  11.             System.out.println(a);
  12.             return a;
  13.     }
  14. }
复制代码


要想出现你想要的结果,应该这样写代码:


  1. public class Java{
  2.     public static void main(String[] args)
  3.     {
  4.             int b =4;
  5.             changeInt(b);
  6.             System.out.println(b);
  7.     }
  8.     public static int changeInt(int a){
  9.             //定义一个局部变量(别忘了初始化,即局部变量在使用之前应该先赋值),用于接收传进来的值。
  10.             int a=0;
  11.             this.a =a;
  12.             System.out.println(a);
  13.             return a;
  14.     }
  15. }
复制代码
回复 使用道具 举报
本帖最后由 乔青山 于 2014-2-12 22:55 编辑
范晓冲 发表于 2014-2-12 21:53
要想出现你想要的结果,应该这样写代码:

你试了么,我试了是不可以的。
方法还是要b=changeInt(b);
两个小错误:第一个是局部变量和形参重复了。
第二个是静态方法中不能调用this。

我给改了一下
    public static void main(String[] args)
    {
            int b =4;
            new ActualFormalParameter().changeInt(b);
            System.out.println(b);
            b = new ActualFormalParameter().changeInt(b);                        //把改变后的形参的值赋值给b,不赋值b的值仍不改变(没有引用传递,只有值传递)
            System.out.println(b);                        
    }
    int a = 2;
    public /*static*/ int changeInt(int a){
            this.a = a;
//            a = this.a;
            System.out.println(a);
            return a;                                                }


这样:
输出的仍然是4,因为只是形参变了,并没有把改变的值赋值给b(个人理解),所以只有b=.....changeInt(b);了,b的值才会真正改变


回复 使用道具 举报
我是新人啊··看的有点晕  能不能把你这个代码想要达到的效果和想法写一下这样可能更好点···个人意见
回复 使用道具 举报
丁香花 发表于 2014-2-14 11:01
我是新人啊··看的有点晕  能不能把你这个代码想要达到的效果和想法写一下这样可能更好点···个人意见 ...

唔。。。哪一段?
一楼的那一段代码啊?
回复 使用道具 举报
学习了 这些问题我竟然都没注意 让说的时候还真说不出来。。
回复 使用道具 举报
乔青山 发表于 2014-2-14 12:46
唔。。。哪一段?
一楼的那一段代码啊?

恩   我觉得最好写上代码想体现出的效果和想问的问题  这样我们这些刚学的也能学习下要不然你只写代码我们都不好理解
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马