java传递是引用的拷贝,既不是引用本身,更不是对象
2008-11-28 10:04
796 查看
public class Testit { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public static void main(String[] args) { Testit a = new Testit(); a.setName("a"); Testit b = new Testit(); b.setName("b"); System.out .println("before swap: " + "a=" + a + " name: " + a.getName()); swap(a, b); System.out .println("before swap: " + "a=" + a + " name: " + a.getName()); } private static void swap(Testit swap1, Testit swap2) { Testit temp; temp = swap1; swap1 = swap2; swap2 = temp; swap1.setName("a's name"); swap2.setName("b's name"); } }
1、首先弄清楚一个问题:Java有没有指针?
对于在C和C++里头曾经给我们带来欢
乐同时也有无限痛苦的指针,很多人宁愿它再也不要出现在Java里头。然而事实上,Java是有指针的,Java中每个对象(除基本数据类型以外)的标识
符都属于指针的一种。但它们的使用受到了严格的限制和防范,在<Thinking in Java>一书中称它们为句柄。
2、传递句柄
将句柄传递进入一个方法时,指向的仍然是相同的对象。
public class Testit {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public static void main(String[] args) {
Testit a = new Testit();
a.setName("a");
Testit b = new Testit();
b.setName("b");
System.out.println("before swap: " + "a=" + a + " name: " + a.getName());
swap(a,b);
}
private static void swap(Testit swap1, Testit swap2) {
System.out.println("swaping: " + "a= " + swap1 + " name: " + swap1.getName());
Testit temp;
temp = swap1;
swap1 = swap2;
swap2 = temp;
}
}
输出结果:
before swap: a=com.lib.Testit@16930e2 name: a
swaping: a= com.lib.Testit@16930e2 name: a
3、一个句柄的传递会使调用者的对象发生意外的改变。
public class Testit {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public static void main(String[] args) {
Testit a = new Testit();
a.setName("a");
Testit b = new Testit();
b.setName("b");
System.out.println("before swap: " + "a=" + a + " name: " + a.getName());
swap(a,b);
System.out.println("after swap: " + "a=" + a + " name: " + a.getName());
}
private static void swap(Testit swap1, Testit swap2) {
Testit temp;
temp = swap1;
swap1 = swap2;
swap2 = temp;
swap1.setName("a's name");
swap2.setName("b's name");
}
}
输出结果:
before swap: a=com.lib.Testit@16930e2 name: a
after swap: a=com.lib.Testit@16930e2 name: b's name
我们看到,a依旧是原来那个a,但name却不是原来那个name了!
在swap()方法中,swap1和swap2互相换过来了,这个时候swap2指向的是a,所以在setName()的时候改变的是a的name,而不是b的name。
为什么会这样呢?
liang_chen兄高见:Java里的传值实际上是拷贝引用,而不是拷贝对象。
总结:
1:对于值类型的参数来说,传递的是值的拷贝.
2:对于引用类型的参数来说,传递的是引用本身的拷贝.
所以关键要看你如何理解传值中的这个“值”了。
相关文章推荐
- java传递是引用的拷贝,既不是引用本身,更不是对象
- java传递是引用的拷贝,既不是引用本身,更不是对象
- java传递是引用的拷贝,既不是引用本身,更不是对象
- Java 深入学习(6) —— 打印 String 对象引用时显示的不是 hashCode 而是 String 对象本身的原因
- 有关java的引用传递,直接操作对象本身。直接删除BE的value中某值
- 有关java的引用传递,直接操作对象本身。直接删除BE的value中某值
- Java中方法调用参数传递的方式是传值,尽管传的是引用的值而不是对象的值。(Does Java pass by reference or pass by value?)
- 在Java中方法参数的传递,对象是传递引用
- Java学习笔记---6.面向对象编程01-类对象的构建及对象的引用传递
- Java基础(极客)——11、Java面向对象中引用的传递
- Java方法传递对象引用相当于传递指针的值
- 对象之间的引用传递 之 .NET中的深拷贝和浅拷贝
- 【JAVA】34、对象引用传递
- 【JSF心得】JAVA的对象传递是引用传递
- 在java中String,对象,Integer(包装类型的)关于引用传递还是值传递
- (基本数据类型值+对象)参数传递方式+对象的引用和拷贝
- python 对象拷贝——浅拷贝和深拷贝 之函数传递——值传递还是引用传递?
- 【JSF心得】JAVA的对象传递是引用传递
- 6、Java类、对象、构造器、引用类型内存基本知识、引用类型值传递
- java对象引用在方法中传递