java面向对象16_Object类详解

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)领取。

发布了55 篇原创文章 · 获赞 0 · 访问量 792

猜你喜欢

转载自blog.csdn.net/zhoujunfeng121/article/details/104600445