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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 马嘉 于 2014-11-12 08:39 编辑

主函数就不写了

int x=7;
show(x)//调用show方法对x重新赋值
System out println(x);//打印x的值


这是show方法
void show(int x){
  x=3;
}


为什么对x从新赋值了,但是打印的还是7这个值呀
很疑惑,求大神指点

评分

参与人数 1技术分 +1 收起 理由
格子、 + 1 淡定

查看全部评分

19 个回复

倒序浏览
我自己顶一下
回复 使用道具 举报
同求 希望有大大解答 我试了很多种情况 只能够说 show()方法 并没有能够
将 x 的值保存下来,哪怕我在主函数外面 将 x 定义为 static 也不行 ,
  1. public class ShowX
  2. {
  3.         public static void main(String[] args)
  4.         {       
  5.                 int x = 1;
  6.                 show(x);
  7.                 System.out.println(x);
  8.         }
  9.        
  10.         public static void show(int x)
  11.         {
  12.                 x = 3;
  13.         }
  14. }

  15. 结果为 1
复制代码
回复 使用道具 举报
1)首先你要明白,show()方法中的定义的x是局部变量,只在局部代码块中有效,而int x=7定义的是成员变量,整个类都可以访问。
2)你的程序中,int x=3是局部变量,在局部代码块外是无效的,最后打印的当然是成员变量了。你需要把3这个值传给成员变量才行,可以改为如下:
void show(int x)
{
this.x=x;
}

评分

参与人数 1技术分 +1 收起 理由
格子、 + 1 很给力!

查看全部评分

回复 使用道具 举报
  楼上讲的很好。。
回复 使用道具 举报
不系之舟王 来自手机 中级黑马 2014-9-20 19:59:12
地板
顺带this也明白了
回复 使用道具 举报
LFW 中级黑马 2014-9-20 20:53:16
7#
void show(int x){   x=3;System out println(x);System out println(this.x); }你去看看。
回复 使用道具 举报
想要传递值的话 搞一个构造方法啊
你这样传递只会传递到内存里 方法执行完 就被垃圾回收器干掉了
回复 使用道具 举报
雨下阳光 发表于 2014-9-20 16:57
1)首先你要明白,show()方法中的定义的x是局部变量,只在局部代码块中有效,而int x=7定义的是成员变量, ...

你讲错了吧.他讲的没写主方法, x是在主方法里面定义的,依然是局部变量,这里的问题不是成员变量和局部变量的问题,而是在方法中参数对于基本数据类型的传递是按照值传递的,也就是在方法里面复制了一份和原来一样的值,和原来的变量没有关系.如果变量是引用数据类型的变量,方法调用就是按照地址传递的,在方法里改变变量的值,原来变量也会随着改变
  1. public class Test {

  2.         public static void main(String[] args) {
  3.                 //参数的按照值传递
  4.                 int x=7;
  5.                 show(x);                                                //调用show方法对x重新赋值
  6.                 System.out.println(x);//打印x的值
  7.                 //参数的按照引用传递
  8.                 int[] arr=new int[3];
  9.                 arr[0]=3;
  10.                 arr[1]=3;
  11.                 arr[2]=3;
  12.                 show(arr);
  13.                 System.out.println(arr[0]);
  14.                 System.out.println(arr[1]);
  15.                 System.out.println(arr[2]);
  16.                                

  17.         }
  18.         private static void show(int[] arr) {
  19.                 arr[0]=5;
  20.                 arr[1]=5;
  21.                 arr[2]=5;
  22.         }

  23.         public static void show(int x){
  24.                 x=3;
  25. //                this.x=3;   按照你说的这样编译都报错
  26.         }

  27. }
复制代码
回复 使用道具 举报
犹豫铅笔 来自手机 中级黑马 2014-9-20 23:42:23
10#
楼上正解
回复 使用道具 举报
show(x);

                System.out.println(x);
好像是两个独立的代码  之间没有什么关系吧 都是在用变量 又没建立对象
回复 使用道具 举报
public class love

{

        public static void main(String[] args)

        {        

                int x = 1;

               x=show(x);

                System.out.println(x);

     }

        

       public static int show(int x)

        {

            return  x = 3;
                       

       }

}

这样写就哦了
回复 使用道具 举报
Fightin黑马 发表于 2014-9-20 23:19
你讲错了吧.他讲的没写主方法, x是在主方法里面定义的,依然是局部变量,这里的问题不是成员变量和局部变量 ...

额。囧,你是对的,都是局部变量
回复 使用道具 举报
路过看看
回复 使用道具 举报
楼主把show方法体力的x改成y就能看清楚了
回复 使用道具 举报
雨下阳光 发表于 2014-9-20 16:57
1)首先你要明白,show()方法中的定义的x是局部变量,只在局部代码块中有效,而int x=7定义的是成员变量, ...

我写了主函数,这样写会报错的
回复 使用道具 举报
Fightin黑马 发表于 2014-9-20 23:19
你讲错了吧.他讲的没写主方法, x是在主方法里面定义的,依然是局部变量,这里的问题不是成员变量和局部变量 ...

你的意思是,show方法,对基本数据类型进行操作时,并不是对他赋值动作。是这样吗,我还是不太理解,能在给我介绍一下吗,那么在对象中set方法,怎么解释呢,不好意,我也才,谢谢你
回复 使用道具 举报
马嘉 发表于 2014-9-21 08:20
你的意思是,show方法,对基本数据类型进行操作时,并不是对他赋值动作。是这样吗,我还是不太理解,能在 ...

他的意思就是,你主函数里的x里面的值被复制出来,给了show()方法的形式参数x,这个时候你在show()方法里面无论对x怎么操作,都是操作的形式参数x,不影响主函数里面的x的。也就是他说的,按值传递。而如果是引用型变量,是把引用里面的地址值传过去了,他俩就指向了同一个对象,所以你改变的是堆内存中那个对象里面的数据。你再用前面的引用当然就是被改变过的方法喽。
对象的set方法,那个改变的是类的成员变量了吧,跟这个不是一码事了。成员变量在整个类中都有效。你注意到,你写set方法的时候,你的参数列表是空的啊,没传,直接用的,直接给成员变量赋值。所以不涉及到参数传递的问题。
回复 使用道具 举报
陈兆辉 发表于 2014-9-21 11:02
他的意思就是,你主函数里的x里面的值被复制出来,给了show()方法的形式参数x,这个时候你在show()方法里 ...

谢谢你,突然豁然开朗,说的太好了
回复 使用道具 举报
亲友卷到手,120黑马币没有了,坑呢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马