Object类---相关操作

Object类—相关操作

  1. toString方法

    • package cn.xiaoge.day12.demo01;
      
      import java.util.Objects;
      
      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 "abc";
             return "Person{name="+name+" ,age="+age+"}";
          }*/
          /*@Override
          public String toString() {
              return "Person{" +
                      "name='" + name + '\'' +
                      ", age=" + age +
                      '}';
          }*/
      
      
      
          /*
              Object类的equals方法,默认比较的是两个对象的地址值,没有意义
              所以我们要重写equals方法,比较两个对象的属性(name,age)
              问题:
                  隐含着一个多态
                  多态的弊端:无法使用子类特有的内容(属性和方法)
                  Object obj = p2 = new Person("古力娜扎",19);
                  解决:可以使用向下转型(强转)把obj类型转换为Person
           */
      
          /*@Override
          public boolean equals(Object obj) {
              // 增加一个判断, 传递的参数obj如果是null, 直接返回false, 可以提高程序的效率.
              if (obj == null) {
                  return false;
              }
      
              // 增加一个判断, 传递的参数obj如果是this本身, 直接返回true, 提高程序的效率.
              if (this == obj) {
                  return true;
              }
      
              // 增加一个判断, 防止类型转换失败ClassCastException
              if (obj instanceof Person) {
                  // 使用向下转型, 把obj转换为Person类型
                  Person p = (Person) obj;
                  // 比较两个对象的属性, 一个对象是this(p1), 一个对象是p(obj->p2)
                  return this.name.equals(p.name) && this.age == p.age;
              }
              // 不是Person类型, 直接返回false
              return false;
          }
      */
      
          @Override
          public boolean equals(Object o) {
              if (this == o) return true;
              // getClass() != o.getClass() 使用反射技术, 判断o是否是Person类型  等效于 obj instanceof Person
              if (o == null || getClass() != o.getClass()) return false;
              Person person = (Person) o;
              return age == person.age &&
                      Objects.equals(name, person.name);
          }
      
          @Override
          public int hashCode() {
      
              return Objects.hash(name, 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;
          }
      }
      
    • 执行路口

      package cn.xiaoge.day12.demo01;
      
      import java.util.ArrayList;
      import java.util.Random;
      import java.util.Scanner;
      
      /*
          java.lang.Object
          类 Object 是类层次结构的根(父)类。
          每个类(Person,Student...)都使用 Object 作为超(父)类。
          所有对象(包括数组)都实现这个类的方法。
       */
      public class Demo01ToString{
          public static void main(String[] args) {
              /*
              Object里的toString源码
              public String toString() {
                  return getClass().getName() + "@" + Integer.toHexString(hashCode());
              }
               */
              /*
                  Person类默认继承了Object类,所以可以使用Object类中的toString方法
                  String toString() 返回该对象的字符串表示。
               */
              Person p = new Person("张三",18);
              String s = p.toString();
              System.out.println(s);//cn.xiaoge.day12.demo01.Person@16e8e0a | abc | Person{name=张三 ,age=18}
      
              //直接打印对象的名字,其实就是调用对象的toString  p=p.toString();
              System.out.println(p);//cn.xiaoge.day12.demo01.Person@16e8e0a | abc | Person{name=张三 ,age=18}
      
              //看一个类是否重写了toString,直接打印这个类的对象即可,如果没有重写toString方法那么打印的是对象的地址值
              Random r = new Random();
              System.out.println(r);//java.util.Random@610455d6  没有重写toString方法
      
              Scanner sc = new Scanner(System.in);
              System.out.println(sc);//java.util.Scanner[delimiters=\p{javaWhitespace}+..  重写toString方法
      
              ArrayList<Integer> list = new ArrayList<>();
              list.add(1);
              list.add(2);
              list.add(3);
              System.out.println(list);//[1, 2, 3]  重写toString方法
          }
      }
      
      // 运行结果
      cn.xiaoge.day12.demo01.Person@16e8e0a
        
      cn.xiaoge.day12.demo01.Person@16e8e0a
      
      java.util.Random@610455d6
        
      java.util.Scanner[delimiters=\p{javaWhitespace}+][position=0][match valid=false][need input=false][source closed=false][skipped=false][group separator=\,][decimal separator=\.][positive prefix=][negative prefix=\Q-\E][positive suffix=][negative suffix=][NaN string=\Q�\E][infinity string=\Q∞\E]
      
      [1, 2, 3]
      
  2. eqauls方法

    • package cn.xiaoge.day12.demo01;
      
      import java.util.Objects;
      
      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 "abc";
             return "Person{name="+name+" ,age="+age+"}";
          }*/
          /*@Override
          public String toString() {
              return "Person{" +
                      "name='" + name + '\'' +
                      ", age=" + age +
                      '}';
          }*/
      
      
      
          /*
              Object类的equals方法,默认比较的是两个对象的地址值,没有意义
              所以我们要重写equals方法,比较两个对象的属性(name,age)
              问题:
                  隐含着一个多态
                  多态的弊端:无法使用子类特有的内容(属性和方法)
                  Object obj = p2 = new Person("古力娜扎",19);
                  解决:可以使用向下转型(强转)把obj类型转换为Person
           */
      
          /*@Override
          public boolean equals(Object obj) {
              // 增加一个判断, 传递的参数obj如果是null, 直接返回false, 可以提高程序的效率.
              if (obj == null) {
                  return false;
              }
      
              // 增加一个判断, 传递的参数obj如果是this本身, 直接返回true, 提高程序的效率.
              if (this == obj) {
                  return true;
              }
      
              // 增加一个判断, 防止类型转换失败ClassCastException
              if (obj instanceof Person) {
                  // 使用向下转型, 把obj转换为Person类型
                  Person p = (Person) obj;
                  // 比较两个对象的属性, 一个对象是this(p1), 一个对象是p(obj->p2)
                  return this.name.equals(p.name) && this.age == p.age;
              }
              // 不是Person类型, 直接返回false
              return false;
          }
      */
      
          @Override
          public boolean equals(Object o) {
              if (this == o) return true;
              // getClass() != o.getClass() 使用反射技术, 判断o是否是Person类型  等效于 obj instanceof Person
              if (o == null || getClass() != o.getClass()) return false;
              Person person = (Person) o;
              return age == person.age &&
                      Objects.equals(name, person.name);
          }
      
          @Override
          public int hashCode() {
      
              return Objects.hash(name, 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;
          }
      }
      
    • 执行路口

      package cn.xiaoge.day12.demo01;
      
      public class Demo02Equals {
      
          public static void main(String[] args) {
              /*
                  Person类默认继承了Object类, 所以可以使用Object类的equals方法
                  boolean	equals(Object obj) 指示其他某个对象是否与此对象“相等”。
                  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 p1 = new Person("迪丽热巴", 18);
              Person p2 = new Person("迪丽热巴", 18);
              System.out.println("p1: " + p1); // p1: cn.xiaoge.day12.demo01.Person@11468599
              System.out.println("p2: " + p2); // p2: cn.xiaoge.day12.demo01.Person@43f3f46a
              boolean result = p1.equals(p2);
              System.out.println(result); // false
          }
      
      }
      
      // 运行结果
      p1: cn.xiaoge.day12.demo01.Person@11468599
      p2: cn.xiaoge.day12.demo01.Person@11468599
      true
      
  3. Objects下的equals方法

    • 执行路口

      package cn.xiaoge.day12.demo01;
      
      import java.util.Objects;
      
      public class Demo03Objects {
      
          public static void main(String[] args) {
              // String s1 = "abc";
              // String s2 = "aBc";
              // boolean b = s1.equals(s2);
              // System.out.println(b); // false
      
      
              // String s1 = null;
              // String s2 = "aBc";
              // boolean b = s1.equals(s2); // NullPointerException null不能调用方法的, 就会抛出空指针异常.
      
              /*
                  Objects类的equals方法: 对象两个对象进行比较, 防止空指针异常
                  Objects.equals方法源码:
                  public static boolean equals(Object a, Object b) {
                      return (a == b) || (a != null && a.equals(b));
                  }
               */
      
              String s1 = null;
              String s2 = "aBc";
              boolean b2 = Objects.equals(s1, s2);
              System.out.println(b2); // false
      
          }
      
      }
      
      // 运行结果
      false
      
发布了275 篇原创文章 · 获赞 89 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/zsx1314lovezyf/article/details/102762130
今日推荐