表面传的是对象,其实还是一串数字,还是值传递,只不过这个值可以指向内存空间的一个对象
就好比传递的都是一张纸,只不过其中一张纸上写了你家地址。所以java中的传递是值传递
错误理解
- 错误理解一:值传递和引用传递,区分的条件是传递的内容,如果是个值,就是值传递。 如果是个引用,就是引用传递。
- 错误理解二:Java 是引用传递。
- 错误理解三:传递的参数如果是普通类型,那就是值传递,如果是对象,那就是引用传 递。
求值策略
我们说当进行方法调用 的时候,需要把实际参数传递给形式参数,那么传递的过程中到底传递的是什么东西 呢?这其实是程序设计中求值策略(Evaluation strategies)的概念。
有哪几种求值策略
求值策略分为严格求值和非严格求值两大类,多数现存编程语言对函数都使用严格求值。Java也是如此
在严格求值策略中分为是传值调用(Call by value)、传引用调用(Call by reference)以及传共享对象调用(Call by sharing)。
传值调用、传引用调用、传共享对象调用。Java采用了传共享对象调用策略
1 传值调用(值传递)
- 在传值调用中,实际参数先被求值,然后其值通过复制,被传递给被调函数的形式 参数。因为形式参数拿到的只是一个"局部拷贝",所以如果在被调函数中改变了形式参 数的值,并不会改变实际参数的值。
2 传引用调用(引用传递)
- 在传引用调用中,传递给函数的是它的实际参数的隐式引用而不是实参的拷贝。因 为传递的是引用,所以,如果在被调函数中改变了形式参数的值,改变对于调用者来说 是可见的。
3 传共享对象调用(共享对象传递)
- 传共享对象调用中,先获取到实际参数的地址,然后将其复制,并把该地址的拷贝 传递给被调函数的形式参数。因为参数的地址都指向同一个对象,所以我们也称之为" 传共享对象",所以,如果在被调函数中改变了形式参数的值,调用者是可以看到这种 变化的。
我们可以总结说,Java 中的求值策略是共享对象传递,这是完全正确的。共享对象传递策略,实际就是先获取实参的地址,复制地址,将地址传递给形参。所以是值传递
网友评论