什么是引用
先看两段话:
1、“按照通俗的说法,每个对象都是某个类(class)的一个实例(instance),这里,‘类’就是‘类型’的同义词。”
2、“每种编程语言都有自己的数据处理方式。有些时候,程序员必须注意将要处理的数据是什么类型。你是直接操纵元素,还是用某种基于特殊语法的间接表示(例如C/C++里的指针)来操作对象。所有这些在 Java 里都得到了简化,一切都被视为对象。因此,我们可采用一种统一的语法。尽管将一切都“看作”对象,但操纵的标识符实际是指向一个对象的“引用”(reference)。”
这两段话都是摘自《Java编程思想》,根据这两句话可以得出结论:对象不等于引用。
日常开发中,我们经常会说“person这个对象怎么怎么样”,其实这种说法是不严谨的,较真的话new Person(“张三”)才是一个对象实例,person是指向该对象的引用。
到底是值传递还是引用传递?
经常在网上看到有人说Java是值传递、或者Java是引用传递等等的话,那么什么是值传递,什么是引用传递呢?
值传递指的是在方法调用时,传递的参数是按值的拷贝传递,也就是说传递后两个对象就互不相关了。
引用传递指的是在方法调用时,传递的参数是按引用进行传递,也就是变量所对应的内存空间的地址。所以传递前和传递后变量都指向同一个内存空间。
那么java到底是值传递还是引用传递呢?我们做如下测试,测试代码如下:
输出结果为:
由结果我们发现,两次输出的age值是一样的,说明main方法中的person引用和changPerson中的person引用都指向了同一个对象实例,即new Person()得到的对象实例。
那么我们是否可以得出结论:java是引用传递呢?答案是不可以,看如下代码:
运行结果如下:
我们看到,如果将类Person换成int类型的变量,则结果并未像引用传递的效果一样。
这是为什么呢?
那是因为基本类型在java中是按照值传递,如下方式生成的String字符串也是值传递:
结论
在Java中,除了基本数据类型(int、long等)和String str =“张三”是值传递,其他的都是引用传递。