定义
所谓的引用或者对象,都是内存中数据的一种规定的组织方式。
引用提供给程序员一个间接操作对象的方式。
通过一个引用,管理着一个对象,引用指向对象
所谓的数组,其实准确的表述都是数组对象,还有我们直接学习过的字符串,其实是也是对象,只是被 String 类型的引用指向的对象。
只能引用指向对象,不能对象指向引用,也不能有引用指向引用,更不会对象指向对象。
引用同一时刻只能指向一个对象;对象同一时刻可以被多个引用指向。
引用可以不指向任何对象,就是对象为null的时候;
这时候就是空指针异常。
int[] a = null;
举例:
String s = "Hello World"; // 这里的 s 的类型是 String 类型的引用;该引用指向了一个String 类型的对象。
int[] a = { 1, 2, 3, 4, 5 }; // 这里的 a 的类型是 int[] 类型的引用;该引用指向了一个
元素类型是 int 的数组类型对象。
引用的赋值
引用的赋值运算,是让被赋值的引用指向该引用当前指向的对象。
int[] a = { 1, 2, 3, 4, 5 };
int[] b = null;
b = a; // 让 b 指向 a 目前指向的对象
int[] a = null; // a 不指向任何的对象
int[] b = { 1, 2, 3, 4, 5 };
b = a; // 让 b 指向 a 目前指向的对象
// 由于 a 目前不指向任何的对象。所以 b 也不再指向任何的对象
引用的相等与不等比较,是比较两个引用是否指向同一个对象
int[] a = { 1, 2, 3, 4, 5 };
int[] b = { 1, 2, 3, 4, 5 };
a == b; // 由于 a 和 b 指向不同的对象,所以结果是 false
a != b; // 由于 a 和 b 指向不同的对象,所以结果是 true
b = a; // 让 b 指向 a 目前指向的对象
a == b; // 由于 a 和 b 指向相同的对象,所以结果是 true
a != b; // 由于 a 和 b 指向相同的对象,所以结果是 false
==和Arrays.equals()区别
“==”比较两个引用是否指向同一个对象
“equals()”比较字符串中所包含的内容是否相同。
解引用
对一个引用进行解引用,就是通过引用,找到该引用指向的对象。
int[] arr = { 1, 2, 3, 4 5 };
System.out.println(arr.length);
这里就是要对 arr 这个引用做解引用动作,也就是找到 arr 指向的数组对象,然后发布获取其长度的命令。
通过引用==[下标]==,进行解引用操作
int[] arr = { 1, 2, 3, 4, 5 };
System.out.println(arr[0]);
引用类型支持的操作符
int[] a = { 1, 2, 3, 4, 5 };
int[] b = null; b = a; // 赋值操作符,支持
b == a; // 比较操作符,支持
b != a; // 比较操作符,支持
b[0]; // 解引用操作符,支持
b.length; // 解引用操作符,支持
NullPointerException 异常
通常被称为空指针异常。
在对一个引用做解引用的动作时,如果引用 == null,表示这个引用不指向任何的对象。就是空指针异常,则此时在对该引用使用 . 或者 [] 操作符,就会抛出 NullPointerException 了。
举例:
空指针的时候解引用就会出现空指针异常。
int[] arr = null;
System.out.println(arr.length);
// 运行结果,会出现运行时异常
Exception in thread "main" java.lang.NullPointerException
总结: