• Java Object 类


    1.什么是 Object 类

    • Object 类是干嘛的?

    • 是谁的爹?

      • 除了基本类型(primitive types)和接口所有人的爹。为什么它不是接口的爹?Object表示我不想当你爹
      • 还是所有数组的爹,不管是对象数组,还是基本类型数组都一样
    • 在没有指明超类的情况下,默认继承Object类,因而不需要特别去写public class Daddy extends Object

    2.Object 类的所有方法

    变量和类型 方法 描述
    protected Object clone() 创建并返回此对象的副本。
    public boolean equals(Object obj) 指示某个其他对象是否“等于”此对象。
    protected void finalize() 已过时。 最终确定机制本质上存在问题。
    public final Class getClass() 返回此 Object的运行时类。
    public int hashCode() 返回对象的哈希码值。
    public String toString() 返回对象的字符串表示形式。
    public final void notify() 唤醒正在此对象监视器上等待的单个线程。
    public final void notifyAll() 唤醒等待此对象监视器的所有线程。
    public final void wait() 导致当前线程等待它被唤醒,通常是 通知中断
    public final void wait(long timeoutMillis) 导致当前线程等待它被唤醒,通常是 通知中断 ,或者直到经过一定量的实时。
    public final void wait(long timeoutMillis, int nanos) 导致当前线程等待它被唤醒,通常是 通知中断 ,或者直到经过一定量的实时。

    3.equals()方法

    • equals() 方法具有的特性

      • 自反性:对于任何非空引用 x, x.equals(x) 应该返回 true

      • 对称性: 对于任何引用 xy, 当且仅当 y.equals(x) 返回 true , x.equals(y) 也应该返回 true

      • 传递性: 对于任何引用 xyz, 如果 x.equals(y) 返回truey.equals(z) 返回 true, x.equals(z) 也应该返回 true

      • 一致性: 如果 xy 引用的对象没有发生变化,反复调用 x.equals(y) 应该返回同样的结果。

      • 对于任意非空引用 x, x.equals(null) 应该返回 false

    • 如何正确的写一个 equals() 方法,给出实例

      @Override
      public boolean equals(Object otherObject){
          //检测 otherObject 是否引用同一个对象
          if(this == otherObject) return true;
          //检测 otherObject 是否为 null,如果为 null,返回 false
          if(otherObject == null) return false;
          //比较 this 与 otherObject 是否属于同一个类
          if(getClass() != otherObject.getClass()) return false;
          //将 otherObject 转换为相应的类类型变量
          ClassName other = (ClassName) otherObject;
          //现在开始对所有需要比较的域进行比较了。使用 == 比较基本类型域,使用 equals 比较对象域。
          //如果所有的域都匹配, 就返回 true; 否则返回 false。
          return field1 == other.field1
                  &&Object.equals(field2,other.field2)
                  &&...;
      }
      

      如果在子类中重新定义 equals ,就要在其中包含调用 super.equals(other)

      对于数组类型的域,可以使用静态的 Arrays.equals 方法检测相应的数组元素是否相等

    4.hashCode 方法

    • 什么是 hash code ?

      散列码( hash code ) 是由对象导出的一个整型值(其值由一个hash函数计算得来)。散列码是没有规律的。如果 x 和 y 是两个不同的对象, x.hashCode( )y.hashCode( ) 基本上不会相同。

    • hashCode() 的一般规则

      • 只要在执行Java应用程序期间多次在同一对象上调用它,hashCode方法必须始终返回相同的整数,前提是不修改对象上的equals比较中使用的信息。 从应用程序的一次执行到同一应用程序的另一次执行,该整数不需要保持一致。
      • 如果两个对象根据equals(Object)方法相等,则对两个对象中的每个对象调用hashCode方法必须生成相同的整数结果。
      • 不是必需的:如果两个对象根据不相等equals(java.lang.Object)方法,然后调用hashCode在各两个对象的方法必须产生不同的整数结果。 但是,程序员应该知道为不等对象生成不同的整数结果可能会提高哈希表的性能。
    • 如果重新定义 equals方法,就必须重新定义 hashCode 方法

      原因未知,等了解后补。

    • 怎么给类重写 hashCode() 方法

      public int hashCode(){
          return Objects.hash(Object... objects);
      }
      

    5.toString 方法

    • toString 干嘛用的

      返回对象的字符串表示形式。

    • 建议所有子类都覆盖此方法。若没有覆盖,返回字符串是什么样子的?

      getClass().getName() + '@' + Integer.toHexString(hashCode())

      若 Employee 类直接调用 toString() 方法返回的结果可能为Employee@c0001041

    • 重写 toString() 方法实例

      /**
      * Employee e = new Employee("hrm",5000,1998,11,11);
      * 输出为 Employee[name=hrm,salary=5000.0,hireDay=1998-11-11]
      */
      public String toString(){
          return getClass().getName()
      	+ "[name=" + name
      	+ ",salary=" + salary
      	+ ",hireDay=" + hireDay
      	+ "]";
      }
      

      若超类使用了 getClass().getName(),那么子类只要调用 super.toString()就可以了。

    • 只要对象与一个字符串通过操作符“ +” 连接起来,Java 编译就会自动地调用 toString方法,以便获得这个对象的字符串描述。

    • 数组的特殊

      数组虽然继承了 Object 类的 toString 方法,但他还是要按照旧的格式打印

      /**
       * 数组将按旧格式输出打印
       *  [I 表明是一个整数数组
       * @param arr {2,3,5,7,11,13}
       * @return  [I@180bc464  
       */
      public String arraysToString(int[] arr){
          return "" + arr;
      }
      

      改进方式,采用 Arrays.toString 方法

      /**
       * 采用 Arrays.toString(arr);
       * @param arr {2,3,5,7,11,13}
       * @return [2, 3, 5, 7, 11, 13]
       */
      public String arraysToStringNew(int[] arr){
          return Arrays.toString(arr);
      }
      

      如果想打印多维数组,需要调用 Arrays.deepToString()方法

  • 相关阅读:
    HttpModule,HttpHandler,HttpHandlerFactory
    IHttpModule实现URL重写
    HttpModule与HttpHandler详解
    IHttpModule接口
    VS中新建网站和新建项目web应用程序的区别?(实际应用总结一点)
    slf4j简介
    SQL条件表达式
    Windows命令查看文件MD5
    Final对象
    Seasar2框架:AOP
  • 原文地址:https://www.cnblogs.com/huaranmeng/p/12783573.html
Copyright © 2020-2023  润新知