• Java- Object根父类


    在java中,所有的类都有一个公共的父类,这个java.lang.Object类
    *  * * Object所有类的根,成为超类。

    1.证明Object是根

    1. public class A_Object01 {
    2. public static void main(String[] args) {
    3. //证明Object是根
    4. //基本数据类型
    5. int a = 0;
    6. Object bytea = 2;
    7. Object shorta = 125;
    8. Object inta = 235;
    9. Object longa = 123455677;
    10. Object floatb = 12.8f;
    11. Object doublea = 123.456;
    12. Object chara = '好';
    13. Object booleana = true;
    14. //引用类型
    15. Object string = "String";
    16. Object arr1 = new String[5];
    17. Object arr2 = new Father[5];
    18. /*
    19. 以上代码段都没有报错 可以证明Object是根
    20. */
    21. }
    22. }//我们创建一个类时,如果没有明确继承一个父类,
    23. // * 那么它就会自动继承 Object,成为 Object 的子类。
    24. class Father {
    25. }

    2.Object类的其中5个方法

    (1)toString()
     ①默认情况下,toString()返回的是“对象的运行时所属类型 @ 对象的hashCode值的十六进制形式"
    ②如果我们直接System.out.println(对象),默认会自动调用这个对象的toString()
    1. public static void main(String[] args) {
    2. // 1.未重写toString方法
    3. /* ToString02 obj1=new ToString02();
    4. System.out.println(obj1.toString());//day0419.arrange_and_summarize.object01.ToString02@1b6d3586
    5. */
    6. /*
    7. * 注意:一般情况下,我们需要的是结果值,而不是地址值。如何获取结果值呢?
    8. * 进行重写toString()方法后就可以拿到结果值
    9. * */
    10. //2.重写toString
    11. ToString02 obj1=new ToString02("重写toString",87);
    12. System.out.println(obj1.toString());//输出ToString02{name='重写toString', age=87}
    13. }
    (2)getClass()

    public final Class getClass():获取对象的运行时类型

    因为Java有多态现象,所以一个引用数据类型的变量的编译时类型与运行时类型可能不一致,因此如果需要查看这个变量实际指向的对象的类型,需要用getClass()方法

    1. public class TestGetClass05 {
    2. public static void main(String[] args) {
    3. /*1. GetClass04
    4. GetClass04 obj1=new GetClass04("GetClass04类",18);
    5. System.out.println(obj1.getClass());//class day0419.arrange_and_summarize.object01.GetClass04*/
    6. //返回该对象对应的类
    7. //2.OBJECT
    8. Object obj2 = new GetClass04("OBJECT类", 18);
    9. System.out.println(obj2.getClass());//class day0419.arrange_and_summarize.object01.GetClass04
    10. //编译时是父类(Object),运行时是子类(Student03)}
    (3)equals()
    1.  重写equals原因
       equals: 用于判断当前对象this与指定对象obj是否“相等”
       ①在默认情况下,equals方法的实现等价于与“==”,比较的是对象的地址值
       ②但是我们想要的是当前对象this与指定对象obj是否“相等”,如何解决呢?
       答:重写equals方法
    1. public class TestEquals07 {
    2. public static void main(String[] args) {
    3. Equals06 obj1 = new Equals06("obj1", 18);
    4. Equals06 obj2 = new Equals06("obj1", 18);
    5. Equals06 obj3 = new Equals06("obj3", 14);
    6. Equals06 obj4 = obj1;
    7. /*1.未重写*/
    8. // 1.1未重写equals
    9. /* System.out.println(obj1.equals(obj2));//false
    10. System.out.println(obj1.equals(obj3));//false
    11. System.out.println(obj2.equals(obj3));//false
    12. System.out.println(obj4.equals(obj1));//true*/
    13. //1.2未重写hashCode方法
    14. /* System.out.println(obj1.hashCode());//460141958
    15. System.out.println(obj2.hashCode());//1163157884
    16. System.out.println(obj3.hashCode());//1956725890
    17. System.out.println(obj4.hashCode());//460141958*/
    18. /*
    19. 注意: 1. 重写equals原因
    20. equals: 用于判断当前对象this与指定对象obj是否“相等”
    21. ①在默认情况下,equals方法的实现等价于与“==”,比较的是对象的地址值
    22. ②但是我们想要的是当前对象this与指定对象obj是否“相等”,如何解决呢?
    23. 答:重写equals方法
    24. */
    25. /*2.重写*/
    26. // 2.1重写equals
    27. System.out.println(obj1.equals(obj2));//true
    28. System.out.println(obj1.equals(obj3));//false
    29. System.out.println(obj2.equals(obj3));//false
    30. System.out.println(obj4.equals(obj1));//true
    31. //2.2重写hashCode方法 重写后使hashcode一致
    32. System.out.println(obj1.hashCode());//105534713
    33. System.out.println(obj2.hashCode());//105534713
    34. System.out.println(obj3.hashCode());//105534713
    35. System.out.println(obj4.hashCode());//105534713
    36. }
    37. }
    (4)hashCode()

    public int hashCode():返回每个对象的hash值。

    如果重写equals,那么通常会一起重写hashCode()方法,hashCode()方法主要是为了当对象存储到哈希表(后面集合章节学习)等容器中时提高存储和查询性能用的,这是因为关于hashCode有两个常规协定:

    • ①如果两个对象的hash值是不同的,那么这两个对象一定不相等;

    • ②如果两个对象的hash值是相同的,那么这两个对象不一定相等。

      1. public class TestHashCode09 {
      2. public static void main(String[] args) {
      3. HashCode08 obj1=new HashCode08("obj1",18);
      4. HashCode08 obj2=new HashCode08("obj1",18);
      5. HashCode08 obj3=obj1;
      6. //1.未重写hashCode方法
      7. /* System.out.println(obj1.hashCode());//460141958
      8. System.out.println(obj2.hashCode());//1163157884
      9. System.out.println(obj3.hashCode());//460141958*/
      10. /*
      11. 如果根据 equals()方法,两个对象是相等的,
      12. 那么对这两个对象中的每个对象调用 hashCode方法都必须生成相同的整数结果;
      13. 而两个hashCode()返回的结果相等,两个对象的equals()方法不一定相等。
      14. */
      15. //2.重写hashCode方法
      16. System.out.println(obj1.hashCode());//105534713
      17. System.out.println(obj2.hashCode());//105534713
      18. System.out.println(obj3.hashCode());//105534713
      19. /*
      20. 注意:
      21. - ①如果两个对象的hash值是不同的,那么这两个对象一定不相等;
      22. - ②如果两个对象的hash值是相同的,那么这两个对象不一定相等。
      23. ( 都是String对象,而且是不同的对象,但是在某种情况下hashcode有可能相等,十进制 位置有限)
      24. */
      25. System.out.println("❤❤❤❤❤❤❤❤❤❤❤❤❤❤");
      26. // ①如果两个对象的hash值是不同的,那么这两个对象一定不相等;
      27. System.out.println("hello".hashCode());// 99162322
      28. System.out.println("kk".hashCode()); //3424
      29. System.out.println("hello".equals("kk"));//false
      30. System.out.println("❤❤❤❤❤❤❤❤❤❤❤❤❤❤");
      31. // ②如果两个对象的hash值是相同的,那么这两个对象不一定相等。
      32. System.out.println("Aa".hashCode());//2112
      33. System.out.println("BB".hashCode());//2112
      34. System.out.println("Aa".equals("BB"));//false
      35. }
      36. }

      总结:

    • 使用hashCode()来比较两个对象是否相等是不合适的,因为确实存在不同的对象具有相同hashCode值的可能性。这种情况被称为哈希冲突,是哈希表等数据结构必须处理的一种情况。

    • 当你需要比较两个对象是否相等时,应该使用equals()方法而不是hashCode()方法。

    • 如果两个对象根据equals()方法是相等的,那么它们的hashCode()方法应该返回相同的值,这是Java对象的一个基本要求。但是,反过来并不成立:即使两个对象的hashCode()值相同,它们也可能不相等。

    • 所以,在编写Java代码时,如果你重写了equals()方法,通常也应该重写hashCode()方法,以确保它们的行为一致。这样可以确保当两个对象根据equals()方法相等时,它们的哈希码也相同,但是,不要仅仅依赖hashCode()来比较对象的相等性。

    (5)finalize() (了解)

    protected void finalize():用于最终清理内存的方法

    面试题:对finalize()的理解?

    • 当对象被GC确定为要被回收的垃圾,在回收之前由GC帮你调用这个方法,不是由程序员手动调用。

    • 这个方法与C语言的析构函数不同,C语言的析构函数被调用,那么对象一定被销毁,内存被回收,而finalize方法的调用不一定会销毁当前对象,因为可能在finalize()中出现了让当前对象“复活”的代码

    • 每一个对象的finalize方法只会被调用一次。

    • 子类可以选择重写,一般用于彻底释放一些资源对象,而且这些资源对象往往时通过C/C++等代码申请的资源内存

    • (6)重写toString、equals和hashCode方法(Alt+Insert)

      建议使用IDEA中的Alt + Insert快捷键,而不是Ctrl + O快捷键。

      3.标准JavaBean

      JavaBean 是 Java语言编写类的一种标准规范。符合JavaBean 的类,要求:

      (1)类必须是具体的和公共的,

      (2)并且具有无参数的构造方法,

      (3)成员变量私有化,并提供用来操作成员变量的setget 方法。

      (4)重写toString方法

  • 相关阅读:
    基于自编码器和LSTM自编码器的心电信号异常检测
    SpringBoot + Jpa 详细使用教程(企业开发使用总结)
    基于Spring、SpringMVC、MyBatis的漫画网站
    pycryptodomex安装过程踩坑解决
    洛谷P4549 裴蜀定理模板
    TI/德州仪器 TPS3808G30DBVT 微处理器
    java计算机毕业设计springboot+vue城市轨道交通线路查询系统
    HTML5学习系列之实用性标记
    关于信息安全软考的记录6
    IOS开发者证书快捷申请
  • 原文地址:https://blog.csdn.net/qq_57884857/article/details/138003159