📜  Java中的对象类

📅  最后修改于: 2022-05-13 01:54:32.388000             🧑  作者: Mango

Java中的对象类

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

使用对象类方法

Object类中有一些方法:

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

// Default behavior of toString() is to print class name, then
// @, then unsigned hexadecimal representation of the hash code
// of the object

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

始终建议重写toString()方法以获取我们自己的 Object 字符串表示形式。有关覆盖 toString() 方法的更多信息,请参阅 – Overriding toString() in Java

Student s = new Student();

// Below two statements are equivalent
System.out.println(s);
System.out.println(s.toString());

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

hashCode() 方法的使用:它返回一个哈希值,用于在集合中搜索对象。 JVM(Java Virtual Machine)使用hashcode方法,同时将对象保存到HashSet、HashMap、Hashtable等与哈希相关的数据结构中。基于哈希码保存对象的主要优点是搜索变得容易。

Java
// Java program to demonstrate working of
// hashCode() and toString()
 
public class Student {
    static int last_roll = 100;
    int roll_no;
 
    // Constructor
    Student()
    {
        roll_no = last_roll;
        last_roll++;
    }
 
    // Overriding hashCode()
    @Override public int hashCode() { return roll_no; }
 
    // Driver code
    public static void main(String args[])
    {
        Student s = new Student();
 
        // Below two statements are equivalent
        System.out.println(s);
        System.out.println(s.toString());
    }
}


Java
// Java program to demonstrate working of getClass()
 
public class Test {
    public static void main(String[] args)
    {
        Object obj = new String("GeeksForGeeks");
        Class c = obj.getClass();
        System.out.println("Class of Object obj is : "
                           + c.getName());
    }
}


Java
// Java program to demonstrate working of finalize()
 
public class Test {
    public static void main(String[] args)
    {
        Test t = new Test();
        System.out.println(t.hashCode());
 
        t = null;
 
        // calling garbage collector
        System.gc();
 
        System.out.println("end");
    }
 
    @Override protected void finalize()
    {
        System.out.println("finalize method called");
    }
}


输出 :

Student@64
Student@64

注意 4*16 0 + 6*16 1 = 100

3. equals(Object obj):将给定对象与“this”对象(调用方法的对象)进行比较。它提供了一种比较对象是否相等的通用方法。建议重写equals(Object obj)方法以获取我们自己对 Objects 的相等条件。有关重写 equals(Object obj) 方法的更多信息,请参阅 – Overriding equals method in Java

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

Java

// Java program to demonstrate working of getClass()
 
public class Test {
    public static void main(String[] args)
    {
        Object obj = new String("GeeksForGeeks");
        Class c = obj.getClass();
        System.out.println("Class of Object obj is : "
                           + c.getName());
    }
}

输出:

Class of Object obj is : java.lang.String

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

Java

// Java program to demonstrate working of finalize()
 
public class Test {
    public static void main(String[] args)
    {
        Test t = new Test();
        System.out.println(t.hashCode());
 
        t = null;
 
        // calling garbage collector
        System.gc();
 
        System.out.println("end");
    }
 
    @Override protected void finalize()
    {
        System.out.println("finalize method called");
    }
}

输出:

366712642
finalize method called
end

6.clone():返回一个和这个对象完全一样的新对象。对于 clone() 方法,请参阅 Clone()。

其余三个方法wait()notify() notifyAll()与并发相关。有关详细信息,请参阅Java中的线程间通信。