我们都知道,Java数据类型有两种:1.基本类型(四类8种);2.引用类型。那么引用类型是什么呢?引用类型可以理解为对象的别名。像String、 数组、还有自己创建的类都是引用类型。
以下面的代码块为例,new创建一个数组对象,后续在操作这个数组对象的时候用arr这个引用去操作。或者new一个字符串对象,然后后期用到这个字符串对象的时候,就可以直接使用这个引用,相当于给这个对象起了名字,这个对象也可以起多个名字。如下面这个数组,利用arr2和arr都可以操作这个数组。
public class Test {
public static void main(String[] args) {
int [] arr=new int[]{
1,2,3,4};
int [] arr2=arr;
String str=new String("hello");
}
}
引用的本质是一个低配指针。引用的本质就是一个指针(引用就对应一小块内存空间,里面存的就是一个地址,创建一个变量来保存这个地址,这样的变量就是一个指针变量)
以上面的数组的代码为例:
int [] arr=new int[]{
1,2,3,4};
int [] arr2=arr;
首先创建了一个新的对象,new int[],然后创建了一个变量来存放这个对象的地址,若 int []arr2=arr,并不是把创建的对象赋值给arr2,而是让arr2这个引用来指向这个新存放的地址。
1)只有引用指向对象(说明引用里面的值是保存着对象的地址),没有对象指向引用(Java引用的地址是无法获取到的,说明无法保存,对象中也无法存地址),也没有引用指向引用,更没有对象指向对象(对象里不能保存地址)。
2)对象可以被多个引用指向(以上面的数组为例,一个数组对象可以由两个引用指向arr和arr1,当然也可以被多个引用指向)
3)操作引用,其实是操作的是引用指向的对象。(Java的引用不需要“显示”的解引用,在以下的操作时就会自动的解引用:
(1)[]取下标(数组独有)
(2)“.”的访问操作也会自动解引用)
4)给引用加上final关键字,此时这个引用的指向就不能被修改。
Java中的null,空引用,这个引用啥对象都没有指向,无法对null引用进行“解引用操作”。没有任何规范描述null里面对应的地址一定是0。若对空引用解引用,则会抛出空指针异常。
如果不解引用,就不会出现这样的异常。内置类型不能用null。
修改引用中保存的地址:以上面的数组为例。=不解引用。
int [] a={
1,2,3,4,5};
int [] b=null;
b=a;//让b指向a目前指向的对象
用“.”操作会解引用
int [] arr={
1,2,3,4,5};
System.out.println(arr.length);
[]也会进行解引用(不过这是数组特有的)
int [] arr={
1,2,3,4,5};
arr[0]=100;
System.out.println(arr[0]);
比较引用中保存的地址是否相同(判断两个引用是否对应到同一个对象中(地址一样,对应的就是两个引用指向同一个对象))
Java中的String的不能直接使用 ==来进行比较内容,因为它比较的引用存放的地址是否相同。因此需要想比较字符串的内容,就需要使用equals方法。
int [] arr={
1,2,3,4,5};
int [] arr2={
2,3,4,5};
if(arr==arr2){
System.out.println(arr[2]);
}else{
System.out.println(arr2[1]);
}
由于arr与arr2指向的对象不同,因此该语句会执行else语句。
1.引用是一种数据类型,用来指向对象
2.对引用进行的大部分操作实际上都是操作该引用指向的对象
3.当多个引用指向同一个对象时,通过哪个引用修改了对象,其他引用都可以看到变化
4.当一个引用不指向对象时,要求访问其指向的对象,就会遇到NUllPointerException