标题:
在Java中实现对象比较的几个相关概念
[打印本页]
作者:
qingqing3721
时间:
2011-8-29 02:51
标题:
在Java中实现对象比较的几个相关概念
一、跟对象比拟的几个相关的概念
为了愈加审核的理解对象比拟的含义以及多个比拟方法之间的差异,笔者认为读者首先需要理解几个相关的概念,或者说几对关系。
一是类与对象的关系。类是详细的抽象,而对象是类的详细完成。这可能听起来还是有点模糊。做一个形象的比喻,类就好像是用来制作塑料盒子的模具,只需将PVC料注入到这个模具中就可以消费对应外形的盒子。而对象就好像是消费出来的盒子。虽然模具同一个,但是消费出来的盒子彼此之间仍然是不同的。一方面后天性就是不同的。因为依据绝对论可以说明世界上没有两个相反的东西。其次后天性的影响,也会招致其不同。如消费出来后,在两个盒子上辨别贴上不同的条码,他们两个就代表不同的盒子了。理解这个类与对象之间的关系,对于理解对象之间停止比拟,会有很大的协助。
二是需要知道类与对象在内存中的实践存储情况。当程序员定义一个类时(不含有静态成员或者变量),一般不会在内存中给其分配一个存储构造。而只有定义对象时,才会在内存中分配存储构造。当应用同一个类定义不同的对象时,系统会在内存中为不同的对象创立不同的存储构造。也就是说,会对应不同的内存地址。虽然同一个类中定义出来的对象,其内容可能相反(成员变量、成员方法等等都相反),但是其内存中的地址仍然是不同的。
三是需要注意对象的复制问题。假设要创立几个内容相反的对象,即复制相反内容的对象,现在主要有两种方法。一是通过成员变量赋值来完成。如在依据同一个类创立对象时,辨别给与他们相反的初始化值。那么这两个对象的内容就是相反的。二是通过地址赋值来完成。即将第一个对象在内存中的地址赋值给第二个对象。此时两个对象名字虽然不同,但是他们却指向内存中的同一块区域。此时就好像一团体有两个名字,其实是同一团体。所以这两个对象内容也就相反了。
二、应用==运算符与equals方法来比拟对象
在Java语言中,主要可以应用==运算符(两个等号)和equal函数来对对象停止比拟。不过这两个符号其完成的机制不同。或者说,对于异样的两个对象,假设应用他们来停止比拟的话,往往会有不同的后果。如String是Java自定义的对象,其主要用来存储字符串数据。现在笔者应用如下语句定义了三个String对象。
Stringstr1=newString(“welcome”);//创立一个对象,给应用单词welcome初始化 Stringstr2=newString(“welcome”);//创立一个对象,给应用单词welcome初始化 Stringstr3=str1;//创立一个对象,并应用对象str1的地址赋值
以上三个对象,不言而喻,其内容都是相反的。但是应用这个两种方式来对他们停止比拟的时候,往往会有不同的后果。如应用==(两个等号)比拟符号来停止比拟,str1==str2,最后前往的构造是false,
康纽莱液体钙
也就是他们是不相反的对象。可是假设比拟str1==str3对象,则最后前往的后果却是true。但是应用equal函数来比拟,则前往的后果是相反的。为什么对象的内容相反,它们前往的后果却是不同的呢?
要答复这个问题,就需要大家先回忆一下笔者下面谈到的几对关系。首先,对象str1与对象str2的关系,就好像是同一个模具出来的两个盒子,他们从外观看起来虽然相反,但是通过缩小镜或者其他精细仪器仍然可以看到,两个盒子是不同的东西。这两个对象虽然内容相反,但是其在内存中分配的地址不同。也就是说,是同一个模具出来的外观看起来相反的不同的盒子。而对象str1与对象str3就好像是一团体有两个名字。虽然名字不同,但是实践上是同一团体。这主要是因为他们的身份证号码相反。其实这个身份证号码就好像是内存中发配的地址,而对象名字就好象是人的名字。一团体可以有好几个名字(一个对象有好几个名字),但是其身份证号码只有一个(内存分配地址只有一个)。在下面的语句中,通过str3=str1,其完成的功能,并不是将对象str1的值赋值给对象str3。而是将对象str1在内存中的地址赋值给了对象str1(就好像是将一团体的身份证号码复制给了另外一团体)。所以从本质上说,str3并不是一个新树立的对象。因为系统并没有在内存中为其分配一个新的存储区域(即并没有发明一个新的人),而只是好像给对象另外取了一一般名。
欢迎光临 编程开发论坛 (http://bbs.lihuasoft.net/)
Powered by Discuz! 6.0.0