Object类的 to String方法和 equals方法(常用API第二部分)
Object类
java.lang.Object类是java语言中的跟类,即所有类的父类。它中描述的所有方法子类都可以使用,在对象实例化的时候,最终找的父类就是Object。
lang包的类有个特点,无需导包直接使用。
toString方法的使用
- 看一个类是否重写了toString方法,直接打印这个类对应对象的名字即可。
- 如果没有重写toString方法,那么打印的就是对象的地址值(默认)。
- 如果重写了toString方法,那么就按照重写的方式打印。
- 用toString方法快捷键:alt+Insert,然后选择to'String() 即可。
类;
1 public class Person { 2 3 private String name; 4 private int age; 5 6 public Person() { 7 } 8 9 public Person(String name, int age) { 10 this.name = name; 11 this.age = age; 12 } 13 14 /* 15 直接打印对象的地址值没有意义,需要重写Object类的toString方法。 16 打印对象的属性(name,age) 17 */ 18 19 /* @Override 20 public String toString() { 21 return "person{name="+name+", age="+age+"}"; 22 }*/ 23 24 25 @Override 26 public String toString() { 27 return "Person{" + 28 "name='" + name + '\'' + 29 ", age=" + age + 30 '}'; 31 } 32 33 public String getName() { 34 return name; 35 } 36 37 public void setName(String name) { 38 this.name = name; 39 } 40 41 public int getAge() { 42 return age; 43 } 44 45 public void setAge(int age) { 46 this.age = age; 47 } 48 }
main:
1 package Demo008; 2 3 import java.util.ArrayList; 4 import java.util.Random; 5 import java.util.Scanner; 6 7 public class Demo01ToString { 8 9 10 public static void main(String[] args) { 11 Person p = new Person("张三", 18); 12 String s = p.toString(); 13 System.out.println(s); 14 15 16 Random r = new Random();//java.util.Random@880ec60 没有重写了toString方法, 17 System.out.println(r); 18 19 Scanner sc = new Scanner(System.in);//java.util.Scanner[delimiters=\p{javaWhitespace}+... 重写了toString方法, 20 System.out.println(sc); 21 22 ArrayList<Integer> list = new ArrayList<>();//[1, 2] 重写了toString方法, 23 list.add(1); 24 list.add(2); 25 System.out.println(list); 26 27 } 28 }
效果:

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
示范;
Person类和上面的一样;
普通类;
1 package Demo008; 2 3 public class Demo02equals { 4 public static void main(String[] args) { 5 Person p1 = new Person("张三",18); 6 Person p2 = new Person("赵云",18); 7 8 //如果结果是true的话,那它们的地址值就得一样,所以在下面加多一行代码即可。 9 p1=p2; 10 11 12 13 System.out.println("p1"+p1);//p1Demo008.Person@58ceff1 14 System.out.println("p2"+p2);//p2Demo008.Person@7c30a502 15 16 boolean b = p1.equals(p2); 17 System.out.println(b);//false 18 19 20 } 21 }
效果;

equals方法的使用(比较属性值)
object类的equals方法默认比较的是两个对象的地址值,显然没有意义。
所以我们需要重写equals方法,比较两个对象的属性值(name,age)
对象的属性值一样的话,返回true,否则返回false。
问题;
隐含着一个多态
object obj = p2 = new person("赵云",18);
多态的弊端:无法使用子类特有的内容(属性,方法)
解决:可以使用向下转型(强转)把object类型转换为person
用equals方法快捷键:alt+Insert,然后选择equals() and hashCode() 即可。
1 package Demo008; 2 3 import java.util.Objects; 4 5 public class Person { 6 7 private String name; 8 private int age; 9 10 public Person() { 11 } 12 13 public Person(String name, int age) { 14 this.name = name; 15 this.age = age; 16 } 17 18 19 20 /* @Override 21 public boolean equals(Object obj) { 22 23 //增加一个判断,传递参数obj的this本身,直接返回false,提高效率 24 if (obj ==this){ 25 return true; 26 } 27 28 //增加一个判断,传递的参数obj是null,直接返回false,提高程序效率 29 if (obj == null) { 30 return false; 31 } 32 33 // 增加一个判断,是person类型在转换,防止类型转换异常ClassCastException 34 35 if (obj instanceof Person) { 36 //使用向下转型(强转)把object类型转换为person。 37 Person p = (Person) obj; 38 //比较两个对象的属性;一个是调用方法的this(p1),一个就是P(obj=p2) 39 boolean b = this.name.equals(p.name) && this.age == p.age; 40 return b; 41 42 } 43 //如果不是person类型直接返回false 44 return false; 45 } 46 47 @Override 48 public int hashCode() { 49 50 return Objects.hash(name, age); 51 }*/ 52 53 54 @Override 55 public boolean equals(Object o) { 56 if (this == o) return true; 57 if (o == null || getClass() != o.getClass()) return false; 58 Person person = (Person) o; 59 return age == person.age && Objects.equals(name, person.name); 60 } 61 62 @Override 63 public int hashCode() { 64 65 return Objects.hash(name, age); 66 } 67 68 public String getName() { 69 return name; 70 } 71 72 public void setName(String name) { 73 this.name = name; 74 } 75 76 public int getAge() { 77 return age; 78 } 79 80 public void setAge(int age) { 81 this.age = age; 82 } 83 }
1 package Demo008; 2 3 import java.util.Random; 4 5 public class Demo02equals { 6 public static void main(String[] args) { 7 Person p1 = new Person("张三",18); 8 Person p2 = new Person("赵云",18); 9 10 //如果结果是true的话,那它们的地址值就得一样,所以在下面加多一行代码即可。 11 p1=p2; 12 13 14 15 System.out.println("p1"+p1);//p1Demo008.Person@58ceff1 16 System.out.println("p2"+p2);//p2Demo008.Person@7c30a502 17 18 Random r = new Random(); 19 20 //boolean b = p1.equals(r); 21 boolean b = p1.equals(null); 22 // boolean b = p1.equals(p1); 23 System.out.println(b);//false 24 25 26 } 27 }
注意此代码;
boolean b = p1.equals( 可以传递任意的对象 );
System.out.println(b);

浙公网安备 33010602011771号