Java笔记 (五)—— 引用类型

   两个大类
   1.基本类型(4类8种)
   (1)整型:int , short , long , byte
   (2)浮点型:float , double
   (3)字符型:char 
   (4)布尔型:boolean
   2.引用类型

1 引用的理解

1.1引用类型

a.String引用类型
b.数组引用类型
c.自己创建的引用类型

1.2引用是什么

引用本质上,是一个低配指针,可以理解成对象的别名。
(引用对应一小块的内存空间,里面存的就是一个地址,在Java中较少用到地址。)

1.3引用的功能

解引用:不需要使用 * 显示进行(在需要的时候自动进行)
以下操作时会自动解引用:

  1. [ ]取下标(数组独有)
  2. " . "成员访问操作
    比较操作:只能使用 != 和 == 进行比较。

例: 用new来创建一个数组对象,通过arr1这个名字来来访问这个数组中的内容,通过arr1 这个引用,指向一个元素类型是 int 的数组类型对象。

int[] arr1 =new int[]{1,2,3,4};

例:创建一个字符串对象,通过 s 来引用,该引用指向了一个 String 类型的对象。

String s =new String("hello"); //每new一个对象都会在内存中分配一个空间

补充:

String s ="hello";
String s =new String("hello");    
//等价写法,第二个标准,第一个简化

2 引用与对象之间的关系

通过引用可以对对象施加影响。我们通常把这个关系称为:该引用指向该对象。
如下图表示,在这里插入图片描述

(1) 一有三没有:只有引用指向对象,没有对象指向引用;没有引用指向引用,没有对象指向对象。
(2)对象可以被多个引用指向。
(3)操作引用,其实操作的是引用指向的对象

int[] arr1=new int[]{1,2,3,4};
int[] arr2=arr1;  //arr1和arr2引用都指向数组对象,两个名字
System.out.println(arr1[0]);
System.out.println("修改 0 号元素的值");
arr2[0]=100;
System.out.println(arr1[0]);

内存效果:
在这里插入图片描述
对象和引用都占据内存空间,引用占据的内存空间非常小,不能对引用取地址。两个引用对应同一个对象。
运行结果:
在这里插入图片描述
通过其中一个引用进行操作,从其他引用可以“看见”。

3 null 的理解

(1)null,空引用,是什么都不指向,无法对null引用进行“解引用操作”。

int[] arr=null;
System.out.println(arr[0]);         
System.out.println(arr.length);

在这里插入图片描述
针对 空引用 进行了 解引用 操作,抛出NullPointerException,空指针异常。

int[] arr={1,2,3,4};
arr=null;
if(arr == null){
}

在这里插入图片描述
不进行解引用,则不会出现异常
(2)没有任何规范描述 null 里面对应的地址一定是 0 。

4 常引用

(1)代码一:
改变引用arr1,使其也指向整型数组对象{5,6,7,8}

int[] arr1 = new int[]{1,2,3,4};
int[] arr2 = new int[]{5,6,7,8};
arr2 = arr1;  

(2)代码二:
加关键字 final 后,arr1变得不能改变指向

final int[] arr1 = new int[]{1,2,3,4};
int[] arr2 = new int[]{5,6,7,8};
arr2 = arr1;   //报错,arr1指向不可变

(3)代码三:
虽然在加关键字 final 后不可改变指向,但可以改变对象中的内容。

final int[] arr1 = new int[]{1,2,3,4};
arr1[0] = 100;

5 引用的比较操作符理解

int[] a = { 1, 2, 3, 4, 5 };
int[] b = { 1, 2, 3, 4, 5 };
//等价于int[] a=new int[]{1,2,3,4,5}; int[] b=new int[]{1,2,3,4,5}
//注意:每new一个对象都会在内存中分配一个空间,==比较的是地址

a == b; // a 和 b 指向不同的对象,结果是 false
a != b; // a 和 b 指向不同的对象,结果是 true

b = a; // 让 b 指向 a 目前指向的对象
a == b; // a 和 b 指向相同的对象,结果是 true
a != b; // a 和 b 指向相同的对象,结果是 false

a = null;
a == b; // a 不指向对象,b 指向对象,结果是 false
a != b; // a 不指向对象,b 指向对象,结果是 true

b = null;
a == b; // a 和 b 都不指向对象,结果是 true
a != b; // a 和 b 都不指向对象,结果是 false

6 引用支持的操作

(1)" . "成员访问操作[解引用]
(2) [ ] 数组特有的[解引用]
(3)= 修改引用中保存的地址的值
(4)== 比较引用中保存的地址是否相同。(判断两个引用是否对应到同一个对象)
注意:
Java中 String 的比较不能直接使用 = =,要想比较 String 的内容要使用 equals 方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值