------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------
Object
1). Object类的基本特点
(1). Object类在Java整个继承体系中的位置
[1]. Object类位于整个Java继承体系的根节点。
[2]. 所有的类都直接或者间接地继承了这个类。
[3]所有的类都具有Object类中定义的属性和方法
[4]. 有的时候,尽管没有写一个类具体继承哪个类,这个类也会默认继承Object类。
【默认继承】指的就是某个类不通过关键字extends就可以继承Object这个类。
(2). Object类的构造方法
查询Object类的源码可知:Object类中没有显式的构造方法。这样可以推断出,JVM会为Object添加上一个默认的空参构造方法。public Object(){}
【注意】由于Object是所有类的根父类,Object类中的第一行没有super()语句
2).Object类的常用方法
(1). equals()方法
[1]. equals()方法的作用:Java认为所有的对象都具有比较性,都可以比较两个对象是否相同
[2]. equals()方法的源码:
public boolean equals(Object obj) {
return (this == obj);
}
所以:原生的Object的equals方法是调用比较运算符 ==比较两个对象的地址是否一致。
[3]. equals()方法的参数:是Object类本身的引用
由于equals(Object obj)参数来的事根父类Object的引用 obj, 所以Object类的对象可以和任意类的对象进行比较。比较的是二者的地址值是否一致。
【注意】:单纯的比较两个对象的地址是没有意义的,所以子类经常重写Object类的equals方法来进行根据特殊条件进行对象的比较。
[4]. 子类重写Object类的equals方法需要注意的事项
重写的时候一定要注意equals方法的参数是Object obj类型的引用变量。绝对不可以是其他类型的变量。因为这样的话,和父类Object的equals方法名相同,但是参数列表不同,javac认为是重载。当底层方法真的要调用equals方法的时候,不会调用你重载的equals方法,使得原本打算重载的equals方法失去了意义。
public boolean equals(Demo d){ //错误的重写!!!
…
}
这样不是重写Object类的方法,一旦这样写完,底层调用不到这个重写的
public boolean equals(Object obj){//正确的重写
…
}
(3). hashCode()方法
[1]. hashCode()方法的作用:每个对象都有自己的内存地址值,可以映射为Hash码。Java中用hashCode()方法获取对象在内存中映射的哈希码。
[2] hashCode()方法的源码:
public native int hashCode();
这个方法是一个本地化方法,用native关键字来修饰。这个方法要调用操作系统底层的代码。分配内存地址是有OS来决定的。所以是本地化方法,看不到里面的源码。
注意:
1、如果两个对象相同,那么它们的hashCode值一定相同;
2、如果两个对象的hashCode相同,它们并不一定是相同对象 。
前者是因为根据api中object的hashcode方法的描述中写道:如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果。
后者举例说明String类String s1="abc" String s2=new String("abc") 我们知道s1和s2不是同一个对象,但是他们的hashcode值是相同的。
(4). toString()方法
[1]. toString()方法的作用:打印这个对象的hash码值和类名
[2]. toString()方法的源码:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
{1}. hashCode()返回的是哈希码的十进制值,这里面将其转化为十六进制的字符串。
{2}. Object的toString返回值是getClass()和hashCode()拼接出来的