欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Object类

程序员文章站 2022-04-01 10:19:13
...

Object类

API:Application Programing Interface,应用程序编程接口。Java API就是java语言提供使用的类,这些类将底层的实现封装起来,我们只需搬运使用即可。

Object:类 Object 是类层次结构的根类。每个类都使用 Object 作为超类。所有对象(包括数组)都实现这个类的方法。Object 是所有类的顶层父类,所有的类,都是直接 或间接继承自他。

public int hashCode()

  1. 返回该对象的哈希码值。默认情况下,该方法会根据对象的地址来计算。
  2. 同一个对象的hashCode()值相同,不同对象的,hashCode()一般来说不会相同。
  3. 不是对象的实际地址值,可以理解为逻辑地址值。
public class Test1 {
    public static void main(String[] args) {
        Object obj = new Object();
        int code = obj.hashCode();
        System.out.println(code);
    }
}

public final Class getClass()

获取该类的字节码文件对象。可以用来判断两个对象是否实例化的同一个类。

public class Test2 {
    public static void main(String[] args) {
        Object obj1 = new Object();
        Object obj2 = new Object();              //这两个对象均实例化类Object
        Class<?> aClass1 = obj1.getClass();
        System.out.println(aClass1.getName());  //打印字节码文件:java.lang.Object
        Class<?> aClass2 = obj2.getClass();
        System.out.println(aClass1 == aClass2);  //ture
    }
}

public String toString()

获取该对象的地址值,以字符串形式返回.

当你打印一个对象名的时候,默认在调用Object类中的toString()方法

 public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }
public class Test3 {
    public static void main(String[] args) {
        Object obj = new Object();       // 初始化一个Object类的对象
        String s = obj.toString();      // 将其地址传给s

        System.out.println(s);          //aaa@qq.com
        System.out.println(obj.toString());       //aaa@qq.com
        System.out.println(obj);        //aaa@qq.com,打印一个对象名的时候,默认在调用Object类中的toString()方法
    }
}

public boolean equals(Object obj)

public boolean equals(Object obj) {
        return (this == obj);
    }

Object 类的equals() 方法,默认在比较两个对象的地址值是否相同,但是老是比较地址值是否相同意义不大。子类可以重写equals()方法获得自己比较的方式。

== 和 equals() 方法的区别:

  1. == 是一个比较运算符,他既可以比较基本数据类型,也可以比较引用数据类型,而 equals() 是Object类中的方法,只能比较引用类型,默认比较的是两个对象的地址值,是否相同;
  2. 比较基本数据类型,比的是两个值是否相等,比较引用类型,比较的是两个对象的地址值是否相同。

protected native Object clone() throws CloneNotSupportedException;

一个接口中,没有任何的抽象方法,这种接口我们称之为标记接口。目的就是给类打一个标记,让虚拟机支持克隆操作。

对象克隆:

  1. 使用clone()方法采用的是浅克隆的方式;
  2. 采用IO流来实现 使用 ObjectOutputStream 将对象写入文件中,然后再用ObjectInputStream读取回来.

注意

  1. 如果一个对象需要调用clone的方法克隆,那么该对象所属的类必须要实现Cloneable接口。
  2. Cloneable接口只不过是一个标识接口而已,没有任何方法。
  3. 对象的浅克隆就是克隆一个对象的时候,如果被克隆的对象中维护了另外一个类的对象,这时候只是克隆另外一个对象的地址,而没有把
    另外一个对象也克隆一份。
  4. 对象的浅克隆也不会调用到构造方法的。

例:

类Person

public class Person implements Cloneable {
    public Worker worker;
    private int num;
    private String name;
    private double wage;

    @Override
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    } //clone重写,将关键字protected 改为 public

    public Person(int num, String name, double wage, Worker worker) {
        this.num = num;
        this.name = name;
        this.wage = wage;
        this.worker = worker;
    }  //有参构造

    public Person() {

    }

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getWage() {
        return wage;
    }

    public void setWage(double wage) {
        this.wage = wage;
    }

    public Worker getWorker() {
        return worker;
    }

    public void setWorker(Worker worker) {
        this.worker = worker;
    }
}

类Worker

public class Worker {
    private String jobName;

    public Worker(){}

    public Worker(String jobName) {
        this.jobName = jobName;
    }//有参构造

    public String getJobName() {
        return jobName;
    }

    public void setJobName(String jobName) {
        this.jobName = jobName;
    }
}

测试类

public class Test {
    public static void main(String[] args) throws CloneNotSupportedException {
        Worker worker = new Worker("电工");
        Person person = new Person(001, "李老板", 1000, worker);

        person.worker.setJobName("伐木工");  //这里在person类中将worker对象设为了私有,导致在此类中调不到
        //克隆操作
        Person per = (Person) person.clone();  //克隆只克隆了对象person,并没有克隆里边的worker对象
        person.worker.setJobName("打麻将");      //将对象worker.jobname改为"打麻将"
        person.setName("光头强");
        person.setNum(002);
        person.setWage(2000);

        System.out.println(person.worker.getJobName()); //打印  打麻将
        System.out.println(per.worker.getJobName());   //打印    打麻将
    }
}

简易图示:
Object类