黑马程序员技术交流社区
标题:
关于调用的小问题
[打印本页]
作者:
yangchao8907
时间:
2013-8-9 08:42
标题:
关于调用的小问题
class Demo
{
int x = 3;
public static void main(String[] args)
{
Demo d = new Demo();
d.x = 10;
show(d);
System.out.println(d.x);
}
public static void show(Demo d)
{
d.x = 6;
}
}
复制代码
输出结果是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