初步认识 引用reference 和 对象object
两个大类
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引用的功能
解引用:不需要使用 * 显示进行(在需要的时候自动进行)
以下操作时会自动解引用:
- [ ]取下标(数组独有)
- " . "成员访问操作
比较操作:只能使用 != 和 == 进行比较。
例: 用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 方法。