1.Object类介绍
什么是Object类?Object类存储在java.lang包中,是所有java类(Object类除外)的终极父类。当然,数组也继承了Object类。如果在类的声明中未使用extends关键字指明其基类,则默认基类为Object类。
Object类中方法如下:
Java中的任何类都继承了这些方法,并且可以覆盖不被final修饰的方法。例如:没有final修饰的toString()函数可以被覆盖,但是final wait()函数就不行。
Object类中方法简单介绍:
public String toString() 返回该对象的字符串表示。
public boolean equals(Object obj) 判断两个对象的地址是否相同。
public native int hashCode() 返回该对象的哈希码值(集合讲)。
public final native Class<?> getClass() 得到一个对象或者类的结构信息(反射讲)。
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;
以上三个方法作用:等待,需要notify或notifyAll才能唤醒(多线程讲)
public final native void notify();
public final native void notifyAll();
以上两个方法作用:唤醒(多线程讲)
native关键字解释:
native代表本地方法,所有用native修饰的方法都没有方法体。Java不是完美的,Java的不足除了体现在运行速度上要比传统的C++慢许多之外,Java无法直接访问到操作系统底层(如系统硬件等),为此Java使用native方法来扩展Java程序的功能。可以将native方法比作Java程序同C程序的接口,使用native修饰的方法来访问底层的操作系统。
2.toString方法
toString 方法返回该对象的字符串表示,其实该字符串内容就是:对象的类型+@+哈希码。
【示例】toString 方法底层代码实现
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
由于 toString 方法返回的结果是内存地址,而在开发中,经常需要按照对象的属性得到相应的字符串表现形式,因此也需要重写它。
【示例】重写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);
}
}
3.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
}
}
4.hashCode方法
hashCode方法返回该对象的哈希码值,支持该方法是为哈希表提供一些优点,例如,java.util.Hashtable 提供的哈希表。
我们直接输出一个对象,@之后接的就是哈希码值的16进制。
【示例】使用hashCode方法案例
Person p = new Person();
System.out.println(p.hashCode()); // 输出:2018699554
System.out.println(p); // 输出:com.bjsxt.objectClass.Person@7852e922
// Integer.toHexString()方法是把哈希值转化为16进制
System.out.println(Integer.toHexString(p.hashCode())); // 输出:7852e922
因为hashCode方法没有用final修饰,所有我们可以重写hashCode方法。一般重写了equals方法都要重写hashCode方法。如果obj1.equals(obj2)的结果为true,那么可以推出obj1对象和obj2对象的hashCode肯定相等,但是hashCode相等不一定就满足equals。不过为了提高效率,应该尽量使上面两个条件接近等价。
ps:如需最新的免费文档资料和教学视频,请添加QQ群(627407545)领取。