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