两情若是久长时,又岂在朝朝暮暮。

——秦观《鹊桥仙》

## 1. Object类详解

1.1 Object类

在学习Java中基础类之前我们需要了解Object这个类!

  • Object类是所有类的超类, Object是Java语言中唯一一个没有父类的类。
  • 一个类可以不是Object类的直接子类,但一定是Object类的子类,Java中的每一个类(包括数组)都是从Object扩展来的。
  • 在Object类中定义的方法,在所有类中都可以使用。
    • java.lang Java语言包(包含String、Math、System等类),任何类中,该包中的类都会被自动导入。
    • java.util 包含一些实用的工具类( 包含 list, calendar, date等类)
    • java.awt 图形用户界面包。
    • java.io 提供多种输入/输出功能的类。
    • java.net 提供网络应用功能的类。

1.2 Object类中的方法

源码:

  1. private static native void registerNatives(); 是一个native方法,说明这个方法的实现不是在java中,而是由C/C++实现,并编译成.dll文件,由java调用。registerNatives主要是将C/C++的方法映射到java中的native方法,实现方法命名的解耦。详细解释…](https://blog.csdn.net/Saintyyu/article/details/90452826)
  2. public final native Class<?> getClass();获得一个实例的class对象,这个对象指的是代表一个类型的对象,因为一切皆是对象,类型也不例外,在Java使用class类的对象来表示一个类型。所有的类型类都是Class类的实例。
  3. public native int hashCode(); hashcode()表示的是JVM虚拟机为这个Object对象分配的一个int类型的数值,JVM会使用对象的hashcode值来提高对HashMap、Hashtable哈希表存取对象的使用效率。 关于Object对象的hashCode()返回值,“JVM根据某种策略生成的”,那么这种策略到底是什么呢?详细解释…
  4. public boolean equals(Object obj){ return (this == obj) };Object中的equals方法是直接判断this和obj本身的值是否相等,即用来判断调用equals的对象和形参obj所引用的对象是否是同一对象,所谓同一对象就是指内存中同一块存储单元,如果this和obj指向的是同一块内存对象,则返回true,如果this和obj指向的不是同一块内存,则返回false,注意:即便是内容完全相等的两块不同的内存对象,也返回false。详细解释…
    1. 为什么字符串String类的equals()方法和object对象的equals的方法不一样呢?这是因为String类里面重写了equals方法。
  5. protected native Object clone() throws CloneNotSupportedException;
    1. clone方法是native方法,native方法的效率远高于非native方法,因此还是使用clone方法去做对象的拷贝而不是使用new的方法,copy。
    2. 此类实现了Cloneable接口,以指示Object的clone()方法可以合法地对该类实例进行按字段复制;
    3. 如果在没有实现Cloneable接口的实例上调用Object的clone()方法,则会导致抛出CloneNotSupporteddException;
    4. 按照惯例,实现此接口的类应该使用公共方法重写Object的clone()方法,Object的clone()方法是一个受保护的方法;因此想实现clone的话,除了继承Object类外,还需要实现Cloneable接口;
    5. 深克隆和浅克隆…
  6. public String toString();Object类的toString()方法默认返回该对象实现类的“类名+@+hashcode”值(如上结果中看到的那样),这个返回值不能实现自我描述功能,所以需要重写Object类的toString()方法来实现,String类就是典型的重写toString方法。
  7. wait()、notify()和notifyAll()方法是本地方法,并且为final方法,无法被重写,不再多说。详细解释…
  8. protected void finalize() throws Throwable { };
    1. finalize()的作用**:Java允许在类中定义一个名为finalize()的方法。它的工作原理是:一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用其finalize()方法。并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。
    2. 关于垃圾回收,有三点需要记住:
      1. 对象可能不被垃圾回收。只要程序没有濒临存储空间用完的那一刻,对象占用的空间就总也得不到释放。
      2. 垃圾回收并不等于“析构”。
      3. 垃圾回收只与内存有关。使用垃圾回收的唯一原因是为了回收程序不再使用的内存。
    3. finalize()的用途:无论对象是如何创建的,垃圾回收器都会负责释放对象占据的所有内存。这就将对finalize()的需求限制到一种特殊情况,即通过某种创建对象方式以外的方式为对象分配了存储空间。不过这种情况一般发生在使用“本地方法”的情况下。
    4. 为什么不能显示直接调用finalize方法?
      1. 如前文所述,finalize方法在垃圾回收时一定会被执行,而如果在此之前显示执行的话,也就是说finalize会被执行两次以上,而在第一次资源已经被释放,那么在第二次释放资源时系统一定会报错,因此一般finalize方法的访问权限和父类保持一致,为protected。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package java.lang;

public class Object {

private static native void registerNatives();

static {
registerNatives();
}

public final native Class<?> getClass();

public native int hashCode();

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

protected native Object clone() throws CloneNotSupportedException;

public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

public final native void notify();

public final native void notifyAll();

public final native void wait(long timeout) throws InterruptedException;

public final void wait(long timeout, int nanos) throws InterruptedException {
if (timeout < 0) {
throw new IllegalArgumentException("timeout value is negative");
}

if (nanos < 0 || nanos > 999999) {
throw new IllegalArgumentException(
"nanosecond timeout value out of range");
}

if (nanos > 0) {
timeout++;
}

wait(timeout);
}

public final void wait() throws InterruptedException {
wait(0);
}


protected void finalize() throws Throwable { }
}