class Demo
{
public static void main(String[] args)
{
int x=6;
show(x);
System.out.println(x);
}
public static void show(int x)
{
x=5;
}
}
输出是6因为show方法没有返回任何值所以输出为6
class Demo
{
int x=6;
public static void main(String[] args)
{
Demo d=new Demo();//x=6
System.out.println(d.x);
d.x=8;//x=8
System.out.println(d.x);
show(d);//x=5
System.out.println(d.x);
}
public static void show(Demo d)
{
d.x=5;
}
}
输出为5作者: 请备注 时间: 2014-4-11 18:05
class Demo
{
public static void main(String[] args)
{
int x=6;//s把6赋值给main x。
show(x);//,把main x=6传进去,调用show方法,把5赋值给show x。方法执行完,x释放。
System.out.println(x);//这里打印main x=6. show方法里的x已经释放想打印也打印 不了。
}
public static void show(int x)
{
x=5;
}
}
==================
class Demo
{
int x=6;
public static void main(String[] args)
{
Demo d=new Demo();//实例化对象,同时初始化x=6.
d.x=8;//把8赋值给d中的x.
show(d);//调用show方法把5赋值给d中的x。
System.out.println(d.x);x从6 到8再到5,打印5.
}
public static void show(Demo d)
{
d.x=5;
}
}
以上代表个人观点,仅供参考:D
一起努力作者: 呆呆沙师妹 时间: 2014-4-11 18:08 本帖最后由 呆呆沙师妹 于 2014-4-11 18:11 编辑
这应该是基础数据类型和实例对象在内存中存储位置不一样导致的。
第一个程序中,x 定义在main方法内部,调用该main方法后,栈内存中开辟了标识符为 x 的地址空间存储它的值,之后调用了show方法,此时传递给show方法的是 x 变量值的拷贝而非 x 的地址,因而show方法又开辟了新的栈内存储 x 的变量值,然后将这块地址对应的值修改为5,因为没有将值返回给 x 的地址,根据栈后进先出的规则,后创建的值为5的内存区域被释放了,栈内存中 x 的值依然是 6 没有改变;
第二个程序中,x 作为对象的实例属性存在,main方法创建了Demo的实例对象,因实例对象实际存储在堆内存中,开辟了标识符为 d 的栈内存空间中存放实例对象的引用地址,即d中存储的值是实例对象的引用地址,调用show方法后,传递给show方法的是d变量值的拷贝即实例对象的地址,它们指向的是堆内存中的同一对象,对其进行修改后,实际是修改的堆内存中的实例对象,show方法调用结束,它开辟的栈内存空间被释放,main方法中栈内存地址存储的值没有变,但是值对应的实例对象却发生了改变。