引用与对象
引用可以被理解为一种指针,把它指向哪个对象,它就代表哪个对象。
/**声明一个引用mc,该引用的类型为Myclass类型,
*利用Myclass()方法创建了一个Myclass对象,
*把创建的myclass对象赋值给mc引用*/
Myclass mc = new Myclass();
/**引用的声明不一定被赋予一个对象,也可以是一个空引用*/
Myclass mc = null;
引用相等与对象相等的判断
引用相等与对象相等是两个完全不同的概念:
(1)引用是否相等的判断标准为两个引用是否指向同一个对象,判断方法为“引用1==引用2”,如果两个引用指向同一个对象,表达式的值为true,否则为false
(2)两个对象相等的判断得使用equals()方法,Java中所有的类都继承了Object类的方法,当中的public boolean equals(Object o)方法用来判断目标o所引用的对象与当前对象是否相等,如果相等则返回ture,不相等则返回false
package Liu;
class ObjectA{
private int i;//私有属性i
public ObjectA(int n) { //带参数的对象构造方法
i = n;
}
public boolean equals(Object o) { //重写equals方法
if(o instanceof ObjectA) {
if(i == ((ObjectA) o).i)
return true;
}
return false;
}
}
public class ObjectEquals {
public static void main(String[] args) {
// TODO Auto-generated method stub
ObjectA r1 = new ObjectA(1);
ObjectA r2 = r1;
System.out.println("r1,r2为同一对象时:"); //r1,r2为同一对象时
System.out.println("r2 == r1:" + (r2 == r1));
System.out.println("r2.equals(r1):" + (r2.equals(r1)));
r2 = new ObjectA(1);
System.out.println("r1,r2为不同对象但是对象相等时:"); //r1,r2为不同对象但是对象相等时
System.out.println("r2 == r1:" + (r2 == r1));
System.out.println("r2.equals(r1):" + (r2.equals(r1)));
r2 = new ObjectA(2);
System.out.println("r1,r2为不同对象时:"); //r1,r2为不同对象时
System.out.println("r2 == r1:" + (r2 == r1));
System.out.println("r2.equals(r1):" + (r2.equals(r1)));
}
}
/**输出如下:
* r1,r2为同一对象时:
*r2 == r1:true
*r2.equals(r1):true
*r1,r2为不同对象但是对象相等时:
*r2 == r1:false
*r2.equals(r1):true
*r1,r2为不同对象时:
*r2 == r1:false
*r2.equals(r1):false
*/
上述代码能够很好的说明引用比较和对象比较在本质上的不同,引用是否相等是指引用的对象是否为同一个对象,对象是否相等是指对象是否完全相同,引用相等一定能得出对象相等,对象相等不一定引用相等
对象的销毁与内存回收
当内存不足或者调用System.gc()方法时,Java内置垃圾清理器会释放所有不可用的对象内存
Java如何判断对象已弃用
每个对象都用被引用的次数记录,当对象的引用次数为0时,该对象就成了不可用对象,发生垃圾清理时会释放掉对象内存。
垃圾清理器finalize()方法
在对象被垃圾清理器清理时,也许会设计并执行一些代码来释放该对象的相关资源,finalize()方法就提供了这样的功能,在类中可以重写该方法或者直接调用该方法来进行垃圾清理。
System.gc()方法
除非调用System.gc()方法,否则Java内部垃圾清理器只在内存不足的时候才会清理不可用的对象