Java中的引用和对象
Java中的对象有很多,比如String对象,数组对象,还有类实例化出来的对象,对象在Java中占据着重要的地位。但是我们平时并不直接操作对象,而是通过引用来对对象进行访问。
目录
一、初步认识引用和对象
String str = "nihao";
int[] a = {1,2,3,4,5};
这里的 str 和 a 都是引用,它们分别指向了一个 String 类型和一个 int 数组类型的对象。
我们可以吧引用先简单的理解为对象的别名,或者是一个低配版指针(总之可以通过引用找到对象)。
二、理解引用和对象之间的关系
我们以人为例,对象就是人这个个体,而引用可以看成人的名字或者代号。我们需要一个人完成一项任务的时候,只需要说:小明,去干一下什么什么就可以了。
通过上面的例子,我们可以看出,通过引用我们可以对对象施加影响。
我们在上面说,引用其实就是一个低配版的指针,其实引用中存放的还是对象的地址,只不过由于Java的安全性,裁减了很多的功能。
三、关于引用指向对象的规则
1、只有引用指向对象
只有引用指向对象,没有对象指向引用,也没有引用指向引用,更没有对象指向对象。
String str = "nihao";
String str1 = str;
这里的内存结构是这样的:
2、对象可以被多个引用指向
根据我们上面画的图,这一点显而易见。
四、关于引用的操作
我们前面说过,引用是低配版指针,为了保证它的安全性裁减了很多指针的功能,只保留了以下四个功能:
1、" . " 操作(自动解引用)
. 操作符,我们可以理解成“的”的意思,实际上就是通过引用访问对象。
可以把它理解为C语言的" . " 操作,只不过这里自动完成了解引用操作(&);
int[] a = {1,2,3,4,5};
System.out.println(a.length);
通过a.length我们获取了a指向的数组对象的长度。
2、[]操作(自动解引用)
只有数组引用才支持[]操作!
在进行[]操作时也自动进行了解引用操作(&);
int[] a = {1,2,3,4,5};
System.out.println(a[2]);
获取a指向的数组对象的第3个元素。
3、= 操作
int[] a = {1,2,3,4,5};
int[] b = a;
b[2] = 10;
for(int x : a){
System.out.print(x + " ");
}
输出的结果为:
可见 b 和 a 指向了同一个对象,当使用 b 改变对象元素的时候,可以通过 a 查看变化。
4、== 操作和!= 操作
在引用中 == 和 != 操作都是对引用中的地址进行比较的,而不是对对象进行比较
String str = "nihao";
String str1 = "niHao";
System.out.println(str == str1);
System.out.println(str.equals(str1));
第三行代码中 == 是比较 str 和 str1 中存放的地址值是否一样;而第四行代码才是比较字符串的内容是否相同。可以得出这两个结果都是false。
五、null
在C中我们都知道NULL是一个宏,它代表的值就是 0 ;而在Java中null代表空引用,即不指向任何对象。
int[] a = {1,2,3,4,5};
int[] b = null;
b = a;
让 b 指向 a 目前指向的对象。
int[] a = null;
int[] b = {1,2,3,4,5};
b = a;
a 不指向任何对象,让 a 指向 b 目前指向的对象,所以 b 也不指向任何对象。
由于空引用不指向任何对象,所以不能对空引用解引用(也就是 . 和 [] 操作),否则会抛出NullPointerException异常,这个异常是空指针异常,也可以印证引用实际上就是指针。
int[] a = null;
System.out.println(a.length);
运行结果:
int[] a = null;
System.out.println(a[2]);
运行结果:
今天的内容就分享到这里,希望大家多多评论,共同提高。