目录
A:作用:比较两个对象的 B:重写前:比较的是对象的地址值 C:重写后:比较的是对象中的属性值(二)Objects类1.equals()方法 比较两个对象是否相同,但是加了一些健壮性的判断!
一.Object类的toString方法
java.lang.Object类
类 Object是类层次结构的根(最顶层)类。每个类都使用Object作为超(父)类。
所有对象(包括数组)都实现这个类的方法。
public class Demo01ToString {
public static void main(String[] args) {
/*
person类默认继承类Object类,所以可以使用Object类中的toString方法
String toString()返回值对象的字符串表示。
*/
Person p = new Person("张三",18);
String s = p.toString();
System.out.println(s);//Day1.Demo1.Person@75b84c92
//直接打印对象的名字,其实就是调用对象的toString方法 p = p.toString();
System.out.println(p);//Day1.Demo1.Person@75b84c92
/*
看一个类是否重写类toString方法,直接打印这个类对应对象的名字即可
如果没有重写同String方法,那么打印的就是对象的地址值(默认)
如果重写toString方法,那么就按照重写的方式打印
*/
Random r = new Random();
System.out.println(r);//java.util.Random@6bc7c054
Scanner sc = new Scanner(System.in);
System.out.println(sc);//java.util.Scanner[delimiters=\p{javaWhitespace}+][position=0][match valid=false][need input=false][source closed=false][skipped=false][group separator=\x{2c}][decimal separator=\x{2e}][positive prefix=][negative prefix=\Q-\E][positive suffix=][negative suffix=][NaN string=\Q�\E][infinity string=\Q∞\E]
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
System.out.println(list);//[1,2] 重写toString方法
}
}
public class Person {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
/*
直接打印对象的地址值没有意义,需要重写Object类的toString方法
打印对象的属性(name,age)
*/
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
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;
}
}
二.Object类的equals方法
Person类默认继承了Object类,可以使用Object类的equals方法。
boolean equals(Object obj)指示其他某个对象是否此对象“相等”。
Object类equals方法的源码:
public boolean equals(Object obj){
Return(this == obj);
}
参数:
Object obj:可以传递任意的对象。
方法体:
==:比较运算符,返回的就是一个布尔值 true,false
基本数据类型:比较的是值
引用数据类型:比较的是两个对象的地址值
this是谁?那个对象调用的方法,方法中的this就是那个对象;p1调用的equals方法,所以this就是p1
obj是谁?传递过来的参数p2
this==obj —> p1==p2
public class Demo02Equals {
public static void main(String[] args) {
Person p1 = new Person("迪丽热巴",18);
Person p2 = new Person("古力娜扎",18);
p1=p2;
System.out.println("p1"+p1);
System.out.println("p2"+p2);
boolean b = p1.equals(p2);
System.out.println(b);
}
}
三.重写Object类的equals方法
Object类的equals方法默认比较的是两个对象的地址值,没有意义
所以我们需要写equals方法,比较两个对象的属性值(name,age)
对象的属性值一样,返回true;否则返回false
问题:
隐含一个多态
Object obj = p2 = new Preson(“古力娜扎”,18);
多态弊端:无法使用子类特有的内容(属性,方法)
解决:可以使用用向下转型(强转)把Object类型转换为Person
private String name;
private int age;
@Override
public boolean equals(Object obj) {
//增加一个判断,传递的参数obj是this本身,直接返回true,提供程序效率
if (obj == this) {
return true;
}
//增加一个判断,传递的是参数obj是null,直接返回false,提供程序的效率
if (obj == null) {
return false;
}
//增加一个判断,是person类型在转换,防止类型转换异常ClassCastException
if (obj instanceof Person) {
//使用向下转型(强转)把Object类型转换为Person
Person p = (Person) obj;
//比较两个对象的属性;一个是调用方法的this(p1),一个就是p(obj=p2)
boolean b = this.name.equals(p.name) && this.age==p.age;
return b;
}
//不是Person类型直接返回false
return false;
}
}
四.Objects类
在刚才IDEA自动重写equals代码中,使用到了javautilobjects类,那么这个类是什么呢?
在JDK7添加了一个Objects工具类,它提供了一些方法来操作对象,它由一些静态的实用方法组成,这些方法是 null-save(空指针安全的)或null-tolerant(容忍空指针的),用于计算对象的hashcode、返回对象的字符串表示形式、比较两个对象。
在比较两个对象的时候,Object的equals方法容易抛出空指针异常,而Objects类中的equals方法就优化了这个问题。方法如下:
- public static boolean equals(Object a,Object b);判断两个对象是否相等。
我们可以查看一下源码,学习一下:
public static boolean equals(Object a, Object b) {
return (a == b) || (a != null && a.equals(b));}
五.重写Object类的Objects方法
public class Demo03Object {
public static void main(String[] args) {
//String s1 = "abc";
String s1 = null;
String s2 = "abc";
// boolean b = s1.equals(s2);//NullPointerException null是不能调用方法的,会抛出空指针异常、
// System.out.println(b);
/*
public static boolean equals(Object a , Object b){
return(a == b)||(a !=null && a.equals(b));
}
*/
boolean b2 = Objects.equals(s1,s2);
System.out.println(b2);
}
}