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()
Java--Object类大总结
猜你喜欢
转载自blog.csdn.net/weixin_42443419/article/details/89158872
今日推荐
周排行