【JAVA】Object类的方法简谈

                                           Object类的方法简谈

Java中所有的类都继承自Object类,那我们今天来探讨一下Object类中的方法

PS:Object源码中,作者那一栏中,出现了这个

package java.lang;

/**
 * Class {@code Object} is the root of the class hierarchy.
 * Every class has {@code Object} as a superclass. All objects,
 * including arrays, implement the methods of this class.
 *
 * @author  unascribed
 * @see     java.lang.Class
 * @since   JDK1.0
 */
public class Object {
    ....   
}

unascribed,意思是无归属,我猜测是这个类经由很多大佬修改过,无法确定谁是主要作者,便写了无归属。说歪了,回到正题吧!

Object类有以下这几个方法(按照源码中的顺序)

【1】getClass():Class<?>

【2】hashCode():int

【3】equals(Object):boolean

【4】clone():Object

【5】toString():String

【6】notify():void

【7】notifyAll():void

【8】wait(long):void

【9】wait(long,int):void

【10】wait():void

【11】finalize():void

方法说明

【1】getClass():Class<?>  

返回该对象运行时类的Class对象,通俗点,就是这个对象所属的类

代码说明

  public static void testGetClass() {
        ObjectTest test = new ObjectTest();
        System.out.println(test.getClass());
    }

输出为

可以看得出是输出的结构是   class   包名.类名

【2】hashCode():int

返回该对象的哈希值

(1)同一个对象的哈希值一定相同

(2)不同对象的哈希值可能相同,而不是绝对不相同

(3)哈希值一般用来提高查询的效率

(4)HashSet使用对象的hashcode与equals来判断是否插入了重复对象

代码演示

  public static void testHashCode(){
        System.out.println("同一个对象");
        ObjectTest test = new ObjectTest();
        System.out.println(test.hashCode());
        System.out.println(test.hashCode());
        System.out.println("两个不同的对象");
        System.out.println(new ObjectTest().hashCode());
        System.out.println(new ObjectTest().hashCode());
    }

输出为

【3】equals(Object):boolean

判断两个对象内存地址是否相同,方法内部直接 return (this==object)

注意(1)凡是涉及到new的操作,均返回false,因为这是在堆中实例化了新的对象

代码演示

  public static void testEquals() {
        System.out.println(new ObjectTest().equals(new ObjectTest()));
    }

输出为

(2)equals返回true的两个对象,其哈希值一定相同

(3)哈希值相同的两个对象,equals不一定返回true

【4】clone():Object

创建一个对象的副本

注意

(1)创建出来的是新的对象,equals返回false

(2)clone()不会调用构造方法

(3)当前类需要实现Cloneable标识接口,当前类对象才支持clone()方法

代码演示

public class ObjectTest implements Cloneable{

   ......

    public static void testClone(){
        ObjectTest objectTest=new ObjectTest();
        try {
           ObjectTest objectTest1= (ObjectTest) objectTest.clone();
           System.out.print(objectTest.equals(objectTest1));
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
    }

    public static void main(String args[]) {
      ...
        testClone();

    }
}

输出为false

【5】toString():String

将对象转换成字符串表达形式

(1)不重写这个方法,直接调用则是输出当前对象在内存中的首地址

(2)重写这个方法后,输出该对象的属性

代码演示

不重写toString()方法

package day0807;

public class ObjectTest implements Cloneable {
    public String name;
    public int age;

    public ObjectTest() {
    }

    public ObjectTest(String name, int age) {
        this.name = name;
        this.age = age;
    }

   ....

    public static void testToString() {
        ObjectTest objectTest = new ObjectTest("tom", 22);
        System.out.println(objectTest.toString());
    }

    public static void main(String args[]) {
       ...
        testToString();

    }
}

输出为

重写后

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

输出为

【6】notify():void

【7】notifyAll():void

【8】wait(long):void

【9】wait(long,int):void

【10】wait():void

这几个方法体现的是java中的多线程

(1)wait()使当前线程挂起并进入到该对象的等待队列中

(2)从当前对象的等待队列中随机唤醒一个挂起的线程,通知该线程可以运行

(3)唤醒当前对象的等待队列中的所有线程

(4)wait(long)与wait(long,int)为下一次自动唤醒距离现在释放锁的时间间隔

[关于这几个方法,涉及到的知识比较多,我会单独拎出来]

【11】finalize():void

JVM在回收对象所占的内存之前调用该方法

(1)当对象不再被任何变量所引用时,会调用这个方法

代码演示

 public static void testFinalize() {
        ObjectTest objectTest = new ObjectTest();
        //将引用强制置为null
        objectTest = null;
        //通知gc开始工作,但gc何时工作无法控制,只是通知
        System.gc();
    }

输出为

猜你喜欢

转载自blog.csdn.net/qq_33591903/article/details/81487871
今日推荐