Object类介绍
什么是Object类:Object类存储在java.lang包中,是所有java类(Object类除外)的终极父类。
Object方法举例:
Object方法简介:
public String toString() 返回该对象的字符串表示。
public boolean equals(Object obj) 判断两个对象的地址是否相同。
public native int hashCode() 返回该对象的哈希码值(集合讲)。
public final native Class<?> getClass() 得到一个对象或者类的结构信息(反射讲)。
以下三个方法作用:等待,需要notify或notifyAll才能唤醒(多线程讲)
public final void wait() throws InterruptedException;
public final native void wait(long timeout) throws InterruptedException;
public final void wait(long timeout, int nanos) throws InterruptedException;
以下两个方法作用:唤醒(多线程讲)
public final native void notify();
public final native void notifyAll();
native关键字解释:
native代表本地方法,所有用native修饰的方法都没有方法体。Java不是完美的,Java的不足除了体现在运行速度上要比传统的C++慢许多之外,Java无法直接访问到操作系统底层(如系统硬件等),为此Java使用native方法来扩展Java程序的功能。可以将native方法比作Java程序同C程序的接口,使用native修饰的方法来访问底层的操作系统。
toString方法
toString 方法返回该对象的字符串表示,其实该字符串内容就是:对象的类型+@+哈希码。
【示例】toString代码底层
public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); } |
【示例】重写toString方法案例
class TestDemo { String name; int age; public TestDemo(String name, int age) { this.name = name; this.age = age; } // 重写toString方法 @Override public String toString() { return "TestDemo[name:" + name + " age:" + age + "]"; } } public class ToStringDemo { public static void main(String[] args) { TestDemo demo = new TestDemo("小明", 18); // 输出:TestDemo[name:小明 age:18] System.out.println(demo); } } |
equals方法
Object类中的equals 方法,用于比较两个对象是否相同,它其实就是使用两个对象的内存地址在比较。Object类中的 equals 方法内部使用的就是==比较运算符。
【示例】equals代码底层实现
public boolean equals(Object obj) { return (this == obj); } |
【示例】equals方法使用案例
// Demo类 class Demo { String name; int age; public Demo(String name, int age) { this.name = name; this.age = age; } } // 测试类 public class EqualsDemo { public static void main(String[] args) { Demo d1 = new Demo("小明", 18); Demo d2 = new Demo("小明", 18); // d1和d2是不同的两个对象,那么在堆中的地址肯定不相同 System.out.println(d1 == d2); // 返回:false System.out.println(d1.equals(d2)); // 返回:false // 此时,d3和d1都指向堆中同一块地址 Demo d3 = d1; System.out.println(d1.equals(d3)); // 返回:true } } |
在开发中要比较两个对象是否相同,经常会根据对象中的属性值进行比较,也就是在开发经常需要子类重写 equals 方法根据对象的属性值进行比较。
【示例】判断Demo属性是否相同
// Demo类 class Demo { String name; int age; public Demo(String name, int age) { this.name = name; this.age = age; } /** * 重写equals方法,判断属性是否全部相同 */ @Override public boolean equals(Object obj) { // 1.判断传入的obj是否为null,为null则返回false if(obj == null) { return false; } // 2.判断地址是否相同,相同则返回true,否则继续判断属性是否相同 if(this == obj) { return true; } // 3.依次判断对象中属性值是否相同,相同则返回true,否则返回false Parent p = (Parent)obj; // 强转 if(this.name.equals(p.name) && this.age == p.age) { return true; } return false; } } // 测试类 public class EqualsDemo { public static void main(String[] args) { Demo d1 = new Demo("小明", 18); Demo d2 = new Demo("小明", 18); // 判断属性是否全部相同 System.out.println(d1.equals(d2)); // 返回:true } } |
hashCode方法
【示例】使用hashCode方法案例
Student stu = new Student(); // 输出:2018699554 System.out.println(stu.hashCode()); // 输出:com.bjpowernode.objectClass.Studnet@7852e922 System.out.println(stu); // Integer.toHexString()方法是把哈希值转化为16进制 // 输出:7852e922 System.out.println(Integer.toHexString(p.hashCode())); |
因为hashCode方法没有用final修饰,所有我们可以重写hashCode方法。一般重写了equals方法都要重写hashCode方法。
如果obj1.equals(obj2)的结果为true,那么可以推出obj1对象和obj2对象的hashCode肯定相等,但是hashCode相等不一定就满足equals。
不过为了提高效率,应该尽量使上面两个条件接近等价。