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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© kellyzyb 中级黑马   /  2013-10-17 15:51  /  2545 人查看  /  22 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. public class NameClass
  2. {      
  3.         private static int x;      
  4.         public static void main(String[] args)
  5.         {        
  6.                   name(x);         
  7.                 System.out.println(x);     
  8.         }
  9.        
  10.         public static void name(int x)
  11.         {   
  12.       x++;     
  13.     }  
  14. }  
复制代码
为什么结果会是0 不是1呢。

评分

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

查看全部评分

22 个回复

倒序浏览
因为int是基本数据类型,当函数调用传参,int类型的参数,会把自己复制一份作为参数传递给函数,而自己不变。
回复 使用道具 举报
loading……99.9 发表于 2013-10-17 15:58
因为int是基本数据类型,当函数调用传参,int类型的参数,会把自己复制一份作为参数传递给函数,而自己不变 ...

不对吧。
回复 使用道具 举报
x默认的值是0,你的name()方法中先调用了x的值,再将x++,所以得到的值是0,如果想得到1要++x;
就像这个题,你觉得j的值是多少呢{:soso_e113:}

public class Test {

       
        public static void main(String[] args) {
       
                int j = 0;
                for (int i=0;i<100;i++)
                        {
                        j=j++;
                        }
                        System.out.println(j);
               

        }

}

评分

参与人数 1技术分 +1 收起 理由
周志龙 + 1

查看全部评分

回复 使用道具 举报
ㄗ灬Night|K 发表于 2013-10-17 16:01
x默认的值是0,你的name()方法中先调用了x的值,再将x++,所以得到的值是0,如果想得到1要++x;
就像这个 ...

大哥,你连++这个都没理解啊,我这是 x++;又没有赋值,跟前自增和后自增有什么关系。
回复 使用道具 举报
基本数据类型的变量作为实参传入函数,传入的只是一个值,传入后就和原来的变量没关系了,
若是引用类型的变量,就有关系了,因为其中传入的是地址值。
回复 使用道具 举报
道友,一个是静态的x,一个是方法中的int x,是局部x,
两个虽同名,但不是一个东西

评分

参与人数 1技术分 +1 收起 理由
To + 1 赞一个!

查看全部评分

回复 使用道具 举报 1 0
你这样
public static void name(int x)
        {   
      NameClass.x = x+1;     
    }  
应该就ok了,就x=1了
回复 使用道具 举报
斗胆潇洒 发表于 2013-10-17 16:16
你这样
public static void name(int x)
        {   

道友也喜欢看RUNNMAN?
回复 使用道具 举报
本帖最后由 张宏祚 于 2013-10-17 16:29 编辑

大哥!你这个是典型的错误啊!形式参数只在函数里有效!你又没有写return方法!
所以你再name()方法里就算乘以一个亿,根本和方法区里的int x没有半毛钱的关系!!
你可以在main方法里这么写 :

public static void main(String[] args){

     x = name(x);
     System.out.print(x);
}

public static void name(int text){
    return ++text;
}

评分

参与人数 1技术分 +1 收起 理由
To + 1 淡定

查看全部评分

回复 使用道具 举报
...... 中级黑马 2013-10-17 16:30:25
11#
虽然两个变量名称一样,一个是类变量,一个局部变量,name()函数中对x的自增操作只是对局部变量的x的操作,而局部变量x在name()方法结束后,就不存在了,你的输出语句中的x是类变量,而类变量从来没有执行过自增操作,所以输出的事默认初始化值0

评分

参与人数 1技术分 +1 收起 理由
To + 1 赞一个!

查看全部评分

回复 使用道具 举报
朱艳 中级黑马 2013-10-17 16:30:58
12#
亲  你的意思我大概明白了  你通过这段代码最后想输出的是x=1  来验证静态了 就只有一份了对吗?
但是在
  public class NameClass
{      
        private static int x;      
        public static void main(String[] args)
        {        
                  name(x);         
                System.out.println(x);     
        }
        
         public static void name(int x)
         {   
      x++;     
    }  
}  
中成员函数name(int x )  这个函数里最x++动作的x变量是你(int x) 出来的局部变量啊  
亲  它跟  private static int x; 虽然名字相同 但是不是一个变量啊  所以你改变(int x)的值对 private static int x并没有影响 你要是用myeclipse在做的话  小工具会提醒你( int x)这个变量没有用到对不对?

评分

参与人数 1技术分 +1 收起 理由
To + 1 赞一个!

查看全部评分

回复 使用道具 举报
kellyzyb 发表于 2013-10-17 16:07
大哥,你连++这个都没理解啊,我这是 x++;又没有赋值,跟前自增和后自增有什么关系。 ...

新人,理解的太想当然了,抱歉。。。。
回复 使用道具 举报
x作为实参传入name()方法后 在方法里面的操作在操作后对外面的成员变量x没影响,传入的只是成员变量的复制值,即使你把name()方法里面的 x++;代码改为x = x +5;等等也不会对外面的的值有影响里面的是局部变量,方法完了后就不存在了
回复 使用道具 举报
kellyzyb 发表于 2013-10-17 16:20
道友也喜欢看RUNNMAN?

呵呵,认出来了
没办法,我看过最能娱乐的综艺了,
每星期天晚上,坐等中字runningman,
不过不追星,只追节目
回复 使用道具 举报
kellyzyb 发表于 2013-10-17 16:20
道友也喜欢看RUNNMAN?

呵呵,认出来了
没办法,我看过最能娱乐的综艺了,
每星期天晚上,坐等中字runningman,
不过不追星,只追节目
回复 使用道具 举报
晕,网页一卡,就点了两遍
回复 使用道具 举报
显然楼主是要验证static的唯一性,楼主的代码中name方法中x++的x是形参,并不是NameClass类中的成员变量x,要实现楼主的要求可以用下面的代码:
public class NameClass {
         static int x;

        public static void main(String[] args) {
                name(x);
                System.out.println(x);
        }

        public static void name(int y) {
                //y++;
                x++;
        }  

}
Java的虚拟机在找可变参数是有就近原则,只要将形式参数改变一下就可以实现了。
最后希望我的回答帮助到了楼主,楼主在学Java基础时可以将毕向东的视频和马士兵的视频交互着看,马士兵的视频其中的内存分析讲的很透彻

评分

参与人数 1技术分 +1 收起 理由
杨增坤 + 1

查看全部评分

回复 使用道具 举报
朱艳 发表于 2013-10-17 16:30
亲  你的意思我大概明白了  你通过这段代码最后想输出的是x=1  来验证静态了 就只有一份了对吗?
但是在
   ...

成员变量x有用到的,主函数中的“name(x);”和“ System.out.println(x);“这两句中的x都是成员变量,所以就不会有提醒的啊, name(x);这句话在这个程序中只是将成员变量x的值传入name的方法中赋值给形式参数x,然后执行语句x++;x++中的x依然是形式参数,而成员变量x的值始终未变化,仍然是初始化值0,主函数中的 System.out.println(x);语句中的x依然是成员变量x,所以最终结果才会是0。

评分

参与人数 1技术分 +1 收起 理由
周志龙 + 1 赞一个!

查看全部评分

回复 使用道具 举报
public class TTt {

       
                private static int x;      
                public static void main(String[] args)
                {        
                        name(x);     
                            //x++;
                        System.out.println(x);     
                }
                
                public static void name(int x)
                {   
                    x++;   
                }
}

调用name函数你传的是 本类的 静态x,
但是只是把值 传递过去了,
如果你不调用name函数,而直接x++  (如注释所列)
则结果为1

所以主要错误在与: int 类型是值传递。
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马