1. Object 类
(1) Object类是Java中所有类的祖宗类,因此,Java中所有类的对象都可以直接使用Object类中提供的一些方法(public class Object)。
. (2) Object类常见方法
方法 | 说明 |
public String toString() | 返回对象的字符串形式 |
public boolean equals(Object obj) | 判断两个对象是否相等 |
protected Object clone() | 对象克隆(会复制一个一模一样的新对象返回) |
(3) toString()方法存在的意义就是为了被子类重写,以便返回对象的具体内容
(4) equals(Object obj):直接比较两个对象的地址是否完全相同用"=="替代equals,equals存在的意义就是为了被子类重写,以便子类来定制比较规则(比如计较对象的内容)
(5) protected Object clone()对象克隆:需要实现Cloneable接口,方法需要throws CloneNotSupportedException
①浅克隆:拷贝出的新对象,与源对象中的数据一模一样(引用类型拷贝的只是地址)
②深克隆:对象中基本数据类型的数据直接拷贝;对象中字符串数据拷贝的还是地址;对象中其他的对象,不会拷贝地址,会创建新对象。
//Cloneable接口是一种标记接口 clone方法需要实现该接口
public class Student implements Cloneable {
private int id;
private String name;
private Double[] grades;
public Student() {
}
public Student(int id, String name, Double[] grades) {
this.id = id;
this.name = name;
this.grades = grades;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//重写 toString方法 idea快捷键生成,类中右键选择Generate->toString()
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", grades=" + grades +
'}';
}
//重写 equals方法 idea快捷键生成,类中右键选择Generate->equals() and hashCode()
@Override
public boolean equals(Object o) {
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return id == student.id && Objects.equals(name, student.name) && Objects.equals(grades, student.grades);
}
//重写 clone方法
//浅克隆
/* @Override
protected Object clone() throws CloneNotSupportedException {
//super去调用Object中的clone方法
return super.clone();
}*/
//深克隆
@Override
protected Object clone() throws CloneNotSupportedException {
//super去调用Object中的clone方法
Student s = (Student) super.clone();
s.grades = s.grades.clone();
return s;
}
}
public static void main(String[] args) throws CloneNotSupportedException {
// object类常用方法
//toString
Double[] dArr = {60.0,70.6,80.6};
Student s1 = new Student(18, "卡莎",dArr);
//System.out.println(s1.toString());
//.toString()可以默认不写
System.out.println(s1);//没重写tostring方法 打印的是对象的地址
System.out.println(s1);//重写tostring方法 打印的是对象的内容 Student{id=18, name='卡莎', grades=[Ljava.lang.Double;@5b480cf9}
//equals 方法 默认对比的是对象地址
Student s2 = new Student(18, "卡莎",dArr);
System.out.println(s1.equals(s2));//没重写equals方法 false
System.out.println(s1.equals(s2));//重写equals方法 true
//clone 对象克隆(会复制一个一模一样的新对象返回)
// protected修饰 使用的话需重写clone方法
//浅克隆
Student s3 = (Student) s2.clone();
System.out.println(s3);// Student{id=18, name='卡莎', grades=[Ljava.lang.Double;@5b480cf9}
System.out.println(s2.equals(s3));//true
//深克隆 private Double[] grades数组的地址发生了变化
System.out.println(s3);// Student{id=18, name='卡莎', grades=[Ljava.lang.Double;@6f496d9f}
}
2. Objects类
(1) Objects是一个工具类,提供了很多操作对象的静态方法供我们使用(public final class Objects extends Object)
(2) Objects常用方法
方法 | 说明 |
public static boolean equals(Object a, Object b) | 先做非空判断,再比较两个对象 |
public static boolean isNull(Object obj) | 判断对象是否为null,为null返回true,否则false |
public static boolean nonNull(Object obj) | 判断对象是否不为null,不为null返回true,否则false |
public static void main(String[] args) {
//Objects
//equals 先做非空判断,再比较两个对象是否相等
String s1 = null;
String s2 = "abc";
//System.out.println(s1.equals(s2)); //NullPointerException异常
System.out.println(Objects.equals(s1, s2));//false 更安全
//isNull 判断对象是否为null,为null返回true,否则false
System.out.println(Objects.isNull(s1));//true
System.out.println(Objects.isNull(s2));//false
// 判断对象是否不为null,不为null返回true,否则false
System.out.println(Objects.nonNull(s1));//false
System.out.println(Objects.nonNull(s2));//true
}