📜  Java中的对象类Object

📅  最后修改于: 2020-03-20 01:14:13             🧑  作者: Mango

对象类存在于java.lang包中。Java中的每个类都直接或间接地从Object类派生。如果一个类不扩展任何其他类,则它是Object的直接子类,如果扩展其他类,则它是一个间接派生的。因此,对象类方法可用于所有Java类。因此,对象类充当任何Java程序中继承层次结构的根。

使用对象类Object方法

Object类中有一些方法:
1, toString():toString()提供对象的String表示形式,并用于将对象转换为String。类Object的默认toString()方法返回一个字符串,该字符串为该对象实例的类的名称、符号字符“ @”和该对象的哈希码的无符号十六进制表示组成。换句话说,它定义为:

// Object的toString()  
// 返回该对象实例的类的名称、符号字符“ @"和该对象的哈希码的无符号十六进制表示组成
public String toString()
{
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

始终建议重写toString()方法以获得我们自己的Object的String表示形式。
注意:每当我们尝试打印任何Object引用时,都会在内部调用toString()方法。

Student s = new Student();
// 以下两个语句是等效的
System.out.println(s);
System.out.println(s.toString());

2. hashCode():对于每个对象,JVM都会生成一个唯一的数字,即哈希码。它为不同的对象返回不同的整数。关于此方法的一个常见误解是hashCode()方法返回对象的地址,这是不正确的。它通过使用算法将对象的内部地址转换为整数。hashCode()方法是本机的,因为在Java中无法找到对象的地址,因此它使用C / C++等本机语言来查找对象的地址。

使用hashCode()方法:返回用于搜索集合中对象的哈希值。JVM(Java虚拟机)在将对象保存到与哈希相关的数据结构(如HashSet,HashMap,Hashtable等)中时使用哈希码方法。基于哈希码保存对象的主要优点是搜索变得容易。
注意:必须完成hashCode()方法的重写,以便为每个对象生成唯一的数字。例如,对于学生类,我们可以返回来自hashCode()方法的卷号,因为它是唯一的。

/ Java展示hasCode()和toString()
public class Student
{
    static int last_roll = 100;
    int roll_no;
    // 构造器
    Student()
    {
        roll_no = last_roll;
        last_roll++;
    }
    // 重写 hashCode()
    @Override
    public int hashCode()
    {
        return roll_no;
    }
    // 测试代码
    public static void main(String args[])
    {
        Student s = new Student();
        // 以下两句等效
        System.out.println(s);
        System.out.println(s.toString());
    }
}

输出:

Student@64
Student@64

请注意4 * 16 0 + 6 * 16 1 = 100
3,equals(Object obj):比较给定对象与“ this”对象(在其上调用方法的对象)。它提供了一种比较对象是否相等的通用方法。建议重写equals(Object obj)方法以获取我们对Objects的相等条件。注意:通常,无论何时重写此方法,都必须重写hashCode()方法,以维护hashCode方法的常规协定,该协定规定相等的对象必须具有相等的哈希码。

4,getClass():返回“ this”对象的类对象,用于获取该对象的实际运行时类。它也可以用来获取此类的元数据。返回的Class对象是被表示的类的静态同步方法锁定的对象。由于这是最终决定,因此我们不会重写它。

// Java代码展示getClass()方法
public class Test
{
    public static void main(String[] args)
    {
        Object obj = new String("芒果For芒果");
        Class c = obj.getClass();
        System.out.println("obj的类对象 : "
                           + c.getName());
    }
}

输出:

obj的类对象 : java.lang.String

注意:加载.class文件后,JVM将在Heap区域中创建java.lang.Class类的对象。我们可以使用该类对象来获取类级别信息,它广泛用于反射。

5,finalize()方法:该方法在对象被垃圾回收之前被调用。当垃圾收集器确定不再有对该对象的引用时,垃圾收集器会在对象上调用该方法。我们应该重写finalize()方法来处置系统资源,执行清理活动并最大程度地减少内存泄漏。例如,在销毁Servlet对象的Web容器之前,总是调用finalize方法来执行会话的清理活动。
注意: finalize方法仅在对象上被调用一次,即使该对象可以多次进行垃圾回收。

// Java展示如何使用finalize()
public class Test
{
    public static void main(String[] args)
    {
        Test t = new Test();
        System.out.println(t.hashCode());
        t = null;
        // 调用垃圾收集
        System.gc();
        System.out.println("结束");
    }
    @Override
    protected void finalize()
    {
        System.out.println("finalize方法被调用");
    }
}

输出:

366712642
finalize方法被调用
结束

6,clone():它返回一个与此对象完全相同的新对象。
7,其余三个方法wait()notify() notifyAll()与并发有关。