一、对象的引用
在 Java 语言中尽管一切都可以看做对象,但真正的操作标识符实质上是一个引用,那么引用在 Java 中是如何体现的呢?
语法 :类名 对象引用名称
eg : Book book;
通常一个引用不一定需要有一个对象相关联。
引用与对象相关联的语法 :
Book book = new Book();
Book :类名
book :对象
new :创建对象操作符
引用只是存放一个对象的内存地址,并非存放一个对象,严格地说引用和对象是不同的,但是可以将这种区别忽略,如可以简单地说 book 是 Book 类的一个对象,而事实上应该是 book 包含 Book 对象的一个引用。
二、对象的比较
在 Java 语言中由两种对象的比较方法,分别为 “ == ”运算符与 equals() 方法。实质上这两种方式有着本质区别。
eg :创建类,说明“ == ”运算符 与 equals() 方法的区别
public class Compare { public static void main(String[] args){ String c1 = new String("abc"); //创建 String 型对象引用 c1 String c2 = new String("abc"); //创建 String 型对象引用 c2 String c3=c1; //将 c1 对象引用赋予 c3 //使用 " == " 运算符比较 c2 与 c3 System.out.println("c2==c3的运算结果为:"+(c2 == c3)); //使用 " == " 运算符比较 c1 与 c3 System.out.println("c1 == c3 的运算结果为:"+(c1 == c3)) //使用 equals() 方法比较 c2 与 c3 System.out.println("c2.equals(c3)的运算结果为:"+(c2.equals(c3))); } }
运行结果为 :
c2 == c3 的运算结果为:false c1 == c3 的运算结果为:true c2.equals(c3) 的运算结果为:true
结果中可以看出,“ == ”运算符和 equals() 方法比较的内容是不同的, equals() 方法是 String 类中的方法,它用于比较两个对象引用所指的内容是否相等;而“ == ”运算符比较的是两个对象引用的地址是否相等。由于 c1 与 c2 是两个不同的对象引用,两者在内存中的位置不同,而 String c3 = c1 ; 语句将 c1 的引用赋给 c3 ,所以 c1 与 c3 这两个对象引用是相等的,也就是打印 c1 == c3 这样的语句将返回 true 值。
三、对象的销毁
每个对象独有生命周期,当对象的生命周期结束时,分配给该对象的内存地址将会被回收。在其他语言中西药手动回收废弃对象,但是 Java 拥有一套完整的垃圾回收机制,用户不必担心废弃的对象占用内存,垃圾回收器将回收无用的但占用内存的资源。
主要有两种情况下的对象会被 Java 虚拟机视为垃圾:
( 1 )对象引用超过其作用范围,这个对象将被视为垃圾;
如 :
{ Example e = new Example(); } //在这个大括号外引用对象 e
( 2 )将对象赋值为 null 。
如 :
{ Example e = new Example(); e = null; //当对象被置为 null 时,将消亡 }
虽然垃圾回收机制已经很完善,但垃圾回收器只能回收那些由 new 操作符创建的对象,如果某些对象不是通过 new 操作符在内存中获取一块内存区域,这种对象可能不能被垃圾回收机制所识别,所以在 Java 中提供了一个 finalize() 方法。这个方法时 Object 类的方法,它被声明为 protectd ,用户可以在自已的类中定义这个方法。如果用户在类中定义了 finalize() 方法,在垃圾回收时会首先调用该方法,在下一次垃圾回收动作发生时,才能真正回收被对象占用的内存。
垃圾回收或 finalize() 方法不保证一定发生,如 Java 虚拟机内存损耗待尽时,它是不会执行垃圾回收的。
由于垃圾回收不受人为控制,具体执行期间也不确定,所以 finalize() 方法也就无法执行,为此,Java 提供了 System.gc() 方法强制启动垃圾回收器,告知垃圾回收器进行清理。