Java Object类的简单学习

Object的toString方法

  1. toString 方法返回的是字符串,直接打印对象的名字,就是调用对象的toString,也就是打印对象堆内存中的地址值

  2. 重写toString方法

    /**
     * @Version: 1.8.0_201       Java SE 8
     * @Description: toString 方法返回的是字符串,直接打印对象的名字,就是调用对象的toString
     *               也就是打印对象堆内存中的地址值
     */
    public class Student {
        private String name;
        private int age;
    
        public Student(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        public void methodStudentMassage() {
            System.out.println(
                    "Student{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    '}'
            );
        }
    
        /**
         * 重写toString方法
         * @return 学生的信息
         */
        @Override
        public String toString() {
            return "Student{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    '}';
        }
    
    }
    
  3. 测试重写的toString方法

    /**
     * @Version: 1.8.0_201       Java SE 8
     */
    public class DemoStudentToString {
        public static void main(String[] args) {
            Student student = new Student("Lee Hua", 21);
    
            // 不重写toString方法
            student.methodStudentMassage();
    
            // 重写了toString方法
            System.out.println(
                    student.toString()
            );
        }
    }
    
  4. 输出结果

    Student{name='Lee Hua', age=21}
    Student{name='Lee Hua', age=21}
    

Object类的equals方法

  1. quals方法:其他某个对象是否与此对象相等

  2. 调用成员方法quals并指定参数为另一个对象,则可判断这两个对象是否相同

    public boolean equals(Object obj) {
            return (this == obj);
    }
    

    this 表示:哪个对象调用了equals方法,那么this就是那个对象

  3. 实例理解

    1. 创建一个Person类,用于测试

      • public class Person {
            private String name;
            private int age;
        
            public Person(String name, int age) {
                this.name = name;
                this.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;
            }
        }
        
    2. 测试

      public class DemoPersonEquals {
          public static void main(String[] args) {
              Person person1 = new Person("一号", 20);
              Person person2 = new Person("二号", 21);
      
              // 对象person1 和 对象person2 进行比较
              boolean p = person1.equals(person2);
              System.out.println(person1);
              System.out.println(person2);
              System.out.println(p);
          }
      }
      
    3. 输出结果

      Person@61bbe9ba
      Person@610455d6
      false
      
    4. 实例补充

      /**
       * Person类如果重写类Object的toString方法,则返回字符串,而不是地址值
       * 举例:
       */
      @Override
      public String toString() {
          return "Person{" +
                  "name='" + name + '\'' +
                  ", age=" + age +
                  '}';
      }
      
  4. 在Person类里边覆盖重写equals方法

    public class Person {
        /**
         * 多态,无法使用子类特有内容,所以可进行覆盖重写
         * 覆盖重写equals方法,提高程序的效率
         */
        @Override
        public boolean equals(Object obj) {
            // 如果传递的参数obj是this本身,直接返回true
            if (obj == this) {
                return true;
            }
            // 如果传递参数是null,直接返回false
            if (obj == null) {
                return false;
            }
            // 防止类型转换报:ClassCastException
            if (obj instanceof Person) {
                // 向下转型,将 obj 转换为 Person 类型
                Person person = (Person)obj;
                return this.name.equals(person.name) && this.age == person.age;
            }
            // 不是Person类,也不是null,也直接返回false
            else {
                return false;
            }
        }
    }
    
  5. 使用IDEA编译工具,可以用 Generate 直接生成与上等功能代码

    public class Person {
        @Override
        public boolean equals(Object o) {
            if (this == o) {
                return true;
            }
            if (o == null || getClass() != o.getClass()) {
                return false;
            }
            Person person = (Person) o;
            return age == person.age &&
                    name.equals(person.name);
        }
    }
    

注意事项

使用equals方法时,防止空指针异常

实例理解

import java.util.Objects;

public class DemoObjectEquals {
    public static void main(String[] args) {
        String s1 = "abc";
        String s2 = null;

        // 不会出现空指针异常                // 输出 false
        System.out.println(
                s1.equals(s2)
        );
        
        // 会出现空指针异常NullPointerException         // 报错 Exception in thread "main" java.lang.NullPointerException
        System.out.println(
                s2.equals(s1)
        );
        
        // 空指针异常,可以使用java.util.Objects的equals方法,防止空指针异常     // 输出 false
        System.out.println(
                Objects.equals(s1, s2)
        );
    }
}
posted @ 2020-01-11 14:36  LeeHua  阅读(313)  评论(0编辑  收藏  举报