面向对象之8:Object类 、 Objects 类、== 和equals()方法 的总结:

目录

Object 类:

Object中子类经常重写的几个方法:

toString()方法:

equals()方法:

== 和 equals() 的区别:

String类 重写后的equals() 方法解读:

hashCode()方法:

finalize()方法:

Objects类:

Objects类的常用API:


Object 类:

  1. 所有的类都 直接 或者 间接 的 继承自Object类,换言之,Object类是所有Java类的根基父类(包括 数组 和 接口的 实现类 和 抽象类)。
  2. 也就说明每个Java类 都拥有 Object的所有 可访问的 属性和方法。
  3. 如果在 类的声明中 未使用 extends 关键字指明其父类,那么 会 默认隐式的 继承自Object 类。相当于 javac.exe 编译器 在编译的时候 会默认在 类的声明后面 加上 extends Object。

Object中子类经常重写的几个方法:

  • toString()方法:

    • Object 源码:
    • API 释义:
    • 如果只是输出或者拼接对象引用时 默认都会调用toString方法:
    • 一般希望看到是对象的具体的属性的内容,而不是对象的地址,那么这时候就需要重写toString方法:
      @Override
          public String toString() {
              return "People{" +
                      "name='" + name + '\'' +
                      ", age=" + age +
                      ", sex=" + sex +
                      ", hobby='" + hobby + '\'' +
                      '}';
          }


  • equals()方法:

    • == 和 equals() 的区别:

      • == 是一个比较运算符
        1. == : 既可以比较基本类型,也可以比较引用类型。
        2. == :如果比较的基本类型,比较的是具体的值是否相等。
        3. == :如果比较的引用类型,比较的是地址值是否相等,就是比较是不是同一个对象。
      • equals() 方法:
        1. 是Object类的一个实例方法,只能判断引用类型。
        2. Object类默认判断是 对象与对象之间的地址值是否相等 ,,子类往往都会重写该方法,用于判断具体的内容是否相等。比如 Stirng类、Integer类
  • String类 重写后的equals() 方法解读:

    public boolean equals(Object anObject) {
            // 传入进来要比较 的字符串对象 和 被当前被比较的字符对象是否为同一个对象
            if (this == anObject) {
                return true;
            }
            // 传入进来的要比较的字符串对象 是否为 String 类型
            if (anObject instanceof String) {
                // 向下转型 至 String
                String anotherString = (String)anObject;
                // 被比较的字符串的长度
                int n = value.length;
                // 要比较的字符串长度 和被比较的字符串长度 是否一致
                if (n == anotherString.value.length) {
                    // 被比较的字符串 隐式调用 toCharArray 方法转成char 数组 
                    char v1[] = value;
                    // 要比较的字符串 隐式调用 toCharArray 方法转成char 数组 
                    char v2[] = anotherString.value;
        
                    int i = 0;
                     // 如果 要比较的字符串的长度不为0   
                    while (n-- != 0) {
                        // v1数组每个索引上的字符对应 v2每个索引上的字符进行比较
                        if (v1[i] != v2[i])
                            return false;
                        i++;
                    }
                    return true;
                }
            }
            return false;
        }

     

  • People类 重写equals方法:

     @Override
        public boolean equals(Object o) {
            // 要比较和被比较的 对象是同一个
            if (this == o) return true;
            // 如果 要比较的对象为 null 或者 被比较与要比较的类型不一致。
            if (o == null || getClass() != o.getClass()) return false;
            // 向下转型
            People people = (People) o;
            return age == people.age &&
                    sex == people.sex &&
                    // 要比较的属性 与被比较的属性相同 或者 要比较的属性不等于空 且 被比较的属性的地址值完全一样。
                    Objects.equals(name, people.name) &&
                    Objects.equals(hobby, people.hobby);
        }

  • hashCode()方法:

    • 源码:是个本地方法:
    • API释义:

      • hashCode()方法:提高具有哈希结构的容器的效率。
      • 两个引用,如果指向的是同一个对象,哈希值肯定是一样的。
      • 两个引用,如果指定的是不同对象,(在不是很大的范围内。)哈希值是不一样的
      • 哈希值主要根据对应的内存地址值来的。不能完全将哈希值等价于地址值。
      • 如果是在集合 中 hashCode  如果有需要的话。也会重写。
  • finalize()方法:

    • finalize是一个空方法,没有方法体。(基本不会重写,有的面试官 可能会问。)
      • 作用:对象被GC回收时,JVM将会自动调用该对象的finalize方法,子类可以重写该方法。做一些释放资源的操作,比如:释放数据库连接等 ……。
      • 什么时候回收:当某个对象没有任何引用是,JVM就会认为这个对象是一个垃圾对象。在JVM有空的时候会使用GC机制销毁该对象。在销毁对象前。会先调用finalize方法。
      • GC机制的调用,有JVM决定,也可以通过System.gc() 主动触发GC机制。
      • 代码比如:
        public class PolymorphicTest {
            public static void main(String[] args) {
                FinalizeTest test = new FinalizeTest("JVM invoke finalize Method");
                test = null;
                // 主动触发GC 
                System.gc();
            }
        }
        
        class FinalizeTest {
            private String name;
        
            public FinalizeTest(String name) {
                this.name = name;
            }
        
            @Override
            protected void finalize() throws Throwable {
                System.out.println("this = " + this + ",不再引用,触发GC机制被销毁");
                System.out.println("this.name = " + this.name + ", JVM 调用finalize方法");
            }
        }

        test:


Objects类:

说明Objects类 依然是 Object 类的子类 。Objects类是从JDK1.7版本后才开始有的。

  • Objects类的常用API:

    • ,比较两个对象,源码有效的避免了空指针异常。更安全。
    • ,用于比较数组,二维数组 ,对象。
    • ,……
    • 其他方法

下一篇:面向对象之9:抽象类、final关键字、(JDK1.8之后) 接口 的总结:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值