在下不明白,什么时候是传值,什么时候是引用?
赋个例子:List<String> list =new ArrayList<String>();
list.add("a");
List<String> byQuote = list;
list.add("b");
System.out.println(byQuote.toString());
//结果[a, b],说明是传引用
String str = "a";
String byValue = str;
str+="b";
System.out.println(byValue);
//结果是a,说明是传值
赋个例子:List<String> list =new ArrayList<String>();
list.add("a");
List<String> byQuote = list;
list.add("b");
System.out.println(byQuote.toString());
//结果[a, b],说明是传引用
String str = "a";
String byValue = str;
str+="b";
System.out.println(byValue);
//结果是a,说明是传值
解决方案 »
- java源程序中没有main函数可以运行吗?
- 关于log的一些问题
- 坐等解决一个异常
- java里的内部类该怎么用UML的class diagram表示?
- java环境下,如何动态的装在一个指定 jar 文件中的一个类
- 一个关于Float[]的基本问题
- 使用javamail收邮件时,getSystemFlags返回的Flags数组的长度为0
- 请问preferences中如何存储LinkedList<Map<String,object>>数据
- 在网页中编写的javascript程序,怎么不让别人看到???100分求购答案!
- java重写object的equals方法
- 调用父类的变量和方法
- 集合分组后输出 在线急等……
现在的java教材好像都称为值传递,上面说了,引用传递传递的是对象的地址,而不是变量的地址,那么变量的值是什么?变量的值就是这个对象的地址,即String s = "abc"; s的值实际上是"abc"的地址,s只是个变量,"abc"才是对象,s="abc"是让变量指向"abc"对象的地址,也就是说让s引用"abc",所以说s的值是个地址,s的内容才是"abc"字符串,从这个角度来看,引用传递也算是一种值传递,传的是变量的值(注意是变量的值,不是对象的值),因为变量的值就是对象的地址。
所以,当看到值传递的说法时,要知道,这里所说的是传递的是变量的值,简单类型的变量的值,就是变量本身的内容,对象类型的变量的值就是对象的地址。当看到引用传递的说法时,要知道,这里所说的是传递的是对象的地址(注意不是变量的地址) List<String> list =new ArrayList<String>(); //list变量指向一个ArrayList对象,
//即list是ArrayList对象的地址
list.add("a"); //这里是往list指向的地址追加信息
List<String> byQuote = list; //byQuote变量的值=list的值,
//也就是=ArrayList对象的地址
list.add("b"); //这里是往list指向的地址追加信息
System.out.println(byQuote.toString()); //byQuote变量的值和list的值一样,
//都是ArrayList对象的地址,
//所以打印的是同一个地址的内容
//结果[a, b],说明是传引用
String str = "a"; //str指向"a"对象,即s是"a"的地址
String byValue = str; //byValue变量的值=str的值,也就是="a"的地址
str+="b"; //str重新赋指,也就是str指向新的对象"ab"的地址,
//注意这里str变量变了,但是byValue没变
System.out.println(byValue); //byValue的值是"a"地址,所以打印"a"地址的内容
//结果是a,说明是传值
LZ再来体会
List<String> list =new ArrayList<String>();
List<String> byQuote = list;
list = new ArrayList<String>(); //list重新赋值,改变list的指向,
//注意体会这里根上面的str+="b"的相似性,
//都是改变了变量的值,让它指向新的地址
list.add("a");
System.out.println(byQuote.toString());
c也只有值传递
c++有引用传递
public class Pass {
public void test(int i){
i=i/5;
System.out.println("i=:"+i);//i=1
}
public void test(product p){
//p=new product();把这个加上后,新开辟一个地址,指向的就不同了,q还是指向100,p指向20
p.setPrice(20);
System.out.println("p.price=:"+p.getPrice());//20
}
public static void main(String[] args) {
Pass p=new Pass();
int t=5;
p.test(t);
System.out.println("t=:"+t);//i=5 i值不变,在堆中有i,t两个变量,他们没有关系,只不过i和t的值都等于5而已
product q=new product();
q.setPrice(100);//100
p.test(q);
System.out.println("q.price=:"+q.getPrice());//20 开始两个都指向内存中price=100的地方,
//然后那个内存地址的price值改变为20,两个值就都改变成为了20,说明他们都指向同一个地址。传的也是地址了嘛
}}product.javapublic class product {
int price;
product(){
}
public int getPrice() {
return price;
} public void setPrice(int price) {
this.price = price;
}
}
LZ的例子都是把指向的地址传给了另一变量。
只是第一个例子,两个变量指向同一个地址,所以打印是一样的;
而第二个例子,str开向指向的地址改变了(str+="b" 之后,ab存放在一个新的地址,而str指向了这个新地址),而byValue的指向没有变。所以两个变量指向的内容也就不一样了。
String byValue = str;
str+="b";
因为String的值是不可变的,str+="b"实际上是new了一个新的string,不再指向原来的对象了