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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 程媛媛 中级黑马   /  2013-3-19 21:42  /  1512 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 程媛媛 于 2013-3-20 15:23 编辑

public class Demo2 {

        static int j = 20;
        public static void main(String[] args) {
                int i = 10;
                Demo2 d2 = new Demo2();
                d2.method(i);
                System.out.println(i);
                System.out.println(j);
        }
        public void method(int x){
                x = x * 2;
                j = j * 2;
        }

}

打印结果为:
10
40
原因是什么?请高手帮忙解答。

评分

参与人数 1技术分 +1 收起 理由
猫腻 + 1

查看全部评分

7 个回复

倒序浏览
d2.method(i);调用时,i 是局部变量,只在它的方法内有效,它将10传入method方法,x就为20,但i 的值并没变,仍未10,所以结果为10;
j为静态变量,随着类的加载而加载,存在静态方法区,所以,你调用method方法时,j = j * 2;其实可以写成this.j=j*2;给j赋值,那么静态区j=20*2。所以打印结果为40.
希望对你有帮助

评分

参与人数 1技术分 +1 收起 理由
猫腻 + 1

查看全部评分

回复 使用道具 举报
i 是局部变量,只在当前方法内有效,所以i的值不变,

j是静态变量。会随着类的加载而加载。它被声明成静态,存在于静态去内。用方法直接调用可以直接使用,所以j=20*2=40.

评分

参与人数 1技术分 +1 收起 理由
猫腻 + 1

查看全部评分

回复 使用道具 举报
class Demo2 {

        static int j = 20;//这里是静态变量,
        public static void main(String[] args) {
                int i = 10;//这里是局部变量
                Demo2 d2 = new Demo2();//这里创建了一个对象并且调用方法运算
                d2.method(i);//调用方法时程序转入下面,运算结束变量的值已经改变
                System.out.println(i);//此时i为本函数中的10
                System.out.println(j);
        }
        public void method(int x){
                x = x * 2;//x无法接收主函数方法中定义的i,因为i只在主函数中有效
                j = j * 2;//这里j接收到的是上面的20*2=40 此时对象中的j变量是40,j值已经改变
        }

}

评分

参与人数 1技术分 +1 收起 理由
猫腻 + 1

查看全部评分

回复 使用道具 举报
若还有问题,请继续追问;没有的话,请将帖子分类改成【已解决】~
回复 使用道具 举报
局部变量只作用于局部,int i = 10 在局部就直接打出i 的值是10了
回复 使用道具 举报
public class Demo2 {

        static int j = 20;//这个j是类变量 所有对象都共享一份,类变量不在堆内存中,任何一个对象对其修改,j 的值都会变化
        public static void main(String[] args) {
                int i = 10;
                Demo2 d2 = new Demo2();
                d2.method(i);//这个方法只是改变了method方法中局部变量的值
                System.out.println(i); //你打印的是i的值 我估计你是纠结在了为什么打印的不是20   记住方法中你只是传值 就可以了
                System.out.println(j);
        }
        public void method(int x){
                x = x * 2;//这个地方 x是个局部变量,你传进来的只是i得值  x的值是20
                j = j * 2; //在d2这个对象里修改了j的值 所以j的值变成了40
        }

}
回复 使用道具 举报
public class Demo2 {

        static int j = 20;
        public static void main(String[] args) {
                int i = 10;
                Demo2 d2 = new Demo2();
                d2.method(i);
              System.out.println(i);
                System.out.println(j);
        }
        public void method(int x){
                x = x * 2;
                j = j * 2;
        }

}

因为 i 是局部变量,传进method()的 i 只是原来的副本,并且离开method的之后,此副本就被销毁,所以红色部分访问的 i 还是原来的值,i 并未发生改变。!
如果确实需要达到改变i的效果,可以修改method,让它有返回值!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马