Java中的值传递和引用传递
Java中的参数传递都是值传递
错误理解:1、值传递和引用传递,区分的条件是传递的内容,如果是个值,就是值传递。如果是个引用,就是引用传递。2、Java中you引用传递。3、传递的参数如果是普通类型,那就是值传递,如果是对象,那就是引用传递。
值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。
引用传递(pass by reference)是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。
基本数据类型
public static void main(String[] args) {
ParamTest pt = new ParamTest();
int i = 10;
pt.pass(i );
System.out.println(“print in main , i = ” + i);
}
public void change(int j) {
j = 20;
System.out.println(“print in pass , j = ” + j);
}
结果为:
print in change, j = 20
print in main , i = 10
pass方法内部对name的值的修改并没有改变实际参数i的值。那么,按照上面的定义,可得到结论:Java的基本数据类型传递是值传递。
引用数据类型
public static void main(String[] args) {
ParamTest pt = new ParamTest();
User ajh = new User();
ajh .setName(“ajh “);
ajh .setAge(18);
pt.change(ajh );
System.out.println(“print in main , user is ” + ajh );
}
public void change(User user) {
user.setName(“anjiahao”);
System.out.println(“print in change, user is ” + user);
}
结果为:
print in change, user is User{name=’anjiahao’, age=18}
print in main , user is User{name=’anjiahao’, age=18}
经过change方法执行后,实参的值被改变了,那按照上面的引用传递的定义,实际参数的值被改变了,这不就是引用传递了么。有人得出一个新的结论:Java的方法中,在传递普通类型的时候是值传递,在传递对象类型的时候是引用传递。但是,这种表述仍然是错误的。通过下面的列子可以看出来
public static void main(String[] args) {
Test test = new Test();
User ajh = new User();
ajh .setName(“ajh “);
ajh .setAge(18);
pt.change(ajh );
System.out.println(“print in main , user is ” + ajh );
}
public void change(User user) {
user = new User();
user.setName(“anjiahao”);
user.setAge(20);
System.out.println(“print in change, user is ” + user);
}
print in change, user is User{name=’anjiahao’, age=20}
print in main , user is User{name=’ajh’, age=18}
change方法执行过后main函数里的值却没发生改变,如果是引用传递的话通过:user = new Uer();引用会指向新的地址,那么原对象肯定会发生改变,但却没发生改变,这说明传递对象类型时并不是引用传递。可是为什么上个会发生改变呢?是因为这里是把实际参数的引用的地址复制了一份,传递给了形式参数。所以,上面的参数其实是值传递,把实参对象引用的地址当做值传递给了形式参数。
版权声明:本文为ajhblogs529原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。