黑马程序员技术交流社区

标题: 关于调用的小问题 [打印本页]

作者: yangchao8907    时间: 2013-8-9 08:42
标题: 关于调用的小问题
  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?
作者: 王清华0    时间: 2013-8-9 08:59
程序第13行,d.x=6 ,不是将 d.x的值给修改了么?
程序第8行, show(d);  引用传参,调用static 函数show(),修改了d的属性x的值。
作者: 牛牛    时间: 2013-8-9 09:03
Demo 是对像        x是Demo中的一个成员变量。      执行d.x = 10;时Demo中的成员变量x为10  你在 d.x = 10; 这行下面执行 System.out.println(d.x);  看下        执行show(d);传入Demo对像修改了x为6因为是引用传递就把原来的10覆盖为6了。      
你了解下值传递和引用传递就明白这是怎么回事了。
值传递:方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参 数的值。
引用传递:也称为传地址。方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,方法执行中形式参数值的改变将会影响实际参数的值。
作者: 天涯海角    时间: 2013-8-9 09:51
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覆盖了
        }
}
以上是我对这段代码的分析以及执行步骤,相信你能看明白。
作者: yangchao8907    时间: 2013-8-9 10:14
天涯海角 发表于 2013-8-9 09:51
class Demo
{
        int x = 3;

明白了,thx.
作者: 天涯海角    时间: 2013-8-9 17:46
那您能给加一分吗?{:soso_e112:}
作者: 封号了...    时间: 2013-8-10 02:41
我猜你想问的是为什么静态的方法可以调用并改变非静态的值,平常我们都只说静态的是先于非静态初始化的,所以不能调用非静态,
其实在静态代码之前,只要我们new一个对象的话,这个对象里面所以的变量都会先于后面的静态变量优先初始化,所以只要new出来之后,后面的static方法就可以调用并修改其值了!
所以这里是修改之后的数据!
作者: 赵国刚    时间: 2013-8-10 07:39
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;

        }

}




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