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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张文强 中级黑马   /  2012-6-22 22:15  /  2700 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张文强 于 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是什么道理?*/
复制代码

10 个回复

倒序浏览
java 的参数传递方式是传值,你是把 10 这个值传进了method中,而不是i;
x 的作用于仅仅是方法内部

j 是static,静态的,内存只有一份,在方法内对他操作,改变了他的值……

评分

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

查看全部评分

回复 使用道具 举报
本帖最后由 王明明 于 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. }
复制代码

评分

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

查看全部评分

回复 使用道具 举报
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;

                }

                }

评分

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

查看全部评分

回复 使用道具 举报
j声明为static的,在method()中有j=j*2,所以类调用方法以后输出的j为40
i只是作为一个参数值传递到method中并赋值给x;
i属于main函数中的成员变量,根据就近原则,不会再到外部找i的值,所以输出语句中的打印出的i并没有参加运算

评分

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

查看全部评分

回复 使用道具 举报
public void method(int x)

{

        x=x*2;

        j=j*2;

}这里边x只是一个参数,虽说将 i  的值传递给了x,但是当程序执行完毕的时候,x的内存空间被清空,不会留下什么,但是你若是在程序内部输出,x的值就是20,再来说j,j是静态的,也就是类变量,所有成员共享这段内存空间,对它的操作也会改变它的值,所以 j  变成了 40,至于为什么不是20,是因为类变量的空间直到程序退出运行才会释放所占有的内存
回复 使用道具 举报
t.method(i) =t.method(10),你调用的就是10 ,不是i,所以i=i*2没有运算。所以输出的i的值还是10. j是静态直接调用方法算后J=40.
回复 使用道具 举报
吴琼 中级黑马 2012-6-22 23:01:54
8#
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为成员变量,存在于栈内存中,当运算完毕后,数据就释放了.生命周期很短.
回复 使用道具 举报
在java中程序当中的变量分为三种第一种是局部变量,成员变量和静态变量。
局部变量是指某个方法体里面定义了的变量,如你的程序里面的int i ;就是一个局部变量,局部变量的作用域,简单的说就是{}内,出了{},就不可见了。
成员变量是某个对象的某个特性的表现,如Student类String name;因为每一个学生都有他自己的姓名 其作用域要更具其定义变量的访问权限有关。
而静态变量,是指该变量是该类的所有成员共享该数据成员。简单的来说在Student类里要涉及到班费,班费不能是某一个类所特有的,而是所有学生共享该数据。这个时候我们就可以把它定义为static.
除此之外,局部变量是存放在栈里面的,成员变量是存放在堆里面的,而静态变量是存放在data区的。
回复 使用道具 举报
王明明 发表于 2012-6-22 22:32

:handshake
回复 使用道具 举报
吴琼 发表于 2012-6-22 23:01
public class Test {
static int j=20;//j内存在方法区的静态区中.为整个类共享的数据.
public static void ...

:handshake
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马