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
Note: Whenever we try to print any Object reference, then internally toString() method is called.
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等与哈希相关的数据结构中。基于哈希码保存对象的主要优点是搜索变得容易。
Note: Override of hashCode() method needs to be done such that for every object we generate a unique number. For example, for a Student class, we can return the roll no. of a student from the hashCode() method as it is unique.
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
Note: It is generally necessary to override the hashCode() method whenever this method is overridden, so as to maintain the general contract for the hashCode method, which states that equal objects must have equal hash codes.
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
Note: After loading a .class file, JVM will create an object of the type java.lang.Class in the Heap area. We can use this class object to get Class level information. It is widely used in Reflection
5. finalize() 方法:该方法在对象被垃圾回收之前调用。当垃圾收集器确定不再有对该对象的引用时,它被称为对象上的垃圾收集器。我们应该重写 finalize() 方法来处理系统资源,执行清理活动并最大限度地减少内存泄漏。例如,在销毁 Web 容器的 Servlet 对象之前,总是调用 finalize 方法来执行会话的清理活动。
Note: The finalize method is called just once on an object even though that object is eligible for garbage collection multiple times.
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中的线程间通信。