package object;
//基本数据类型参数传递
/*
class Object_parameter{
public static void main(String args[]){
int x=3;
show(x);
// System.out.println(show(x));
System.out.println("x="+x);
}
public static void show(int x){
x = 4;
//System.out.println(x);
}
}
*/
/* 分析一下执行过程:首先从主函数入口,首先main加载,进入栈内存, int x=3 是定义了一个局部变量,
* 局部变量是存储在栈内存里,而且是在main函数里,第九行是 调用show(x)方法,同时把第八行的值传给了show()
* ,然后被赋值为4,执行完以后,释放,所以main函数里只剩下x=3,show因为是在栈内存里,只要是执行完这段
* 代码块会自动释放,所以执行结果是3
*
* */
//引用数据类型参数传递
public class Object_parameter {
int x = 3;
public static void main(String args[]){
Object_premeter d = new Object_premeter();
d.x = 9;
show(d);
System.out.println("x="+d.x);
}
public static void show(Object_premeter d){
d.x = 4;
}
}
/*
* 分析一下第二个程序的执行过程:
* 在主函数先执行,首先是new了个对象,这个对象存在于堆内存中,堆内存里会默认初始化为0,然后有成员变量int x=3,所以把3
* 赋值替代了0, 程序中用d变量来接收,也就是把这个对象 的引用赋给了d, 接着d.x=9,下面把9赋值给了x,
* 此时x为9,show(d);就是把d作为参数传个了show(),也就是赋值给了show(),此时show也拿着new的那个对象的
* 地址引用,执行外d.x=4,此时show栈内存里的x=4,注意,对象里的x也等于4,因为show()拿着对象的引用呢
* 执行完show方法,代码块释放,show栈里的x值消失,但是对象里的x已经为4,所以打印结果为4
*
*
*
* 其实这两个程序有很大的相似,最大的区别就是 上面的show的代码 d.x=4 让show栈内存里的x的值变成了4,
* 但是,上面的例子,show里的 x变成4之后代码块执行完了,自然而然就释放了,但是下面的例子,因为之前把d的
* 引用赋值给了show()之后,虽然show栈内存里的值也变成了4也最后释放了,但是因为show拿着对象的引用,
* 也就是说指向了对象,当show里的x变成4的时候,对象已经也变成4了,而且对象是在堆内存当中,所以说执行结果为4
* 所以只是一个拿着引用,一个拿着引用的区别,切记切记