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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© idream 中级黑马   /  2014-4-20 21:58  /  1538 人查看  /  14 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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;
        }
}

14 个回复

倒序浏览
本帖最后由 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. }
复制代码

评分

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

查看全部评分

回复 使用道具 举报

详细,很好,了解啦
回复 使用道具 举报
  所以结果是3
回复 使用道具 举报
看图执行顺序

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

所以结果是3

所以结果是3
回复 使用道具 举报
因为X在这个类中是成员变量,作用范围是全局的,所以任何一步赋值操作都会对其有影响,而且X永远都是当前值。
所以这段程序无论如何写,打印出来的都是X最后一次被赋予的值,也就是3。
回复 使用道具 举报
局部变量、成员变量(又分静态和非静态),非静态的成员变量最好叫实例变量,静态的最好叫类变量
回复 使用道具 举报
局部变量、成员变量(又分静态和非静态),非静态的成员变量最好叫实例变量,静态的最好叫类变量。
实例变量是对象创建的时候才会存在,而类变量在类加载的时候就会存在。弄懂这些原理需要多画画图

回复 使用道具 举报
1楼正解:lol
回复 使用道具 举报

有图有真相
回复 使用道具 举报
爱翚 发表于 2014-4-20 22:26
因为X在这个类中是成员变量,作用范围是全局的,所以任何一步赋值操作都会对其有影响,而且X永远都是当前值 ...

如果change里面传得不是对象的引用 , 而是普通变量呢?结果呢?
回复 使用道具 举报

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
怎么样才可以上传图片呢?

你看图片看能不能理解

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

6.jpg

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

7.jpg

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

8.jpg

评分

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

查看全部评分

回复 使用道具 举报 1 0
错过了今天 发表于 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;
    }
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马