简单理解 Object 类

Object 类是类层次结构的根类。每个类都使用 Object 作为超类。所有类,包括我们自定义的类都继承自这个类。

1.clone方法

创建并返回此对象的一个副本。用于保护方法,实现对象的浅复制,只有实现了Cloneable接口才可以调用该方法,否则抛出CloneNotSupportedException异常。 笔试题中,常与 copy() 相混淆,注意区分,Object类没有 copy() 方法!!

2.getClass方法

final 修饰的方法,返回此 Object 的运行时类型。

public class AutoIncre {

    class A {
        private int a = 2;
        void method() {
            System.out.println("HelloWorld!");
        }
    }

    public static void main(String[] args) {
        A a = new AutoIncre().new A();
        System.out.println(a.getClass());  //调用该方法对象所在的类:
        System.out.println(a.getClass().getName());  ////调用该方法对象所在的类路径的名字
        System.out.println(a.getClass().getSimpleName());  //获得简单的类名
    }

}
  执行结果:
  class com.dgut.leetcode.test.AutoIncre$A
  com.dgut.leetcode.test.AutoIncre$A
  A

3.toString方法

老熟人了,返回该对象的字符串表示,一般子类都有重写该方法。

4.finalize方法

该方法用于释放资源。因为无法确定该方法什么时候被调用,很少使用。

5.equals方法

指示其他某个对象是否与此对象“相等”。注意与 “ == ” 区分开。一般来说,== 用于比较基本数据类型,equals用于比较字符串对象,因为String类的内部重写了equals()。如果要使用 equals() 比较两个自定义的对象,记得重写 equals() 和 hashCode() 方法。

   /**
    * String重写equals()思路:
    * 先比较引用是否相同(是否为同一对象),
    * 再判断类型是否一致(是否为同一类型),
    * 最后比较内容是否一致。
    **/
    
   public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

6.hashCode方法

该方法用于哈希查找,重写了equals方法一般都要重写hashCode方法。Java 对于equals 方法和 hashCode 方法是这样规定的:

  • 如果两个对象相同(equals() 返回 true ),那么他们的hashCode 值一定相同;

  • 如果两个对象的 HashCode 相同,它们并不一定相同。

这篇文章写的非常棒,感兴趣的可以看一下:浅谈Java中的 hashCode() 方法

7.wait方法

wait() 方法使当前线程等待该对象的锁,当前线程必须是该对象的拥有者,也就是具有该对象的锁。wait()方法一直等待,直到获得锁或者被中断。wait(long timeout)设定一个超时间隔,如果在规定时间内没有获得锁就返回。

调用该方法后当前线程进入睡眠状态,直到以下事件发生:
(1)其他线程调用了该对象的notify方法。
(2)其他线程调用了该对象的notifyAll方法。
(3)其他线程调用了interrupt中断该线程。
(4)时间间隔到了。

此时该线程就可以被调度了,如果是被中断的话就抛出一个InterruptedException异常。

注意:

该方法在笔试中容易与 sleep() 方法混淆。
sleep() 是 线程类(Thread)的静态方法 线程调用 sleep( long timeout ) 方法时,会使当前线程暂停,睡眠指定时间,将持有的CPU 资源让给其他线程,但是对象的锁依然保持,因此休眠时间结束后自动回复,进入就绪状态。

wait() 是 Object 类方法,调用对象的 wait() 方法导致当前线程放弃对象的锁,进入等待池(wait pool),只有调用对象的 notify() 或 notifyAll() 方法,才能唤醒等待池中的线程进入等锁池( lock pool ),如果线程重获对象锁就可以进入就绪状态。

8.notify方法

该方法唤醒一个处于等待状态的某个线程。 当调用此方法时。并不能确切的唤醒某一个等待状态的线程,而是由 JVM 确定唤醒哪个线程,而且与优先级无关

9.notifyAll方法

该方法唤醒在该对象上等待的所有线程。 调用该方法时,并不能将对象的锁给所有线程,而是让它们竞争,只有获得锁的线程才能进入就绪状态。

写在最后

Object类还有个儿子 Objects工具类,初学者极容易混淆。但是有一说一,这工具类有时候挺好用的,建议学起来!

你可能感兴趣的:(笔记,java,object)