Object类
Object是Java默认提供的一个类。Java里面除了object类,所有的类都是存在继承关系的。默认会继承Object父类。即所有类的对象都可以使用Object的引用进行接收(向上转型)。
总结:所有类的父类
toString方法
开始推理toString的功能:
- 首先我们打印了对象,结果输出了demo.Animal@1b6d3586
简单分析一下:demo是包名,Animal是类名,那@1b6d3586是什么东西呢
2. 然后查看一些println这个方法是怎么运行滴!
简单分析一下:接收的实参是父类类型(Object),那String.valueOf是什么作用的方法呢
3. 查看了valueOf方法里面是条件语句
简单解释一下:如果var0不为空,则执行toString方法
4. 查看了toString方法里面是返回这条语句,突然发现这个很像我们刚开始打印对象的格式。
this.getClass().getName() + “@” + Integer.toHexString(this.hashCode());
回到我们一开始的问题这串@1b6d3586数字是什么东西
答:对应上面返回的来看这串数字应该是由hasCode()获得出来的,该方法返回的是对象的哈希值,是16进制的。——可以理解为对象存在的地址
哈哈哈!所以toString方法可以用来打印对象的信息,做法:在类中重写toString方法,在main方法中打印对象,运行结果就会输出重写toString方法中返回的东西
快捷键:右键——>Generate
equals方法
从字面上看,equals英语意思是相同的、相等的。显而易见,这个方法的作用应该是作比较!
因此我在这里就有个疑惑了这个方法是怎么比较的?
因此我敲出以下代码进行比较:
当这里的时候,我和大家心里都是一个大大的问号“?”
第一个大家都理解,就是基本数据类型,比较的是变量中值是否相同,肯定是true。
第二个分析一下,a1和a2是两个不同的对象,所以存在不同的位置(哈希值不同),因此返回的是false
第三个,就是我们今天需要学习的equals方法,但是对应的成员变量的值是相同的,那为什么这里是false呢?
我们简单看一下equals方法
public boolean equals(Object var1) {
return this == var1;//使用引用中的地址直接来进行比较
}
原来如此,equals方法本质还是比较地址,因此打印false。
为了能将equals方法改成能判断对象内容是否相同——重写equals
以下是系统按照成员变量重写的方法——真复杂
这时候输出的就是true了
系统的太复杂啦,咱自己写!
结论:比较对象中内容是否相同的时候,一定要重写equals方法
hashcode方法
回忆一下toString方法的源码:
hashcode()这个方法,帮我们算了一个具体的对象位置存在,这里涉及了数据结构,但是现在还没有学的很深,没法描述,所以我们只能说它是个内存地址。然后调用Integer.toHexString()方法,将这个地址以16进制输出。
注意事项:两个对象的hash值不一样。
像重写equals方法一样,我们也可以重写hashcode()方法。此时我们再来看看。
注意事项:哈希值一样。
结论:
1、hashcode方法用来确定对象在内存中存储的位置是否相同
2、事实上hashCode() 在散列表中才有用,在其它情况下没用。在散列表中hashCode() 的作用是获取对象的
散列码,进而确定该对象在散列表中的位置。