黑马程序员技术交流社区

标题: 如何来分析这段代码 [打印本页]

作者: idream    时间: 2014-4-20 21:58
标题: 如何来分析这段代码
本帖最后由 idream 于 2014-4-20 22:59 编辑

public class Demo {
        int x;
        public static void main(String[] args) {
                Demo d = new Demo();
                d.x = 5;
                change(d);
                System.out.println(d.x);
               
        }
        
        public static void change(Demo d) {
                d.x = 3;
        }
}


作者: anqi    时间: 2014-4-20 22:08
本帖最后由 anqi 于 2014-4-20 22:10 编辑

  1. public class Demo {
  2.         int x;//x为成员变量
  3.         public static void main(String[] args) {
  4.                 Demo d = new Demo();//建立对象的时候会x默认初始化为0
  5.                 d.x = 5; //x赋值为5
  6.                 change(d);//调用方法
  7.                 System.out.println(d.x); 打印d对象的x值为3
  8.                
  9.         }
  10.         
  11.         public static void change(Demo d) {
  12.                 d.x = 3;//这个方法会吧d对象的x值赋为3
  13.         }
  14. }
复制代码

作者: idream    时间: 2014-4-20 22:12
anqi 发表于 2014-4-20 22:08

详细,很好,了解啦
作者: 程序爱好者    时间: 2014-4-20 22:13
  所以结果是3
作者: 程序爱好者    时间: 2014-4-20 22:15
看图执行顺序

4.jpg (112.36 KB, 下载次数: 58)

所以结果是3

所以结果是3

作者: 爱翚    时间: 2014-4-20 22:26
因为X在这个类中是成员变量,作用范围是全局的,所以任何一步赋值操作都会对其有影响,而且X永远都是当前值。
所以这段程序无论如何写,打印出来的都是X最后一次被赋予的值,也就是3。
作者: 陨落″烟雨。    时间: 2014-4-20 22:39
局部变量、成员变量(又分静态和非静态),非静态的成员变量最好叫实例变量,静态的最好叫类变量
作者: 陨落″烟雨。    时间: 2014-4-20 22:41
局部变量、成员变量(又分静态和非静态),非静态的成员变量最好叫实例变量,静态的最好叫类变量。
实例变量是对象创建的时候才会存在,而类变量在类加载的时候就会存在。弄懂这些原理需要多画画图


作者: 宋大龙    时间: 2014-4-20 22:46
1楼正解:lol
作者: idream    时间: 2014-4-20 22:47
程序爱好者 发表于 2014-4-20 22:15
看图执行顺序

有图有真相
作者: 错过了今天    时间: 2014-4-20 22:50
爱翚 发表于 2014-4-20 22:26
因为X在这个类中是成员变量,作用范围是全局的,所以任何一步赋值操作都会对其有影响,而且X永远都是当前值 ...

如果change里面传得不是对象的引用 , 而是普通变量呢?结果呢?

作者: 四川男人    时间: 2014-4-20 22:52

public class Demo {
         int x;
         public static void main(String[] args) {
                 Demo d = new Demo();
                 d.x = 5;           //通过对象初始化非静态成员变量
                 change(d);          //静态方法中传对象改变非静态成员变量的值,而非静态成员变量是封装在对象中的,在内存的堆内存中,
                                           //对象是属于引用对象,通过在堆内存中的地址能够改变值的,所以最后输出的是3
                System.out.println(d.x);
                 
         }
         
         public static void change(Demo d) {
                 d.x = 3;
         }
}

首先来分析:Demo中有两个静态方法,一个非静态成员变量。
然后:  我们看到有静态方法调用成员变量(非静态),静态方法只能调用静态成员变量,所以这里需要用到对象
然后:  main程序入口处,创建了一个当前类的对象,请看上面:


作者: 错过了今天    时间: 2014-4-20 23:03
程序爱好者 发表于 2014-4-20 22:15
看图执行顺序

怎么样才可以上传图片呢?
作者: 程序爱好者    时间: 2014-4-20 23:16
错过了今天 发表于 2014-4-20 23:03
怎么样才可以上传图片呢?

你看图片看能不能理解

6.jpg (39.76 KB, 下载次数: 56)

6.jpg

7.jpg (72.71 KB, 下载次数: 61)

7.jpg

8.jpg (41.87 KB, 下载次数: 60)

8.jpg

作者: 爱翚    时间: 2014-4-20 23:16
错过了今天 发表于 2014-4-20 22:50
如果change里面传得不是对象的引用 , 而是普通变量呢?结果呢?

如果是普通变量,那chenge方法里只是起到一个引用的作用,无轮change方法里有任何操作都不会引起成员变量x的数值有任何变化

public class Demo {
    int x;//作用域是全局的
    public static void main(String[] args) {
            Demo d = new Demo();
            d.x = 5;
            change(d.x);
            System.out.println(d.x);//这个时候输出的还是5,因为d.x的值并没有变化
            
    }
   
    public static void change(int x) {
        x = 3;//这个x并不是成员变量的x
    }
   
    public static void change(Demo d) {
            d.x = 3;
    }
}




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