首页 理论教育 Java对象的应用-零基础Java从入门到精通

Java对象的应用-零基础Java从入门到精通

时间:2023-10-19 理论教育 版权反馈
【摘要】:如果两个对象的内容相同,则认为它们的值是相等的。动手写9.2.20其运行结果为:图9.2.7对象引用类型比较示例从上面示例中可以看到,虽然两个赋值语句都是返回一个String对象的引用,但是JVM对两者的处理方式是不一样的。JVM这样处理String也是因为String类型所创建的对象具有不可变性,一旦被创建就永远不能被更改,所以多个引用共用一个对象也不会互相影响。2.对象销毁从创建、使用到最终被销毁,每个对象都有生命周期。

Java对象的应用-零基础Java从入门到精通

1.对象比较

面向对象编程语言中,对象之间的比较有两种形式——值类型比较和引用类型比较。

值类型比较,是指两个对象的值是否相等,比如字符串对象的比较,以及后面章节将要讲到的基本类型包装类对象的比较。如果两个对象的内容相同,则认为它们的值是相等的。因为每个类的父类都是Object类(后面讲继承时会详细介绍),所以Java中会使用类中的equals()方法来比较两个对象的内容是否相等。

动手写9.2.19

其运行结果为:

图9.2.6 对象值类型比较示例

引用类型比较,是指两个对象在内存空间的存储地址是否相同。引用类型比较直接使用运算符“==”来进行比较。

动手写9.2.20

其运行结果为:

图9.2.7 对象引用类型比较示例(www.xing528.com)

从上面示例中可以看到,虽然两个赋值语句都是返回一个String对象的引用,但是JVM对两者的处理方式是不一样的。对于第一种“String name1 = "对象值1"”,JVM会首先在内部维护的String对象池中通过equals()方法查找是否存放着该String对象,如果有就直接返回该引用,并且不会在堆中创建该对象,如果没有则在堆中新建一个对象,并将其引用添加到对象池中,同时将引用返回给变量。对于第二种“String name3 = new String("对象值1")”,JVM会马上在堆中创建一个String对象,然后将该对象的引用返回给用户,这种情况下JVM是不会主动把该对象放到对象池里的。因此,我们才会看到示例的运行结果是:name1和name2是相同的引用,而与name3、name4都是不同的引用。当然,对于自定义的Person类的对象,并不会出现这种情况。

JVM这样处理String也是因为String类型所创建的对象具有不可变性,一旦被创建就永远不能被更改,所以多个引用共用一个对象也不会互相影响。

2.对象销毁

从创建、使用到最终被销毁,每个对象都有生命周期。在使用对象时,最关键的一个问题就是对象被创建后在什么时候其生命周期会结束,同时分配给这个对象的内存空间也会被系统收回。

Java并不像C++语言提供了析构函数,后者可以用析构函数将对象销毁(在C++中,销毁对象必须用到这个函数),并且保证对象一定会被销毁。Java语言提供了垃圾回收机制,允许在类中定义一个名为finalize()的方法(本身是Object类中的方法,权限被定义为protected)。如果系统准备对一个对象的内存存储空间进行释放,首先会调用finalize()方法,并且在下一次垃圾回收动作真实发生时才会真正将对象销毁。

Java中,当出现以下两种情况时,垃圾回收机制会将一个对象销毁:

(1)对该对象的引用超过了作用域,如在循环代码块里声明了一个对象,当循环代码结束时,该对象也会被销毁;

(2)该对象被赋值为null。

但是,Java垃圾回收机制也有特殊情况。如果对象(并没有使用new创建)获得了一块特殊的内存存储空间,由于垃圾回收机制只会释放由new关键字分配对象的内存,这种对象不会被销毁,也就是说对象并不是完全都会被垃圾回收。

Java中提供了System.gc()方法来强制进行终结动作,使垃圾回收动作执行。不过,一般情况下,开发者并不会在代码中去手动执行这些操作,而是交由垃圾回收机制去完成这些后台操作。

提示

垃圾回收机制也是需要内存的,当计算机内存资源因为系统异常被耗尽时,垃圾回收就不会被执行

Java的垃圾回收机制原理较为复杂,涉及Java最底层虚拟机的处理原理,对此感兴趣的读者可以深入阅读Java虚拟机的相关书籍做进一步了解。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈