前面编写了好多代码用来创建类对象以及调用相应的方法,但是类不仅仅是这些内容。观察下面代码的输出,了解类和对象的其他特性。
运行结果如下:
com.javadevmap.Person@7852e922
这里使用了public的字段,是为了使代码看起来简单一些,实际项目中不这样使用。在这个例子中,创建了一个person对象,然后调用了toString()方法,但是类里并没有这个方法,这个方法是从哪里来的呢?
这就涉及Java的单根继承结构。在Java中,所有的类都继承自Object类。也就是说除了基本类型,其他类都是一种Object。而toString方法就是Object里的方法,通过类的继承而来。这种单根继承结构也为Java的内存回收提供了很大的便利。
继承听起来很费解,举个例子。例如常用的手机是一种物质,看不见的原子也是一种物质,那么把这些东西的通用性全部抽离出来,用物质这个统称来代替它们是可以的。对于Java语言,这个统称就是Object,所有物质包含的属性,例如大小,重量就相当于Object里的字段或方法。而继承就是在这个统称之上再进行细分,从而凸显自己的特性。
再回到代码中,toString方法其实是把类的内容转化为String进行输出,但好像并没有得到期望输出的内容[12]。是否可以通过某种办法输出期望的数据?代码如下:
运行结果如下:
id=1 name=xiaoming
可以在Person类中重写这个方法,用于替换Object的默认toString实现,从而达到正确输出的目的。(www.xing528.com)
Object还有一个equals()方法,用于对象的比较。通过下面的代码演示这个方法的使用。首先不重写此方法,观察输出的结果。
运行结果如下:
person 1==person 2=false
person 1 equals person 2=false
虽然代码中给创建的两个对象赋的值是相同的,但是无论用“==”比较还是用equals比较,比较的结果都是不同的。下面重写equals方法,再执行程序观察输出的结果。
运行结果如下:
person 1==person 2=false
person 1 equals person 2=true
通过重写equals方法,对对象里的字段值进行比较,字段值相同即两个对象相同,最后两个对象比较的结果是true。那么为什么“==”比较的结果还是false呢?其实“==”比较的是对象的地址,两个对象地址不同所以不同,equals默认的方法比较的也是对象的地址,需要覆盖equals的默认实现才能正确进行比较。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。