参数传递,值传递弄得我一头雾水,大哥大姐们帮我讲讲吧。。
public class PassByRef {
int a;
public void method(PassByRef p){
p = new PassByRef();
p.a = 10;
}
public static void main(String[] args) {
PassByRef p = new PassByRef();
p.a = 5;
p.method(p);
System.out.println(p.a);
}
}
public class PassByValue {
public void method(int a){
a = 10;
}
public static void main(String[] args) {
PassByValue pbv = new PassByValue();
int a = 5;
pbv.method(a);
System.out.println(a);
}
}
------解决方案--------------------和其它语言一样,java也有引用传递和值传递。java的引用和c/c++的指针是一个概念,就是取得某个变量的地址。所谓引用传递,就把先把引用变量复制一份,放在堆栈中,然后把复制的引用变量再作为实参供函数调用。而值传递就不一样,值传递不用复制,直接把变量的值作为实参供函数调用。
------解决方案--------------------一定要记往,JAVA所有的都是引用,所以在传递的时候一定要注意了
--------------------------
p.a = 5;
p.method(p);//这只改变了方法体的一些内容,并没有返回方法外的值
System.out.println(p.a);//所以还是取到方法外面的值
--------------------------
引用引用......
------解决方案--------------------你要理解内存的存储方式,内存分堆,栈,全局区(静态区),常量区.4个区域
堆,是用来存储引用类型和对象变量
栈,用来存储变量,
全局区(静态区),)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放
常量区 — 常量字符串就是放在这里的.程序结束后由系统释放.
你再搞懂变量的生命周期,一般生命周期都是在{}内的,也就是他只在{}有效
比如{int x}和{int x}这两个X是不同的两个,在栈中创建2个不同的内存地址来存储
------解决方案--------------------举个例子
int x = 0;这个变量,所以在栈中存储
String x = new String( " ");
首先,String x,要在栈中开个空间来存储X,类型是String
接着再堆中开个空间来存储new String( " ");
再通过 "= "把堆中的首地址传递给栈中的X,那么X存储的就是new String( " ");变量在堆中的首地址,
也几是说这时候X存储的是一个地址,而不是一个值,这个值是在堆中存储
讲那么多,应该懂了吧
记的给分呀
------解决方案--------------------java里面参数传递只有值传递
通常认为java有两种传递:引用传递和值传递
但其实只有一种值传递。
因为java参数传递的过程是将参数进行内容拷贝,然后使用拷贝后的数据,函数调用完之后,释放拷贝。
这正式值传递的过程。
引用传递只是将引用拷贝了一次,指向的对象实体仍没变