黑马程序员技术交流社区

标题: 关于静态变量和局部变量的问题? [打印本页]

作者: 程媛媛    时间: 2013-3-19 21:42
标题: 关于静态变量和局部变量的问题?
本帖最后由 程媛媛 于 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
原因是什么?请高手帮忙解答。
作者: 杨博    时间: 2013-3-19 21:49
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.
希望对你有帮助


作者: lxww    时间: 2013-3-19 21:54
i 是局部变量,只在当前方法内有效,所以i的值不变,

j是静态变量。会随着类的加载而加载。它被声明成静态,存在于静态去内。用方法直接调用可以直接使用,所以j=20*2=40.
作者: 全超    时间: 2013-3-19 22:19
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值已经改变
        }

}
作者: 陈丽莉    时间: 2013-3-20 04:00
若还有问题,请继续追问;没有的话,请将帖子分类改成【已解决】~
作者: 梁志兵    时间: 2013-3-20 09:58
局部变量只作用于局部,int i = 10 在局部就直接打出i 的值是10了
作者: 我手心里的宝    时间: 2013-3-20 10:08
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
        }

}
作者: 江公亮    时间: 2013-3-20 10:39
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,让它有返回值!





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