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);
}
}
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书上都有介绍~~
----------------
那Integer除不除外?Object本身除不除外?用Collections.unmodifiedCollection()修饰过的Collection除不除外?要除外的太多啦!java中,所有的primary type都是传值,其他以Object为基类的都是传引用。
--------------------------------------------------------------
p.a = 5;
p.method(p);//这只改变了方法体的一些内容,并没有返回方法外的值
System.out.println(p.a);//所以还是取到方法外面的值
--------------------------------------------------------------
引用引用......
-----------
你的两段理解都没错!
int a;
public void method(PassByRef p){
p = new PassByRef();//new 一个新的对象,所以跟前面没关系
p.a = 10;//没返回值,就算有返回值,因为NEW了一个新的对象,就在内存中新开了一个堆,所以跟传进来的PassByRef p一点关系都没有
}
public static void main(String[] args) {
PassByRef p = new PassByRef();
p.a = 5;//p.a=5
p.method(p);
System.out.println(p.a);//p.a=5;
}
}
public class PassByValue {
public void method(int a){
a = 10;//因为这里的a是在新的内存中新开辟的,所以又没返回值,就不能把a=10,付值给原来的那个a=5,这个数,所以,原来的a还是等于5
}
public static void main(String[] args) {
PassByValue pbv = new PassByValue();
int a = 5;
pbv.method(a);//把a=5,传给method(int a)
System.out.println(a);//还是原来的5
}
}建议先搞清楚他们在内存中的存储方式,这样就很容易理解了
本想跟你说清楚点的,但是太多方面要说,又没图,所以楼主自己找资料学去
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 void method(int a){
a = 10;
}
public static void main(String[] args) {
PassByValue pbv = new PassByValue();
int a = 5;//这两边定义的a值实际是两个不同的变量.打印出来的是各个的变量值.
pbv.method(a);
System.out.println(a);
}
}
这几句话有点不懂呢?能不能给解释一下呢?先谢啦!
堆,是用来存储引用类型和对象变量
栈,用来存储变量,
全局区(静态区),)(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参数传递的过程是将参数进行内容拷贝,然后使用拷贝后的数据,函数调用完之后,释放拷贝。
这正式值传递的过程。
引用传递只是将引用拷贝了一次,指向的对象实体仍没变