13、Object类

------- <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()拼接出来的

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值