黑马程序员技术交流社区

标题: 有关静态的小程序的疑问 [打印本页]

作者: 张文强    时间: 2012-6-22 22:15
标题: 有关静态的小程序的疑问
本帖最后由 张文强 于 2012-6-23 08:16 编辑
  1. public class Test {
  2. static int j=20;
  3. public static void main(String[] args) {
  4. int i=10;

  5. Test t=new Test();
  6. t.method(i);
  7. System.out.println(i);
  8. System.out.println(j);
  9. }
  10. public void method(int x)
  11. {
  12.         x=x*2;
  13.         j=j*2;
  14. }
  15. }
  16. /*帮忙分析下为什么结果为I=10,J=40,
  17. I的值是参与了运算没有返回结果?
  18. J是什么道理?*/
复制代码

作者: 丁二跃    时间: 2012-6-22 22:22
java 的参数传递方式是传值,你是把 10 这个值传进了method中,而不是i;
x 的作用于仅仅是方法内部

j 是static,静态的,内存只有一份,在方法内对他操作,改变了他的值……
作者: 王明明    时间: 2012-6-22 22:32
本帖最后由 王明明 于 2012-6-22 22:39 编辑
  1. public class zifu {
  2. static int j=20;
  3. public static void main(String[] args) {
  4. int i=10;

  5. zifu t=new zifu();
  6. t.method(i);
  7. System.out.println(i);//所以这里才会输出10 因为函数调用结束了
  8. System.out.println(j);//这里会是40
  9. }
  10. public void method(int i)
  11.         i=i*2; //这里并没有返回I的值 因为函数调用就结束了 i的值也跟着结束了 只作用于调用函数的时候才有效
  12.         j=j*2; //J 是静态的 具有全局的作用域 可以直接调用 并且会改变J的值
  13.                 System.out.println(i);//要输出I的值 只能是在函数内部输出
  14. }
  15. }
复制代码

作者: 张华廷    时间: 2012-6-22 22:36
public class Test1 {

        static int j=20;

                public static void main(String[] args) {

              int i=10;
             
              Test1 t=new Test1();

              t.method(i);

              System.out.println("i="+i);//i的值传参后没有改变,因此输出还是10;

                  System.out.println("j="+j);//定义静态j的值,在方法method传参i后输出后改变

                }

                public void method(int x)

                {

                        x=x*2;

                      j=j*2;

                }

                }


作者: 柯玲    时间: 2012-6-22 22:41
j声明为static的,在method()中有j=j*2,所以类调用方法以后输出的j为40
i只是作为一个参数值传递到method中并赋值给x;
i属于main函数中的成员变量,根据就近原则,不会再到外部找i的值,所以输出语句中的打印出的i并没有参加运算
作者: 李文龙    时间: 2012-6-22 22:46
public void method(int x)

{

        x=x*2;

        j=j*2;

}这里边x只是一个参数,虽说将 i  的值传递给了x,但是当程序执行完毕的时候,x的内存空间被清空,不会留下什么,但是你若是在程序内部输出,x的值就是20,再来说j,j是静态的,也就是类变量,所有成员共享这段内存空间,对它的操作也会改变它的值,所以 j  变成了 40,至于为什么不是20,是因为类变量的空间直到程序退出运行才会释放所占有的内存
作者: 挥手遗忘    时间: 2012-6-22 22:54
t.method(i) =t.method(10),你调用的就是10 ,不是i,所以i=i*2没有运算。所以输出的i的值还是10. j是静态直接调用方法算后J=40.
作者: 吴琼    时间: 2012-6-22 23:01
public class Test {
static int j=20;//j内存在方法区的静态区中.为整个类共享的数据.
public static void main(String[] args) {
int i=10;//\栈内存中,生命周期短.
Test t=new Test();
t.method(i);
System.out.println(i);
System.out.println(j);
}
public void method(int x)
{
        x=x*2;//改变了i的值,只在当前的代码块中有效.
        j=j*2;//改变了j的值,但j是静态的.全局共享.
System.out.println("x"+=x);//这里的值才为运算完的值.
}
}
这个问题我想你应该学习下不同变量的内存分布问题.j为静态的,存在于方法区里的静态区中.生命周期很长.
                                                                                 i为成员变量,存在于栈内存中,当运算完毕后,数据就释放了.生命周期很短.

作者: 谭立文    时间: 2012-6-22 23:37
在java中程序当中的变量分为三种第一种是局部变量,成员变量和静态变量。
局部变量是指某个方法体里面定义了的变量,如你的程序里面的int i ;就是一个局部变量,局部变量的作用域,简单的说就是{}内,出了{},就不可见了。
成员变量是某个对象的某个特性的表现,如Student类String name;因为每一个学生都有他自己的姓名 其作用域要更具其定义变量的访问权限有关。
而静态变量,是指该变量是该类的所有成员共享该数据成员。简单的来说在Student类里要涉及到班费,班费不能是某一个类所特有的,而是所有学生共享该数据。这个时候我们就可以把它定义为static.
除此之外,局部变量是存放在栈里面的,成员变量是存放在堆里面的,而静态变量是存放在data区的。

作者: 张文强    时间: 2012-6-23 08:12
王明明 发表于 2012-6-22 22:32

:handshake
作者: 张文强    时间: 2012-6-23 08:13
吴琼 发表于 2012-6-22 23:01
public class Test {
static int j=20;//j内存在方法区的静态区中.为整个类共享的数据.
public static void ...

:handshake




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