Object
- 祖宗类,所有类的父类
- 一个类一定直接或间接的继承自Object
- Object中存放着所有类都应该拥有的方法,子类可以根据需求选择性的对方法进行重写
常用方法
1. 类对象 getClass():获取引用的实际对象类型
2. int hashCode():获取当前对象的哈希码值
- 重写原因:该方法默认关注对象地址,但是在某种情境下,我们需要关注的是对象内容,对象内容相同则哈希码值相同,所以需要重写
- 重写规则:
1. 属性为String类型,则属性名.hashCode()相加
- String类已经对该方法提供过重写,其关注的就是内容
2. 属性为整型,则直接相加
3. 属性为浮点型,则强转后相加
4. 属性为对象类型,则该类也需要重写hashCode()方法。其后属性名.hashCode()相加
public class Teacher {
private String name;
public int hashCode(){
return name.hashCode();
}
//...省略构造、getter、setter
}
public class Student {
private String name;
private int age;
private double score;
private Teacher tea;
@Override
public int hashCode() {
return name.hashCode() + age + (int) score + tea.hashCode();
}
//...省略构造、getter、setter
}
boolean equals(Object o):判断两个引用是否相等
- 重写原因:该方法默认关注对象地址,但是某种情境下,需要关注对象内容,所以需要重写
- 重写规则:1. 属性为String类型,则属性名.hashCode()相加
- String类已经对该方法提供过重写,其关注的就是内容
2. 属性为整型,则直接相加
3. 属性为浮点型,则强转后相加
4. 属性为对象类型,则该类也需要重写hashCode()方法。其后属性名.hashCode()相加
public class Teacher {
private String name;
public int hashCode(){
return name.hashCode();
}
//...省略构造、getter、setter
}
public class Student {
private String name;
private int age;
private double score;
private Teacher tea;
@Override
public int hashCode() {
return name.hashCode() + age + (int) score + tea.hashCode();
}
//...省略构造、getter、setter
}
boolean equals(Object o):判断两个引用是否相等
- 重写原因:该方法默认关注对象地址,但是某种情境下,需要关注对象内容,所以需要重写
- 重写规则:public boolean equals(Object o) {//Object o=new Student()
//自反性
if (this == o) {
return true;//自己跟自己比,一定相同
}
//非空判断
if (o == null) {
return false;//与null值比,一定不同
}
//类型判断
if (this.getClass() != o.getClass()) {
return false;//实际类型不同,一定不同
}
//类型强转
当前类名 引用名 = (当前类名) o;
//属性值比较
if (多个属性值比较直接&&连接){
//String类型的值需要通过equals方法进行值的比较
//语法:变量名1.equals(变量名2)
//原因:String类对equals方法已经提供过方法重写,关注的就是内容
return true;
}
return false;
}
如果属性为对象类型,想要关注其内容,必须使该类也重写equals方法
String toString():获取对象的详细信息
- 重写原因:该方法默认获取地址相关信息,但是日常开发中,对象的属性信息使用频率更高,所以需要重写
- 重写规则:按照自身需求进行字符串拼接即可
- 特点:**在直接进行引用输出时会自动调用**
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", score=" + score +
", tea=" + tea +
'}';
}
}
public class Test {
public static void main(String[] args) {
Student s1 = new Student("zhangsan", 20, 98,new Teacher("lisi"));
Student s2 = new Student("zhangsan", 20, 98,new Teacher("wangwu"));
System.out.println(s1);
System.out.println(s2);
System.out.println(s1.toString());
System.out.println(s2.toString());
}
}
void finalize():用来进行垃圾对象回收
- 特点:无法手动调用
- 垃圾回收机制:当虚拟机内存已经满到不足以支撑新对象的创建时,JVM虚拟机会自动调用垃圾对象的finalize()方法对其进行销毁,从而释放空间
- 垃圾对象:没有任何引用指向的对象(零引用机制)
- 手动垃圾回收:可以借助垃圾回收器GC,在代码中通过**System.gc()**手动完成垃圾对象回收 |