什么是引用

先看两段话:
1、“按照通俗的说法,每个对象都是某个类(class)的一个实例(instance),这里,‘类’就是‘类型’的同义词。”
2、“每种编程语言都有自己的数据处理方式。有些时候,程序员必须注意将要处理的数据是什么类型。你是直接操纵元素,还是用某种基于特殊语法的间接表示(例如C/C++里的指针)来操作对象。所有这些在 Java 里都得到了简化,一切都被视为对象。因此,我们可采用一种统一的语法。尽管将一切都“看作”对象,但操纵的标识符实际是指向一个对象的“引用”(reference)。”
这两段话都是摘自《Java编程思想》,根据这两句话可以得出结论:对象不等于引用

Person person = new Person("张三");

日常开发中,我们经常会说“person这个对象怎么怎么样”,其实这种说法是不严谨的,较真的话new Person(“张三”)才是一个对象实例,person是指向该对象的引用。

到底是值传递还是引用传递?

经常在网上看到有人说Java是值传递、或者Java是引用传递等等的话,那么什么是值传递,什么是引用传递呢?

值传递指的是在方法调用时,传递的参数是按值的拷贝传递,也就是说传递后两个对象就互不相关了。

引用传递指的是在方法调用时,传递的参数是按引用进行传递,也就是变量所对应的内存空间的地址。所以传递前和传递后变量都指向同一个内存空间。

那么java到底是值传递还是引用传递呢?我们做如下测试,测试代码如下:

public class testPerson {

static class Person {
int age = 18;
}

static void changPerson(Person person) {
person.age = 28;
System.out.println("changPerson中的age:" + person.age);

}

public static void main(String[] args) {
Person person = new Person();
changPerson(person);
System.out.println("main中的age:" + person.age);
}

}

输出结果为:

Java值传递和引用传递_值传递


由结果我们发现,两次输出的age值是一样的,说明main方法中的person引用和changPerson中的person引用都指向了同一个对象实例,即new Person()得到的对象实例。

那么我们是否可以得出结论:java是引用传递呢?答案是不可以,看如下代码:

public class testPerson {

static int age;

static void changPerson(int arg) {
arg = 28;
System.out.println("changPerson中的age:" + arg);

}

public static void main(String[] args) {
age = 18;
changPerson(age);
System.out.println("main中的age:" + age);
}

}

运行结果如下:

Java值传递和引用传递_引用传递_02


我们看到,如果将类Person换成int类型的变量,则结果并未像引用传递的效果一样。

这是为什么呢?

那是因为基本类型在java中是按照值传递,如下方式生成的String字符串也是值传递:

String str = “张三”;

结论

在Java中,除了基本数据类型(int、long等)和String str =“张三”是值传递,其他的都是引用传递。