定义
- API就是别人定义好的工具类和工具包
- 目的:避免重复造轮子,提升开发效率,更加专注于实现业务逻辑
Object 类
object类是所有类的祖宗类,所有的类型都是可以使用Object的方法的
最常见的三个方法:
- toString:print就会调用这个方法,这个方法一般会使用属性进行重写
- equals:判断两个对象是否相等,这个方法一般会使用属性进行重写
- clone:对象克隆
重寫toString和equals
@Data
public class Student implements Cloneable{
private String name;
private int age;
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null || getClass() != obj.getClass()) {
return false;
}
Student student = (Student) obj;
return age == student.age && name.equals(student.name);
}
}
使用
Student student = new Student();
student.setName("张三");
student.setAge(18);
Student student1 = new Student();
student1.setName("张三");
student1.setAge(18);
// 因为Student类重写了equals方法,所以这里返回true
System.out.println(student.equals(student1));
// 因为Student类重写了toString方法,所以这里返回Student{name='张三', age=18}
System.out.println(student);
- 直接赋值会指向同一个对象,导致修改
新对象和源对象绑定在一起
- 克隆对象知识克隆了属性,
克隆对象和源对象是两个不同的个体
- 重写 clone ,想要实现克隆必须实现
接口Cloneable
- 虽然父类有clone的方法,但是返回的Object对象,可以重写,
在重写方法中进行强制转换一下
@Data
public class Student implements Cloneable{
一万行代码
@Override
public Student clone() throws CloneNotSupportedException {
return (Student) super.clone();
}
}
使用
// 对象直接赋值,student2和student指向同一个对象 修改student2的name属性,student的name属性也会改变
Student student2 = new Student();
student2 = student;
student2.setName("李四");
System.out.println(student);
// 对象克隆,student3和student指向不同的对象 修改student3的name属性,student的name属性不会改变
Student student3 = new Student();
student3 = student.clone();
student3.setName("王五");
System.out.println(student);
浅拷贝和深拷贝
上述的克隆方法是浅拷贝
- 浅拷贝:如果属性中存在引用类型,拷贝的是属性对象的地址,而非重新创建
- 深拷贝:如果属性中存在引用类型,会重新创建一个属性对象,将新的属性对象赋值给克隆对象
深拷贝的简单实现
- 如果引用类型的层级不深,而且已知哪些属性是引用类型,你可以
手动地拷贝所有的引用属性
@Override
public Student clone() throws CloneNotSupportedException {
Student cloneStudent = (Student) super.clone();
ArrayList cloneScores = (ArrayList) scores.clone();
cloneStudent.setScores(cloneScores);
return cloneStudent;
}