Java--Object类大总结

Object:
概述:Object 是类层次结构的根类。其他所有类都使用 Object 作为超类。
构造方法:
	Object(), 为什么子类构造方法默认调用父类的无参构造。
成员方法:
	1) public final Class getClass()
		返回对象的运行时类。
		Class: 类类型,用来描述类型的类
			String getName(): 返回该类的全限定名
		
		注意事项:
			a. 返回的是运行时类
			b. 用final修饰, 所有对象该方法的行为一致。
	
	2) public String toString()
		一个对象的字符串形式的简介,要求简单易懂。
		默认实现:
			getClass().getName() + "@" + Integer.toHexString(hashCode())
			
		默认实现不能很好的体现对象,所以推荐子类都重写toString()
		重写:
			根据关键域去重写
			快捷键生成
	
	3) public boolean equals(Object obj)
		判断两个对象是否"相等";
		默认实现:
			return this == obj;
			
		实体类:不同对象代表不同实体,采用默认实现即可。
		值类:关键域相等,就认为两个对象相等,应该重写equals()
		
		equals方法的协定:
			a. 自反性
			b. 对称性
			c. 传递性
			d. 一致性
			e. 非空性
		Java语法没有强制要求遵循这些规则,但是如果违反的话,可能会给程序带来灾难性的后果。
		
		重写:
			a. 子类没有新的要比较的属性,就用instanceof进行判断
			Demo:
			public boolean equals(Object obj) {
				if(obj instanceof Demo) {
					Demo demo = (Demo) obj;
					// 用关键属性进行比较
				}
				return false;
			}
			里式替换原则
			
			b. 子类有新的要比较的属性, 就用getClass() 方法进行判断
			Demo:
			public boolean equals(Object obj) {
				if (obj == null || obj.getClass() != getClass()) {
					return false;
				}
				Demo demo = (Demo) obj;
				// 用关键属性进行比较
			}
			没有遵循里式替换原则
		
			c. 快捷键生成(b方式)
		
		== 和 equals()的比较
			== :如果比较是基本数据类型, 判断他们的值是否相等
				如果比较是引用数据类型, 判断他们是否是同一个对象
			
			equals():不能比较基本数据类型
				比较引用数据类型, 如果没有重写Object的equals(),默认判断是否是同一个对象。
				如果重写了,一般是根据该对象的值进行判断
	4) public int hashCode()
		获取该对象的散列码
		
		hash算法:模拟随机映射。
		默认实现:将对象的内存地址映射成一个整数值。
		
		hashCode()的协定:
			a. 一致性
			b. 如果两个对象是"相等"的,那么他们的hashcode也一定相等。
				如果重写equals(),一定也要重写hashcode().
			c. 如果两个对象"不相等", 不要求他们的hashcode一定也不相等。但是最好不一样,这样提高hash表的效率。
		
		重写:
			a.
				int result = c;
				// 根据每一个关键域的hashcode去生成
				31 * i == (i << 5) - i;
				result = 31 * field.hashCode + result;
				...
				return result;
			b.
	
	5) protected void finalize()
		垃圾回收器回收该对象之前,会调用该方法。
		作用:可以释放系统资源
		
		注意事项:
			a. 如果直接调用,相当普通的方法调用,并不会回收该对象。
			b. 释放系统资源最好不要放在该方法里面,推荐用 try...catch...finally 
	
	6) protected Object clone()
		返回该对象的一个克隆
		
		默认:浅拷贝
		如何实现深拷贝:
		a. 实现Cloneable接口
		b. 调用super.clone(), 完成基本数据类型的拷贝
		c. 对所有的引用数据类型完成深拷贝(下一级也应该实现深拷贝)

总结:
	理解: finalize(), clone(), getClass()
	掌握: toString(), equals(), hashcode()
发布了25 篇原创文章 · 获赞 22 · 访问量 3664

猜你喜欢

转载自blog.csdn.net/weixin_42443419/article/details/89158872
今日推荐