Object类的 to String方法和 equals方法(常用API第二部分)

  Object类

java.lang.Object类是java语言中的跟类,即所有类的父类。它中描述的所有方法子类都可以使用,在对象实例化的时候,最终找的父类就是Object。

lang包的类有个特点,无需导包直接使用。 

 

 

toString方法的使用

 

  1. 看一个类是否重写了toString方法,直接打印这个类对应对象的名字即可。
  2. 如果没有重写toString方法,那么打印的就是对象的地址值(默认)。
  3. 如果重写了toString方法,那么就按照重写的方式打印。
  4. 用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方法的使用(比较地址值)

 

 

  1. person类默认继承了object类,所以可以使用object类的equals方法。
  2. boolean equals(object obj)指示其他某个对象是否与此对象"相等"。
  3. 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);

 

posted @ 2020-11-07 00:52  ZHU_FENG  阅读(261)  评论(0)    收藏  举报