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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© yangchao8907 中级黑马   /  2013-8-9 08:42  /  1299 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. class Demo
  2. {
  3.         int x = 3;
  4.         public static void main(String[] args)
  5.         {
  6.                 Demo d = new Demo();
  7.                 d.x = 10;
  8.                 show(d);
  9.                 System.out.println(d.x);
  10.         }
  11.         public static void show(Demo d)
  12.         {
  13.                 d.x = 6;
  14.         }
  15. }
复制代码
输出结果是6,why?

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1

查看全部评分

7 个回复

倒序浏览
程序第13行,d.x=6 ,不是将 d.x的值给修改了么?
程序第8行, show(d);  引用传参,调用static 函数show(),修改了d的属性x的值。

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1

查看全部评分

回复 使用道具 举报
Demo 是对像        x是Demo中的一个成员变量。      执行d.x = 10;时Demo中的成员变量x为10  你在 d.x = 10; 这行下面执行 System.out.println(d.x);  看下        执行show(d);传入Demo对像修改了x为6因为是引用传递就把原来的10覆盖为6了。      
你了解下值传递和引用传递就明白这是怎么回事了。
值传递:方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参 数的值。
引用传递:也称为传地址。方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,方法执行中形式参数值的改变将会影响实际参数的值。

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1

查看全部评分

回复 使用道具 举报
class Demo
{
        int x = 3;
        public static void main(String[] args)
        {
                Demo d = new Demo();//1,先创建了一个demo对象,通过new Demo(),在堆内存中开辟了内存空间,此时x=3,
                d.x = 10;                   //2,通过调用对象对x赋值把x=3;给覆盖掉了此时x=10
                show(d);                  //3,调用show()
                System.out.println(d.x);//6,将x输出此时x=6
        }
        public static void show(Demo d)
        {
                d.x = 6;                 //5,通过这个方法对x又赋值此时x=6.将x=10覆盖了
        }
}
以上是我对这段代码的分析以及执行步骤,相信你能看明白。

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1 赞一个!

查看全部评分

回复 使用道具 举报
天涯海角 发表于 2013-8-9 09:51
class Demo
{
        int x = 3;

明白了,thx.
回复 使用道具 举报
那您能给加一分吗?{:soso_e112:}
回复 使用道具 举报
我猜你想问的是为什么静态的方法可以调用并改变非静态的值,平常我们都只说静态的是先于非静态初始化的,所以不能调用非静态,
其实在静态代码之前,只要我们new一个对象的话,这个对象里面所以的变量都会先于后面的静态变量优先初始化,所以只要new出来之后,后面的static方法就可以调用并修改其值了!
所以这里是修改之后的数据!
回复 使用道具 举报
class Demo

{

        int x = 3;

        public static void main(String[] args)

        {

                Demo d = new Demo();

                d.x = 10;//此处x的值被覆盖,必成了10,x=3被覆盖

                show(d);//调用show()x的值成为了6

                System.out.println(d.x);//输出的只变为了6

        }

        public static void show(Demo d)

        {

                d.x = 6;

        }

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