对于如下代码:
public class Test {
public static void main(String[] args) {
int i = 0 ;
Test test = new Test();
test.valueMethod(i);
System.out.println(i);
}
private void valueMethod(int a){
a = 5;
}
}
运行结果是0,由于参数是基本类型,因此调用时我们传递的是一个值,所以是java中的值传递,它传递的是一个值的副本,因此,在这个局部方法中对传进来的值的修改是不会影响外部变量的,它修改的是副本的值而不是外部成员i的值。
而对于如下代码
public class Test {
public static void main(String[] args) {
DO dos = new DO();
dos.setX1(3);
Test test = new Test();
test.paraMethod(dos);
System.out.println(dos.getX1());
}
private void paraMethod(Object o){
DO oo = (DO)o;
oo.setX1(5);
}
}
class DO{
private int x1 ;
public int getX1() {
return x1;
}
public void setX1(int x1) {
this.x1 = x1;
}
}
运行结果却是5,这是因为值传递时候,传递的是值的拷贝,而引用传递时,也是引用的拷贝,它意味着外部变量和局部变量的指针指向同一个对象,当你在局部方法内修改那个对象的值时,实际上是修改的堆中的值,因此外部变量的值也修改了
再看如下代码:
public class Test {
public static void main(String[] args) {
DO dos = new DO();
dos.setX1(3);
Test test = new Test();
test.paraMethod(dos);
System.out.println(dos.getX1());
}
private void paraMethod(Object o){
DO oo = new DO();
oo.setX1(8);
o = oo;
}
}
class DO{
private int x1 ;
public int getX1() {
return x1;
}
public void setX1(int x1) {
this.x1 = x1;
}
}
它的运行结果还是3,有的人就奇怪了,这个和第二个不是类似么,为什么这里没有修改它的值呢
其实知道画堆栈图的人把这里画出来就明白了
dos是栈中的一个引用,它指向了堆中的x1所代表的值3
1.当你用上面第2段代码时,实际上是拷贝了一个引用传递到局部方法中,我们暂且称这个引用为dos2,dos和dos2都指向了堆中的3,当我们修改dos2的值的时候实际上就是把这个3给改成了5,因此,dos的x1这个值就变成了5。
2.当你用上面第3段代码时,实际拷贝的是一个引用传递到局部方法中,我们也暂且称这个引用为dos2,dos和dos2都指向了堆中的3,现在我在局部方法体中重新定义了一个oo,这个oo又是一个栈中的指针,它指向了堆中的另外一个值为8的堆空间,我把这个引用赋给dos2时,实际上就只是把dos2的指针给变了,而dos继续指向它原来的3,因此最后的结果就为三拉。
最后总结一下,目前java传递有2种观点
一种是值传递观点,他们认为java只有值传递,没有引用传递,就算参数是一个引用,它也是引用值的副本,所以是值传递
另一种是基本类型为值传递,引用类型就是引用传递。
我个人比较支持第一种,不过这个一直都有争议,没有正确答案~~~~。
分享到:
相关推荐
不管是按值传递还是按引用传递,都是把栈中的数据备份了一份给参数变量,只不过值类型备份的是具体的数值,而引用类型备份的是内存地址
java 值传递和引用传递的比较区别,包括代码及详解
Java:按值传递还是按引用传递详细解说
Java面向对象值传递和引用传递Java面向对象值传递和引用传递Java面向对象值传递和引用传递Java面向对象值传递和引用传递
13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递....
这个在Java里面是经常被提起的问题,也有一些争论,似乎最后还有一个所谓的结论...事实上,这很容易让人迷惑,下面先分别看看什么是按值传递,什么是按引用传递,只要能正确理解,至于称作按什么传递就不是个大问题了。
java学习java语言的值传递和引用传递
本人经过长时间收集的最经典、最有说服力、最易懂的关于值传递和引用传递的详解资料~包看包会~发出去真有些不舍得~
当一个变量为一个参数传入方法内部的时候,会有两种不同的传递方式:值传递和引用传递。 值传递的特点:不管方法内部对传进去的参数作任何改变,也不会影响方法外部的变量的值 引用传递的特点:方法内部对传...
java参数传递时到底是值传递还是引用传递分享.pdf
java参数传递时到底是值传递还是引用传递[归类].pdf
主要介绍了 Java 值传递和引用传递详解及实例代码的相关资料,需要的朋友可以参考下
主要介绍了详解java的值传递、地址传递、引用传递的相关资料,需要的朋友可以参考下
Java中的值传递和引用传递的区别.doc
Java语言中参数值传递和引用传递比较
主要介绍了java到底是值传递还是引用传递的相关知识,本文通过几个例子给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
Java的按值传递和按引用传递分析 Java的按值传递和按引用传递分析.pdf
java中的值传递和引用传递[汇编].pdf
java 中没有引用传递,都是值传递的,可以通过传递副本修改对象的,副本交换,并不影响原引用