什么是引用
java8种基本类型:byte/short/int/long/float/double/char/boolean
不属于8种基本类型的所有类型都是引用类型(reference type),引用类型包括的主要实体有字符串、数组和文件流
引用变量如下:
java不允许引用基本变量(基本变量即数据类型为8种基本类型的变量)
引用变量只存储地址
对象和引用基础
- 在Java中,对象是任何非基本类型的实例。
- 基本类型的处理是按值的,即基本变量的假定值就存储在这些变量中,在赋值过程中,是从基本变量复制到基本变量。
- 引用变量存储的是对变量的引用(变量存储的地址),实际对象存储在内存的某处,而引用变量存储对象的内存地址
- 引用变量与基本变量的行为是不同的
点(.)运算符
点运算符用于选择用于对象的方法。
double theArea = theCircle.area() //area是theCircle对象的一个方法,用于计算面积,并将存储在double类型的theArea变量中
注:theCircle可能存储着null引用(即所存地址不指向任何对象的地址),这种情况下,应用点运算符将会产生NullPointerException错误,导致异常终止
对象的声明
当声明引用变量时,只是提供一个名称,名称用来引用存储在内存中的对象
Button b; //声明一个Button类型的引用变量b,此时存储在b中的值为null
b.setLable("NO"); //error,此行代码在试图改变不存在的对象
分配对象唯一的常用方式是new
Button b; //b是一个Button类型的引用对象,Button对象可以通过b引用
b = new Button(); //创建新对象,b引用已分配的对象
b.setLable("NO"); //将b的标签设为"NO"
也可以将声明和创建对象结合在一起
Button b = new Button();
垃圾回收(garbage collection)
- 在java中,当创建的对象不再被任何对象变量引用时,会自动回收这些对象占用的内存
- java虚拟机保证,一旦通过引用链无法访问一些对象,而运行时系统(java虚拟机)判断可用内存不足,那么会回收这些对象的内存
=的含义
a = b;
- 若ab为基本变量:将b的值复制到a里,随后对a或b进行操作对彼此都没有影响
- 若ab为引用变量:将b里存储的地址复制给a(即ab指向相同的对象),随后对a或b的操作对彼此都有影响
例子
假设需要两个Button对象,通过创建noButton得到第一个对象,然后修改noButton来创建yesButton
Button noButton = new Button("NO");
Button yesButton = noButton; //yesButton只是上一行创建对象的另一个名称
yesButton.setLable("YES"); //将拥有两个名称(yesButton/noButton)的对象标签值改为YES
注:对于对象来说,=是引用赋值不是对象复制,对象复制是要clone方法
数组
声明、赋值和方法
数组的声明
int [] array;
array = new int [100];
for(int i=0;i<array.length;i++){
array[i] = new Button();
}