目录
Object类
object类为所有类的共有父类,所以它可以接收所有的引用类型,包括包装类。
我们可以在任意子类中覆写Object的方法,例如.equals方法和toString方法等。
toString方法
当我们在打印方法中写入引用对象名会自动调用toString方法,而如果出现了地址之类的东西很有可能是因为我们没有覆写类的toString方法所以去调用Object类了。
toString方法大伙自己实现,我觉得应该都会。
.equals方法
比较对象是否相等(内容并非地址)
.equals方法应用的场景非常多,例如String引用类型就覆写了.equals方法所以我们可以比较它的字符串。
下面我们来在类中实现一个.equals方法
注意事项:
1. 在我们定义方法时,选择传递的形参为Object类型,这样我们可以将任意类型传递到此方法中
2.注意若传递的对象和原对象相同,就无需再比较是否相等
3.如若不是同一对象,我们需要调用instance方法来证实传递进来的Object类型是需要比较的对象类型向上转型而来,否则不可以进行比较。
4.若需要比较,先将传递进来的Object类型向下转型为需要比较的对象类型。
代码实现:
package object_test;
/**
* @author DELL
* @date 2022-05-06 16:22
*/
public class ObjectTest {
public static void main(String[] args) {
Student stu1 = new Student("小王",18);
Student stu2 = new Student("小王",18);
Student stu3 = new Student("小周",20);
System.out.println(stu1==stu2);
System.out.println(stu1.equals(stu2));
System.out.println(stu2.equals(stu3));
}
}
class Student {
private int age;
private String name;
public Student(String name,int age) {
this.age = age;
this.name = name;
}
@Override
public boolean equals(Object obj) {
if(this==obj) {
return true;
}
if(obj instanceof Student) {
Student stu = (Student)obj;
return this.age==stu.age&&this.name.equals(stu.name);
}
return false;
}
}
Comparable接口
comparable原理及应用
任何类继承Comparable接口就存在了compareTo方法,用于比较两个对象的大小,根据大,相等,小分别返回 1 0 -1 三个整型值的三种情况。当我们调用数组排序方法,Arrays.sort时,就会调用数组成员对象内部的compareTo方法。
compareTo方法实现
注意事项:
1.传入的依旧是Object类对象,所以还需要进行对象类型的确认以及查看是否为原对象
2.若不是同一类型对象,无法比较,抛出异常
代码实现:
package comparable_test;
/**
* @author DELL
* @date 2022-05-12 14:22
*/
public class Person implements Comparable{
private int age;
private String name;
public Person(String name,int age) {
this.name=name;
this.age=age;
}
@Override
public int compareTo(Object o) {
if(this==o) {
return 0;
}
if(o instanceof Person) {
Person per = (Person) o;
return this.age-per.age;
}
throw new IllegalArgumentException("不是同一类型,无法比较");
}
}
sort方法实现
因为是数组比较,所以我们要传入的是数组,只要是实现了Comparable接口的就可以,所以传的是Comparable类型数组。
//sort方法实现
public static void sort(Comparable[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - i - 1; j++) {
// if (arr[j] > arr[j + 1]) // swap
if (arr[j].compareTo(arr[j + 1]) > 0) {
// 前一个大于后一个,交换j和j + 1
Comparable temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
完整代码
package comparable_test;
/**
* @author DELL
* @date 2022-05-12 14:22
*/
public class Person implements Comparable{
private int age;
private String name;
public Person(String name,int age) {
this.name=name;
this.age=age;
}
@Override
public int compareTo(Object o) {
if(this==o) {
return 0;
}
if(o instanceof Person) {
Person per = (Person) o;
return this.age-per.age;
}
throw new IllegalArgumentException("不是同一类型,无法比较");
}
public static void main(String[] args) {
Person[] arr = new Person[] {
new Person("小王",19),
new Person("小李",20),
new Person("小周",21)
} ;
sort(arr);
}
//sort方法实现
public static void sort(Comparable[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - i - 1; j++) {
// if (arr[j] > arr[j + 1]) // swap
if (arr[j].compareTo(arr[j + 1]) > 0) {
// 前一个大于后一个,交换j和j + 1
Comparable temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
}