常用类-Object类

Object类

概念

  • 超类、基类,所有类的直接或间接父类,位于继承树的最顶层。
  • 任何类,如果没有书写extends显示继承某个类,都默认直接继承Object类,否则为间接继承。
  • Object类中所定义的方法,是所有对象都具备的方法。
  • Object类型可以存储任何对象。
    • 作为参数,可接受任何对象。
    • 作为返回值,可返回任何对象。

方法摘要

JDK官方文档中的方法摘要

方法介绍

这里只讲getClass()equals()hashCode()toString()finalize()这5个方法,其他方法后面用到了再讲

getClass()
  • 源码,返回值为Class

    public final Class<?> getClass(){}

  • 返回引用中存储的实际对象类型

  • 应用:通常用于判断两个引用中实际存储对象类型是否一致

    • 学生类

      package com.ciao.classDemo.demo01;
      public class Student {
          private String  name;
          private int age;
          public Student(String name, int age) {
              this.name = name;
              this.age = age;
          }
          public String getName() {
              return name;
          }
          public void setName(String name) {
              this.name = name;
          }
          public int getAge() {
              return age;
          }
          public void setAge(int age) {
              this.age = age;
          }
      }
      
    • 测试类

      package com.ciao.classDemo.demo01;
      public class Test {
          public static void main(String[] args) {
              //创建实例
              Student s1 = new Student("言身寸", 23);
              Student s2 = new Student("雨山夆", 23);
              //获取实例存储对象的类型
              Class s1Class = s1.getClass();
              Class s2Class = s2.getClass();
              //判断是否一致
              Boolean flag = s1Class==s2Class;
              System.out.println("s1与s2类型是否一致?"+ flag);
          }
      }
      
hashCode()
  • 源码,返回值为int

    public int hashCode(){}

  • 返回该对象的哈希码值

  • 哈希值根据对象的地址字符串数字使用hash算法计算出来的Int类型的数值

  • 一般情况下相同对象返回相同哈希码

    接上一个实例

    package com.ciao.classDemo.demo01;
    public class Test {
        public static void main(String[] args) {
            //创建实例
            Student s1 = new Student("言身寸", 23);
            Student s2 = new Student("雨山夆", 23);
            //获取实例的哈希值,int类型
            int s1Hash = s1.hashCode();
            int s2Hash = s2.hashCode();
            //判断哈希值是否一致
            Boolean flag2 = s1Hash==s2Hash;
            System.out.println("s1:"+s1Hash+"与s2:"+s2Hash+"是否一致?"+ flag2);
            //新建一个实例s3等于s1,发现s3的哈希值与s1一致,指向地址一致
            Student s3 = s1;
            System.out.println(s3.hashCode());
        }
    }
    

    输出

    s1:1735600054与s2:21685669是否一致?false
    1735600054
    
toString()
  • 源码

    类型为String,返回值包括类名+@+哈希值十六进制

    public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }
    
  • 返回该对象的字符串表示(表示形式,类名字+哈希值十六进制),可重写该方法,变成你想要的字符串形式(展示对象的各个属性值)

    • 未重写返回值

      代码

      System.out.println(s1.toString());
      System.out.println(s2.toString());
      

      输出

      com.ciao.classDemo.demo01.Student@677327b6
      com.ciao.classDemo.demo01.Student@14ae5a5
      
    • 重写后返回对象的各个属性

      这里使用快捷重写

      @Override
      public String toString() {
          return "Student{" +
                  "name='" + name + '\'' +
                  ", age=" + age +
                  '}';
      }
      

      代码

      System.out.println(s1.toString());
      System.out.println(s2.toString());
      

      输出

      Student{name='言身寸', age=23}
      Student{name='雨山夆', age=23}
      
equals()
  • 源码

    返回值类型为boolean值,判断两个对象指向的地址是否一致

    public boolean equals(Object obj) {
        return (this == obj);
    }
    
  • 可进行重写,比较两个值的内容是否相同

    • 未重写,输出为false

      package com.ciao.classDemo.demo01;
      
      public class Test {
          public static void main(String[] args) {
              //创建实例
              Student s1 = new Student("雨山夆", 23);
              Student s2 = new Student("雨山夆", 23);
              //判断两个内容一样的对象是否相等
              System.out.println(s1.equals(s2));
          }
      }
      
    • 重写后再比较,输出为true

      @Override
      public boolean equals(Object obj) {
          //1.比较两个引用是否指向同一个对象
          if(this==obj){
              return true;
          }
          //2.判断obj是否是null
          if(obj == null){//非空性
              return false;
          }
          //3.判断两个引用指向的实际对象类型是否一致
          /*
          if(this.getClass()==obj.getClass()){}
          */
          if(obj instanceof Student){//instanceof  判断对象是否是某种类型
              //4.强制类型转换
              Student s = (Student) obj;
              //5.依次比较各个属性值是否相等
              if(this.name.equals(s.getName())&&(this.age==s.getAge())){
                  return true;
              }
          }
          return false;
      }
      
  • equals()==的区别

    https://blog.csdn.net/qq_36522306/article/details/80550210

    https://www.cnblogs.com/zjc950516/p/7877511.html

finalize()
  • 源码

    protected void finalize() throws Throwable { }
    
  • 当对象被判定为垃圾对象时,由JVM自动调用此方法,以标记垃圾对象,进入回收队列

  • 垃圾对象:没有有效引用指向此对象时,为垃圾对象

  • 垃圾回收:由GC销毁垃圾对象,释放数据存储空间

  • 自动回收机制:JVM内存耗尽,一次性清空所有垃圾对象

  • 手动回收机制:使用System.gc();通知JVM执行垃圾回收

  • 测试:

    • 重写finalize()方法,使其输出谁被回收了

      @Override
      protected void finalize() throws Throwable {
          System.out.println(this.name+"被回收了~");
      }
      
    • 被引用的对象不会被回收,未被引用的对象被回收

      package com.ciao.classDemo.demo01;
      public class Test {
          public static void main(String[] args) {
              //创建实例
              Student s1 = new Student("aaa", 1);
              Student s2 = new Student("bbb", 1);
              new Student("ccc", 1);
              //回收垃圾
              System.gc();
              System.out.println("已执行回收垃圾!");
          }
      }
      

      输出

      com.ciao.classDemo.demo01.Test
      已执行回收垃圾!
      ccc被回收了~
      
      Process finished with exit code 0
      

posted on 2020-09-09 17:34  C1ao  阅读(88)  评论(0)    收藏  举报