黑马程序员技术交流社区
标题:
代码运行差异
[打印本页]
作者:
翟宝海
时间:
2013-5-27 23:46
标题:
代码运行差异
本帖最后由 翟宝海 于 2013-5-28 10:08 编辑
class Demo
{
public static void main(String[] args)
{
int x = 4;
show(x);
System.out.println(x);
}
public static void show(int x)
{
x = 2;
}
}
//为什么运行结果是4?
class Demo
{
int x = 3;
public static void main(String[] args)
{
Demo d = new Demo();
d.x = 10;
show(d);//show(new Demo());
System.out.println(d.x);
}
public static void show(Demo d)
{
d.x = 6;
}
}
//运行结果是6;
class Demo
{
public static void main(String[] args)
{
int[] arr = new int[2];
show(arr);
System.out.println(arr[0]);
}
public static void show(int[] arr)
{
arr[0]++;
}
}
//运行结果是1;
复制代码
第二个和第三个可以理解,第一个还有些迷糊,试请诸位达者指点迷津!
作者:
FantasticPie
时间:
2013-5-27 23:50
第一个运行结果为4,怎么会是2呢?
作者:
张俊迪
时间:
2013-5-28 01:42
你要理解局部变量,这个问题主要是牵扯到局部变量,主函数中定义的局部变量x和show函数参数中定义的局部变量x不是同一个,因为局部变量只在局部内有效,和别的部分没有任何关系
作者:
霜冰刃雪
时间:
2013-5-28 02:09
同意LS的,
明确一点,
public static void show(int x)
中的x为形式参数
show(x);中的x为实际参数,
函数被调用时会在内存中开辟空间,之后会将实参的值复制给形参,再在他的空间里进行各种操作,但是实参的值没有改变,
所以 show(x);只是在他自己的那一片空间里将x的值改为了2,之后随着函数运行完也就释放了,没有其他动作了,做为实参,也就是最后打印的x的值还是一开始定义的4
作者:
王瀛
时间:
2013-5-28 07:21
本帖最后由 王瀛 于 2013-5-28 07:26 编辑
解释都在代码注释中了,按照一,二,三...的顺序看。另:原Demo我改成了Test01其他没动
class Test01
{
public static void main(String[] args)
{
int x = 4;//一.注意,这里的x是局部变量,并非成员变量
show(x);//三.这里的x相当于主函数中的x,即show(4)。但是!!!这里传递的是x的值,而并不是x
System.out.println(x);//五.由于"三"相当于没起作用,所以这里的x打印的是"一"中的x
}
public static void show(int x)//二.这里的x也是局部变量,局部变量随着方法的调用结束而释放(消亡)
{
x = 2;
}//四.由于x是局部变量,所以这里的x=2前并没有省略"this.",操作的仍然是传递进来的x。又因为是局部变量,所以当此方法执行到这个"}"的地方时,show()中的局部变量x被释放,所以相当于做的无用功,或者说show(方法在卖萌)
}
//为什么运行结果是4?
class Test01
{
int x = 3;//一.这里的x定义在类的成员位置上,是成员变量。成员变量随着对象的创建而存在于堆内存中,只有当对象没有被指向(引用)时,所占的堆内存才会被垃圾回收器收走
public static void main(String[] args)
{
Test01 d = new Test01();//二.在本类中创建本类对象,d指向了本类的一个实例化对象
d.x = 10;//三.实例化对象中的x被赋值
show(d);//show(new Demo());四.===>show(刚刚创建的对象)
System.out.println(d.x);//八.打印实例化对象中的成员变量x,x的值经过三、四、六后变为6,被打印出来
}
public static void show(Test01 d)//五.show方法会接收一个Test01类型的引用,并对引用中的内容操作
{
d.x = 6;//六.这里的d是局部变量,只不过与"二"中new出来的实例化对象同名。当"四"被执行后,传入了创建的实例化对象,并对实例化对象中的x进行赋值。
}//七.此函数调用结束,原来在栈内存中的局部变量d被释放。但是!!!实例化对象确实已经被操作,即show方法的效果被创建的实例化对象所保留,所以这里的show()没有卖萌,起到了应有的作用。
}
//运行结果是6;
class Test01//这个的解释与上面(结果为6)的类似,因为数组也是引用型变量
{
public static void main(String[] args)
{
int[] arr = new int[2];
show(arr);
System.out.println(arr[0]);
}
public static void show(int[] arr)
{
arr[0]++;
}
}
//运行结果是1;
复制代码
作者:
Super_Class
时间:
2013-5-28 08:36
方法出栈,方法中的变量就死掉了。
但是对象创建后,对象持有对类的引用。只用当类的引用结束。对象才会变成垃圾
总之一句话:看内存
作者:
lpflpy
时间:
2013-5-28 09:26
第一句是传值,故原值不变
第三句是穿引用地址,故可以改变数组中的元素值
作者:
HM张博文
时间:
2013-5-28 09:57
本帖最后由 HM张博文 于 2013-5-28 09:58 编辑
第一段程序中的show方法根本就没有任何意义,相当于自娱自乐
public static void show(int x)
{
x = 2;
}
在这段程序里面,x只是形参,给形参赋值,完全没意义。按原来的程序,调用show(4)相当于执行的是4=2这样的错误指令。
根据楼主的意思,调用show(4)的时候是希望将4的值赋给X,那函数应该这样写
public static int show(int x)
{
int y = x;
return y;
}
作者:
翟宝海
时间:
2013-5-28 10:07
王瀛 发表于 2013-5-28 07:21
解释都在代码注释中了,按照一,二,三...的顺序看。另:原Demo我改成了Test01其他没动 ...
解释得很详细,有拨云见月之感,多谢释疑!谢谢几位热心助人的同学了!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2