ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java Object 类

2020-04-26 23:58:03  阅读:233  来源: 互联网

标签:Java 对象 Object equals hashCode toString public


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()方法

标签:Java,对象,Object,equals,hashCode,toString,public
来源: https://www.cnblogs.com/huaranmeng/p/12783573.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有