黑马程序员技术交流社区

标题: static问题 [打印本页]

作者: kellyzyb    时间: 2013-10-17 15:51
标题: static问题
  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呢。
作者: loading……99.9    时间: 2013-10-17 15:58
因为int是基本数据类型,当函数调用传参,int类型的参数,会把自己复制一份作为参数传递给函数,而自己不变。
作者: kellyzyb    时间: 2013-10-17 16:01
loading……99.9 发表于 2013-10-17 15:58
因为int是基本数据类型,当函数调用传参,int类型的参数,会把自己复制一份作为参数传递给函数,而自己不变 ...

不对吧。
作者: ㄗ灬Night|K    时间: 2013-10-17 16:01
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);
               

        }

}

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

大哥,你连++这个都没理解啊,我这是 x++;又没有赋值,跟前自增和后自增有什么关系。
作者: 飘落    时间: 2013-10-17 16:11
基本数据类型的变量作为实参传入函数,传入的只是一个值,传入后就和原来的变量没关系了,
若是引用类型的变量,就有关系了,因为其中传入的是地址值。
作者: 斗胆潇洒    时间: 2013-10-17 16:12
道友,一个是静态的x,一个是方法中的int x,是局部x,
两个虽同名,但不是一个东西
作者: 斗胆潇洒    时间: 2013-10-17 16:16
你这样
public static void name(int x)
        {   
      NameClass.x = x+1;     
    }  
应该就ok了,就x=1了
作者: kellyzyb    时间: 2013-10-17 16:20
斗胆潇洒 发表于 2013-10-17 16:16
你这样
public static void name(int x)
        {   

道友也喜欢看RUNNMAN?
作者: 张宏祚    时间: 2013-10-17 16:28
本帖最后由 张宏祚 于 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;
}

作者: ......    时间: 2013-10-17 16:30
虽然两个变量名称一样,一个是类变量,一个局部变量,name()函数中对x的自增操作只是对局部变量的x的操作,而局部变量x在name()方法结束后,就不存在了,你的输出语句中的x是类变量,而类变量从来没有执行过自增操作,所以输出的事默认初始化值0
作者: 朱艳    时间: 2013-10-17 16:30
亲  你的意思我大概明白了  你通过这段代码最后想输出的是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)这个变量没有用到对不对?

作者: ㄗ灬Night|K    时间: 2013-10-17 16:42
kellyzyb 发表于 2013-10-17 16:07
大哥,你连++这个都没理解啊,我这是 x++;又没有赋值,跟前自增和后自增有什么关系。 ...

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

呵呵,认出来了
没办法,我看过最能娱乐的综艺了,
每星期天晚上,坐等中字runningman,
不过不追星,只追节目

作者: 斗胆潇洒    时间: 2013-10-17 17:02
kellyzyb 发表于 2013-10-17 16:20
道友也喜欢看RUNNMAN?

呵呵,认出来了
没办法,我看过最能娱乐的综艺了,
每星期天晚上,坐等中字runningman,
不过不追星,只追节目

作者: 斗胆潇洒    时间: 2013-10-17 17:13
晕,网页一卡,就点了两遍
作者: aion2013tian    时间: 2013-10-18 18:12
显然楼主是要验证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基础时可以将毕向东的视频和马士兵的视频交互着看,马士兵的视频其中的内存分析讲的很透彻
作者: aion2013tian    时间: 2013-10-18 18:27
朱艳 发表于 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。
作者: 上篮高手    时间: 2013-10-18 19:15
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 类型是值传递。
作者: 周学彬    时间: 2013-10-18 20:24
8楼和18楼的解答都很有趣啊!

向java中函数传递基本数据类型时,函数是按照传值方式调用的。即传递给该函数的,不是原本内存中的变量,而是该变量的一个引用,函数对于该内存位置的变量没有任何操作。
在C和C++语言中如果要达到该函数的目的,可以向该函数传递一个变量的指针,然后由指针直接操作内存,更改变量的值。C/C++中经典的例子就是交换两个变量的值,谷歌一下就能发现很多。
java没有指针,要完成楼主的意图,8楼和18楼的答案都可以。
作者: 毋须繁华    时间: 2013-10-19 10:43
张宏祚 发表于 2013-10-17 16:28
大哥!你这个是典型的错误啊!形式参数只在函数里有效!你又没有写return方法!
所以你再name()方法里就算 ...

void 无返回值你返回一个int ?……
作者: 毋须繁华    时间: 2013-10-19 10:47
在方法中,基本数据类型和String 传递的是值,而对象传递的是引用地址值,

方法内部对传入的值进行操作,不会对原来的变量有任何的更改
作者: 周志龙    时间: 2013-10-19 18:22

如果楼主已经解惑,请将帖子改为提问结束




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2