📅  最后修改于: 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()与并发有关。