Java学习DAY7——引用
1. 什么是引用(reference)和对象(object)
int[] arr = {1,3,4,5,6,7,8,9,2};
- 这里的 arr 是一个 int[ ] 类型的引用;指向了一个元素类型是 int 的数组类型对象
- 关系
String a = "hello world";
- 这里的 a 是一个字符串类型的引用;指向一个元素类型是 String 类型的对象
- 关系:
2.引用指向对象的规则
-
只有引用指向对象。没有对象指向引用,也没有引用指向引用,更没有对象指向对象。
-
对象可以被多个引用指向。
int a = 2;//JVM开辟出一块 内存空间(假如是0x100)
//存放对象 2 ,然后把对象 2 的地址赋值给了 a 这个引用。
int b = a;//让 b 指向目前 a 指向的对象
a 是一个 int 类型的引用,指向了一个元素类型是 int 的对象 2.
b 也是一个 int 类型的引用,也指向了一个元素类型是 int 的对象 2.
- 操作引用其实是在操作引用指向的对象。
int a = 2;
int sum = a + a;
对引用 a 操作,其实是对 a 指向的对象 2 进行操作。
3. null 的理解
int[] a = null;// a 不指向任何对象
这种情况称为 a 等于空,或者 a 等于 null ,意思是 a 不指向任何对象。
4.引用的比较操作符
引用的相等与不等比较,是比较两个引用是否指向同一个对象。
- 代码示例:
public class test1220{
public static void main(String[] args) {
int[] a={1,2,3,4};
int[] b={1,2,3,4};
if( a==b) {
System.out.println(true);
}else {
System.out.println(false);;
}
}
}
结果:
- 解析:
内存中如下:
a 和 b 分别指向两个不同的对象,所以结果是 false.
5.引用的 . 操作符
int[] a = {1,2,3,4};
System.out.println(a.length);//获取 a 指向的数组对象长度
“.” 操作符可以理解为“的”,通过引用 a 访问对象。
6. 数组类型引用的 [ ] 操作符
int[] b={1,2,3,4};
System.out.println(b[0]);//获取 b 指向的数组对象的第一个元素
只有数组引用才支持 [ ] 操作符
7. 通过引用操作对象表现出共享的特性
7.1 通过赋值表现
int a = {1,2,3,4};
int b = a;//让 b 指向目前 a 指向的对象
7.2 通过方法传参表现
import java.util.Arrays;
public class test1220{
public static void main(String[] args) {
int[] a = { 1, 2, 3, 4, 5 };
System.out.println(Arrays.toString(a)); // [1, 2, 3, 4, 5]
method(a);
System.out.println(Arrays.toString(a)); // [100, 2, 3, 4, 5]
}
public static void method(int[] b) {
System.out.println(Arrays.toString(b)); // [1, 2, 3, 4, 5]
b[0] = 100;
System.out.println(Arrays.toString(b)); // [100, 2, 3, 4, 5]
}
}
通过方法传递参数,其实也是让 b 指向 a 目前指向的对象,然后做修改,体现出“共享”的特性。
8. NullPointerException异常
NullPointerException常被翻译为空指针异常,但这里的指针和我们 C 语言的指针毫无关系。
已知,在对一个引用做 . 或者 [ ] 操作的时候,就是需要通过引用操作,引用指向的对象。
如果有 一个 引用 == null,则表示该引用没有指向任何对象。
则此时在对该引用使用 . 或者 [ ] 操作符,就会抛出 NullPointerException 了。
接下来,我们通过代码,看 java 出现 NullPointerException 的常见形式。
- 通过 “引用 . 某某某”,进行解引用操作
int[] arr = null;
System.out.println(arr.length);
结果:
这里就是要对 arr 这个引用做解引用动作时,由于 arr 是空,所以出现了异常。
- 通过“引用[下标]”进行解引用操作
int[] arr = null;
System.out.println(arr[0]);
结果:
这里就是要对 arr 这个引用做解引用动作时,由于 arr 是空,所以出现了异常。
小结
- 引用是一种数据类型,用来指向对象。
- 对引用进行的大部分操作实际上都是操作的该引用指向的对象。
- 当多个引用指向同一个对象时,通过哪个引用修改了对象,其他引用都可以看到变化
- 当一个引用不指向对象时,要求访问其指向的对象,就会遇到 NullPointerException