Object类

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

1. clone()

Object clone() 方法用于创建并返回一个对象的拷贝。

clone 方法是浅拷贝对象内属性引用的对象只会拷贝引用地址,而不会将引用的对象重新分配内存,相对应的深拷贝则会连引用的对象也重新创建。

返回一个对象的拷贝。

由于 Object 本身没有实现 Cloneable 接口,所以不重写 clone 方法并且进行调用的话会发生 CloneNotSupportedException 异常。

class RunoobTest implements Cloneable {

    // 声明变量
    String name;
    int likes;

    public static void main(String[] args) {

        // 创建对象
        RunoobTest obj1 = new RunoobTest();

        // 初始化变量
        obj1.name = "test";
        obj1.likes = 111;

        // 打印输出
        System.out.println(obj1.name); // test
        System.out.println(obj1.likes); // 111

        try {

            // 创建 obj1 的拷贝
            RunoobTest obj2 = (RunoobTest) obj1.clone();

            // 使用 obj2 输出变量
            System.out.println(obj2.name); // test
            System.out.println(obj2.likes); // 111
        } catch (Exception e) {
            System.out.println(e);
        }
    }
}

2. finalize()

  • 当对象被判定为垃圾对象时,由JVM自动调用此方法,用以标记垃圾对象,进入回收队列。
  • 垃圾对象:没有有效引用指此对象时,为垃圾对象。
  • 垃圾回收:由GC(Garbage Collection )销毁垃圾对象,释放数据存储空间。
  • 自动回收机制:JVM的内存耗尽。一次性回收所有垃圾对象。
  • 手动回收机制:使用System.gc();通知JVM进行垃圾回收。

3. getClass()

  • public final Class<?> getClass(){}
  • 返回引用中存储的实际对象类型。
  • 应用:通常用于判断两个引用中实际存储对象类型是否一致。
Student s1 = new Student("zs", 12);
Student s2 = new Student("ls", 22);

// s1.getClass() == s2.getClass() // true
// 上面的代码相当于 s1 instanceof s2

4. hashCode()

  • public int hashCode(){}
  • 返回该对象的哈希码值。
  • 哈希值根据对象的地址字符串数字使用hash算法计算出来的int类型的数值。
  • 一般情况下相同对象返回相同的哈希码。
Student s1 = new Student("zs", 12);
Student s2 = new Student("ls", 22);

// s1.hashCode() == s2.hashCode() // false

Student s3 = s1;
// s1.hashCode() == s3.hashCode()    // true

5. toString()

  • public String toString(){}
  • 返回该对象的字符串表示(表现形式)。
  • 可以根据程序需要重写该方法,如:展示对象各个属性值。

  • 从Object类继承过来的toString()如无进行修改,则默认为打印当前类的全类名@对象地址

    return getClass().getName() + "@" + Integer.toHexString(hashCode());

6. equals()

  • public boolean equals(Object obj)
  • 默认实现为(this == obj),比较两个对象地址是否相同。
  • 可进行覆盖,如比较两个对象的内容是否相同。比如:String.equals()

6.1. equals()方法覆盖步骤

  1. 比较两个引用是否指向同一个对象。
  2. 判断obj是否为null。
  3. 判断两个引用指向的实际对象类型是否一致。
  4. 强制类型转换。
  5. 依次比较各个属性值是否相同。

覆盖实例如:

class Student{
  int sno;
  String sname;

  /*
  中间方法省略
  */

  @Override
  public boolean equals(Object obj){
    if(this == obj){
      return true;
    }
    if(null == obj){
      return false;
    }
    if(obj instanceof Student){
      Studnet s = (Student)obj;
      if(this.name.equals(s.getName()) && this.sno == s.getSno()){
        return true;
      }
    }
    return false;
  }
}
Copyright © rootwhois.cn 2021-2022 all right reserved,powered by GitbookFile Modify: 2023-03-05 10:55:52

results matching ""

    No results matching ""