Object类是Java语言中的根类,就是所有类的父类,如果一个类没有特别指定的父类,那么默认这个类继承于Object类。
Object类中的hashCode()方法
public int hashCode()方法:
返回该对象的哈希码值

package org.jimmy.demo;

/**
 * @Author: Administrator
 * @CreateTime: 2018-12-25 18:31
 */
public class MyDemo {

}
class test{
    public static void main(String[] args) {
        MyDemo my = new MyDemo();
        int i = my.hashCode();
        System.out.println(i);
    }
}
356573597

getclass()方法
public final Class getclass():
返回该类的运行时类

package org.jimmy.demo;

/**
 * @Author: Administrator
 * @CreateTime: 2018-12-25 18:31
 */
public class MyDemo {

}
class test{
    public static void main(String[] args) {
        MyDemo my = new MyDemo();
        Class<? extends MyDemo> aClass = my.getClass();
        System.out.println(aClass);
    }
}
class org.jimmy.demo.MyDemo

equals()方法
判断两个对象的引用是否相同

package org.jimmy.demo;

/**
 * @Author: Administrator
 * @CreateTime: 2018-12-25 18:31
 */
public class MyDemo {

}
class test{
    public static void main(String[] args) {
        MyDemo my = new MyDemo();
        MyDemo my1 = new MyDemo();
        System.out.println(my.equals(my1));
        my=my1;
        System.out.println(my.equals(my1));
    }
}
false
true

equals方法一般建议重写,因为比较两个对象的引用没有什么意义
我们可以通过instanceof关键字来提高equals的健壮性,判断该对象是否为类的实例化
tostring()方法
public String tostring():
返回该对象的字符串显示
一般返回字符串显示没有意义,所以建议重写该方法,将该类的成员变量返回

package org.jimmy.demo;

/**
 * @Author: Administrator
 * @CreateTime: 2018-12-25 18:31
 */
public class MyDemo {
    public int age;

    public MyDemo(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "MyDemo{" +
                "age=" + age +
                '}';
    }
}
class test{
    public static void main(String[] args) {
        MyDemo my = new MyDemo(5);
        System.out.println(my.toString());

    }
}
MyDemo{age=5}

clone()方法
在使用clone()方法时,要注意,clone()方法权限修饰符是受保护的,所以我们要重写该方法,将修饰符改成public,对象的克隆分为深克隆和浅克隆,在这里我们只研究浅克隆

浅克隆在调用时也要注意以下几点:
a.一个对象要克隆时,它的类必须要实现cloneable接口,该接口中没有任何内容,只是相当于一个标识接口
b.一个对象,在克隆另一个对象时,如果该对象中有另一个类的对象,那么,你只是克隆的是另一个对象的地址值而已,并不是克隆了一份这个对象。
c.对象的浅克隆也不会调用到构造方法的

package org.jimmy.demo;

/**
 * @Author: Administrator
 * @CreateTime: 2018-12-25 18:31
 */
public class MyDemo implements Cloneable {
    public int age;

    public MyDemo(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "MyDemo{" +
                "age=" + age +
                '}';
    }

    @Override
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

}
class test{
    public static void main(String[] args) throws CloneNotSupportedException {
        MyDemo my = new MyDemo(5);
        MyDemo clone = (MyDemo) my.clone();
        System.out.println(clone);

    }
}
MyDemo{age=5}

我们在类中加入另一个类的对象再来测试一下

package org.jimmy.demo;

import java.util.Objects;

/**
 * @Author: Administrator
 * @CreateTime: 2018-12-25 18:31
 */
public class MyDemo implements Cloneable {
    public int age;
    public MyTest test;

    public MyDemo(int age, MyTest test) {
        this.age = age;
        this.test = test;
    }

    @Override
    public String toString() {
        return "MyDemo{" +
                "age=" + age +
                ", test=" + test +
                '}';
    }

    @Override
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        MyDemo myDemo = (MyDemo) o;
        return age == myDemo.age &&
                Objects.equals(test, myDemo.test);
    }

    @Override
    public int hashCode() {
        return Objects.hash(age, test);
    }
}
class MyTest{
    public String name;

    public MyTest(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "MyTest{" +
                "name='" + name + '\'' +
                '}';
    }
}
class test{
    public static void main(String[] args) throws CloneNotSupportedException {
        MyTest test = new MyTest("张三");
        MyDemo my = new MyDemo(5,test);
        MyDemo c1 = (MyDemo) my.clone();
        System.out.println(c1);
        c1.test.name="李四";
        System.out.println(my);
        System.out.println(c1);
        System.out.println(c1==my);
        System.out.println(c1.equals(my));
    }
}
MyDemo{age=5, test=MyTest{name='张三'}}
MyDemo{age=5, test=MyTest{name='李四'}}
MyDemo{age=5, test=MyTest{name='李四'}}
false
true

可以看出,在类中的另一个类创建对象后,该对象改变他的成员变量,MyDemo的对象和他的克隆对象中的该变量也会改变,如果我们只改变一个对象中的age变量,那么只是这个对象的变量发生改变,同时我们也重写了equals()方法,来对比==和equals()方法。