java语言只有值传递!
java语言只有值传递!
java语言只有值传递!
基本类型
- 基本类型的传递过程包含“求值”、“拷贝”、“传递”三个过程,这样使得对形参的改变不会体现到实参上。
对象类型
- 每个可用的对象都有一个或者多个引用指向这个对象,在实参传递给形参的过程中,和基本数据类型一样,会对实参引用执行“求值”、“拷贝”、“传递”三个过程,这样形参可以获取到原引用的一个拷贝,同基本数据类型一样,修改引用与对象之间的引用关系,不会体现到实参引用上。
- 由于实参、形参指向同一个对象,所以通过不同引用都能操作到同一个对象,这样对于对象的传递,看起来和引用传递表现地一样,同时,因为本身作为值传递,不会破环不同引用的引用关系。
总结
-
java仅包含值传递
-
基本类型属于值传递
-
对象类型也属于值传递,传递的是引用本身——它是值传递的一种特殊形式,可以称之为“传共享对象调用(共享对象传递)”。
- 它保留了值传递的特性——不会破环不同引用各自的引用关系(“引用关系的更改”对于实参和形参之间是不可见的)。
- 同时实现了引用传递的特性:通过引用操作对象时,操作结果对于形参和实参都是可见的。
-
特殊性:String类,由于String在赋值的时候(更直接地说:更改的时候),会创建新对象(常量池中不存在时)。
-
所以它保留了“共享对象传递”传递的特性(对引用直接赋值,不会破坏其它引用与对象间的引用关系)
-
同时,通过特殊的赋值操作,看起来跟操作基本数据类型一样(“更改”对于实参和形参之间是不可见的)。对String引用进行赋值的时候,实际上是改变了引用与对象间的引用关系,这样就和基本类型表现是一致的。
==================================================================================
采用什么方式传递值,只是程序语言设计的过程中采用了不同的求值策略,关于求值策略个人也不甚了解。关于是都采用值传递,个人观点是:在传递过程中是否发生了“拷贝”操作,可以拷贝值本身,也可以拷贝引用(这里的引用只java中的引用,不是C++中的),欢迎指正!
-