JAVA中的Object类
程序员文章站
2024-03-14 09:39:34
...
object类
-
int hashCode () 返回该对象的哈希码值。不同对象的哈希码值,是不一样的。
-
public int hashCode() 返回该对象的哈希码值。不同对象的哈希码值不同。
-
public final Class<?> getClass() 返回此对象的运行时类。(实际上返回该类的字节码文件对象,Object.class 字节码文件加载进内存-----JVM就会为Object.class文件创建一个对象)
package org.westos.demo5; public class Demo { public static void main(String[] args) { Object n1 = new Object(); Class<?> n1Class = n1.getClass(); Object n2 = new Object(); Class<?> n2Class = n2.getClass(); Test test = new Test(); Class<? extends Test> testClass = test.getClass(); System.out.println(n1Class);//输出:class java.lang.Object System.out.println(n2Class);//输出:class java.lang.Object System.out.println(testClass);//输出:class org.westos.demo5.Test System.out.println(n1==n2);//输出:false System.out.println(n1Class==n2Class);//输出:true System.out.println(n1Class==testClass);//输出:false } } class Test{ }
-
public boolean equals(Object obj) Object 类中的equals方法默认比较两个对象的地址值是否相同,因为这个对我们用处不大,因而我们可以在自定义类中重写该方法。
//在自定义Student类中重写equals方法,使其比较对象的成员变量的值是否相等 class Student { private String name; private int age; public Student() { } public Student(String name, int age) { this.name = name; this.age = age; } @Override public boolean equals(Object o) { //比较是否是同一个对象 if (this == o) { return true; } //比较两个对象的运行时类是否相同 if (o == null || this.getClass() != o.getClass()) { return false; } //进行强转之后比较值是否相同(String类重写了equals方法,可以比较字符串的值是否相同) Student student = (Student) o; return age == student.age && Objects.equals(name, student.name); } }
对于基本数据类型,比较它们时应该用比较运算符(==),比较它们的值是否相等。
对于对象,当用(==)比较时,比较的是它们的地址值是否相等。初始的equals()方法,也是比较对象的地址值是否相等,但是该方法可以被重写用于比较值相等或者其他。
-
protected Object clone() 该方法创建并返回此对象的一个副本。
//如果我们要在自定义类里实现克隆(这里实现的是浅克隆): package org.westos.demo5; public class Demo { public static void main(String[] args) throws CloneNotSupportedException { Something s = new Something(7); Test test = new Test(s, 3); Test ctest = (Test)test.clone(); System.out.println(test.getNum()); System.out.println(ctest.getNum()); System.out.println(test.getSomething()); System.out.println(test.getSomething()); } } /* * 若要在自定义类中实现clone(),必须实现Cloneable接口,这只是一个标志性接口该接口, * 用以指示 Object.clone()方法可以合法地对该类实例进行按字段复制, 如果在没有实现 Cloneable 接口的 * 实例上调用 Object 的 clone 方法,则会导致抛出 CloneNotSupportedException 异常 */ class Test implements Cloneable{ private Something something; private int num; public Test(Something something, int num) { this.something = something; this.num = num; } public Something getSomething() { return something; } public int getNum() { return num; } //通过调用super.clone()来实现clone()方法 @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } } class Something{ int i; public Something(int i) { this.i = i; } } //结果: 3 3 org.westos.demo5.Something@4554617c org.westos.demo5.Something@4554617c
内存图如下:
Object类提供的clone()方法是一种浅克隆——它只克隆该对象的所有成员变量值,但不会对引用类型的成员变量值所引用的对象进行克隆。
深克隆则会将引用类型的成员变量值所引用的对象进行克隆。
-
public String toString() 返回该对象的字符串表示。它的值等于:
getClass().getName() + ‘@’ + Integer.toHexString(hashCode())建议在自定义类中重写返回一些有用的信息。
public class Test { public static void main(String[] args) { Teacher teacher = new Teacher("张三", 23); System.out.println(teacher); } } class Teacher{ private String name; private int age; public Teacher(String name, int age) { this.name = name; this.age = age; } //重写toString()方法 @Override public String toString() { return "Teacher{" + "name='" + name + '\'' + ", age=" + age + '}'; } } //结果: Teacher{name='张三', age=23}