Object类详解、断点测试
- 一、Object类详解
- Object的方法摘要
- equals方法
- 如何重写equals方法
- hashCode方法
- toString方法
- finalize方法
- clone方法
- 浅拷贝
- 深拷贝
- 代码演示
- Date和String类型转换
- 二、断点调试
一、Object类详解
Object类是所有java类的根基类,也就意味着所有的java对象都拥有Object类的属性和方法。如果在类的声明中未使用extends关键子指明其父类,则默认继承Object类
Object的方法摘要
equals方法
==
注意:基本数据类型==引用数据类型时,比较的也是值是否相等equals
补充:
- java中的基本数据类型的包装类、String中的equals方法进行了重写,比较的是值/属性是否相同
- 不重写的话,会继承Object类,然后比较地址
- 看到==优先考虑是基本数据类型还是引用数据类型
如何重写equals方法
- 判断是否同一对象
- 判断是否不为空
- 判断运行类型是否相同(或者说对象o是否为Person类或其子类所创建)
- 向下转型去判断属性是否相同
@Override
public boolean equals(Object o) {
if (this == o) return true;//判断当前对象和o是否同一个对象
if (o == null || getClass() != o.getClass()) return false;//判断对象o是否为空,还有当前对象的运行时类型是否和o的相同
Person person = (Person) o;//向下转型后才能比较各个属性
return age == person.age && gender == person.gender && Objects.equals(name, person.name);
}
hashCode方法
toString方法
介绍:
重写:一般是输出对象的属性
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", gender=" + gender +
'}';
}
注意:直接输出对象等价于直接调用toString()方法
finalize方法
重写
clone方法
clone()方法是用于浅克隆或者深克隆一个java对象的,但是要注意一个误区:clone方法是Object类的,并不是Cloneable接口的,Cloneable只是一个标记接口,标记接口是用于标记实现该接口的类具有某种该接口标记的功能,常见的标记接口有三个:Serializable、Cloneable、RandomAccess,没有实现Cloneable接口,那么调用clone方法就会爆出CloneNotSupportedException异常。
浅拷贝
被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象
也就是说,一个默认的clone()方法实现机制,仍然是赋值。
深拷贝
深拷贝在浅拷贝的基础上,会将引用类型的引用对象再次复制一遍
代码演示
package review;
/**
* @author 毕晶
* @date 2022/8/6 5:36 PM
*/
public class ShowCopy {
public static void main(String[] args) throws CloneNotSupportedException {
Person person = new Person("张三", 19, new Hobby());
Person copyPerson = (Person) person.clone();
System.out.println(copyPerson == person);//false
System.out.println(copyPerson.hobby == person.hobby);//浅拷贝时为true,因为拷贝了引用;深拷贝时false
}
}
class Person implements Cloneable {
String name;
int age;
Hobby hobby;
public Person(String name, int age, Hobby hobby) {
this.name = name;
this.age = age;
this.hobby = hobby;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Hobby getHobby() {
return hobby;
}
public void setHobby(Hobby hobby) {
this.hobby = hobby;
}
//浅拷贝
// @Override
// protected Object clone() throws CloneNotSupportedException {
// return super.clone();
// }
//深拷贝
@Override
protected Object clone() throws CloneNotSupportedException {
Person person = (Person) super.clone();
person.setHobby((Hobby) person.hobby.clone());
return person;
}
}
class Hobby implements Cloneable {
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
Date和String类型转换
Date转String
String转Date
二、断点调试
- 步过:单行执行
- 步入:进入方法体内(自己写的方法)
- 强制步入:强制进入方法体内(包括jdk的方法)
- 步出:跳出方法体,就是返回上一层方法体内
- resume:跳到下一个断点
- 可以边调试边打断点
- 也可以在jdk的源码上打断点