初识Java(Java类和对象-对象的引用)

一、对象的引用

    在 Java 语言中尽管一切都可以看做对象,但真正的操作标识符实质上是一个引用,那么引用在 Java 中是如何体现的呢?

    语法 :类名  对象引用名称

    eg : Book book;

    通常一个引用不一定需要有一个对象相关联。

    引用与对象相关联的语法 : 

Book book = new Book();

    Book :类名

    book :对象

    new :创建对象操作符

    引用只是存放一个对象的内存地址,并非存放一个对象,严格地说引用和对象是不同的,但是可以将这种区别忽略,如可以简单地说 book 是 Book 类的一个对象,而事实上应该是 book 包含 Book 对象的一个引用。

二、对象的比较

    在 Java 语言中由两种对象的比较方法,分别为 “ == ”运算符与 equals() 方法。实质上这两种方式有着本质区别。

    eg :创建类,说明“ == ”运算符 与 equals() 方法的区别

扫描二维码关注公众号,回复: 150575 查看本文章
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()  方法强制启动垃圾回收器,告知垃圾回收器进行清理。




猜你喜欢

转载自blog.csdn.net/js940814/article/details/80056808