美文网首页
三 常用API第二部分——第一节 Object类

三 常用API第二部分——第一节 Object类

作者: 杜艳_66c4 | 来源:发表于2022-05-20 20:40 被阅读0次

    1、Object类的 equals方法

    equals方法源码
    public boolean equals(Object obj){
    return (this == obj)
    }

    参数:obj 可以是任意对象, == 比较运算符。返回true false, 默认比较的是地址值
    this 是谁?this 是哪个对象调用的方法,方法红的this就是哪个对象。p1.equals(p2), p1调用的方法,this 就是p1

    2、重写object类的equals方法

    package equalsDemo;
    
    import java.util.Objects;
    
    /**
     * created by apple on 2020/6/7
     * Object 类的equals方法,默认比较的是对象的地址值,没有意义,重写,比较对象的属性(name ,age)
     * 问题: 多态
     * 多态的弊端:无法使用子类特有的内容:属性和方法
     * Object obj = p2 = new Person("t",19);
     * 解决弊端:可以使用向下转型,强转 ,把Object类型, instanceof Person转化为person
     */
    public class Person {
        String name;
        int age;
    //这个重写可以直接由快捷键生成,右键 equals生成
        @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);
        }
    
        /* @Override
            public boolean equals(Object obj) {
                //增加一个判断,传递的参数obj如果是this本身,直接返回true,提高程序效率
                if (obj == this){
                    return true;
                }
                //增加一个判断,如果传递的参数是obj是null,直接返回false,提高程序的效率
                if (obj == null){
                    return false;
                }
                //增加一个判断 防止类型转换异常 clascastException
                if (obj instanceof Person){
                    //使用向下转型 把Obj 转换为person类型
                    Person p = (Person) obj;
                    //比较两个对象的属性  一个是this(p1),一个是p(p2)
                    boolean b = this.name.equals(p.name)&&this.age==p.age;
                    return b;
                }
                //不是person类型,直接返回false
                return false;
    
            }
    
            @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;
        }
    
        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
    }
    
    package equalsDemo;
    
    import java.util.ArrayList;
    
    /**
     * created by apple on 2020/6/7
     */
    public class DemoPerson {
        public static void main(String[] args) {
            Person p1 = new Person("s",19);
            Person p2 = new Person("s",19);
            Person p3 = new Person("t",19);
            System.out.println(p1);
            System.out.println(p2);
            ArrayList<String> list = new ArrayList<>();
            boolean b = p1.equals(list);  //list是obj .所以能比较
            boolean c = p1.equals(p1);
            System.out.println(b);
            System.out.println(c);
            System.out.println(p1.equals(p2));
    
        }
    }
    结果:
    equalsDemo.Person@11c1
    equalsDemo.Person@11c1
    false
    true
    true
    

    3、Objects 类的equals 方法可以防止空指针

    image.png

    Objects 类的equals 源码

    public static boolean equals(Object a, Object b) {
            return (a == b) || (a != null && a.equals(b));
        }
    
    package equalsDemo;
    
    import java.util.Objects;
    
    /**
     * created by apple on 2020/6/7
     */
    public class ObjectsDemo {
        public static void main(String[] args) {
            String s1 = null;
            String s2 = "s";
            String s3 = "s";
           // boolean b = s1.equals(s2); //会报空指针异常, null是不能调用方法的,就会抛出空指针异常
    // Objects类的equals方法, 对两个对象进行比较, 防止空指针异常
            boolean b2 = Objects.equals(s1, s2);
            boolean b3 = Objects.equals(s2, s3);
          //  System.out.println("b:" + b);
            System.out.println("b2:" + b2);
            System.out.println("b3:" + b3);
    
        }
    }
    

    输出:
    b2:false
    b3:true

    4、为什么重写toString()方法

    不得不说,有很多java初学者写java实体类的时候,并没有真正理解重写toString() 方法,可能是口头知道也可能是跟风随带添加toString() 方法,并没有真正理解其意义,如果真要被问起来未必有十足把握回答上 中枪了咩,这篇文章旨在帮助初学者正确解读实体类重写toString() 方法。

    解读一:java默认的toString方法来自Object 类
    在Java中每个类都直接或者间接继承Object 类,toString() 方法同样来自于Object 类。

    其实这不难理解,在没有重写tostring的前提下,每次执行System.out.println() 这个方法默认就会调用一个继承自Object 类型对象的toString 方法,这点是非常重要的基础前提!

    解读二:重写toString()方法的意义所在
    简单一句话就是重写toString() 可以理解为是对对象在打印输出时候的一种格式化。这样做符合业务逻辑,显示结果人性化。

    object类里的toString只是把字符串的直接打印,数字的要转化成字符再打印,而对象,则直接打印该对象的hash码(类似@15db9742 这样的东东),它的值大概就是等于getClass().getName()+’@’+Integer.toHexString(hashCode())
    上代码
    a——编写一个叫Person的实体类以及测试类

    package it.xinyecom.enhance.domain;
    
    /**
     * @author 杜艳艳
     * @version 1.0
     * @date 2020/12/30 20:25
     */
    public class Person {
        private String name;
        private int age;
        public String a;
        protected String b;
         String c;
        private String d;
    
        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        public Person(){
    
        }
    
        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;
        }
    
      /*  @Override
        public String toString() {
            return "Person{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    '}';
        }*/
      public static void main(String[] args) {
          Person person = new Person();
          person.setAge(12);
          person.setName("语音");
          System.out.println(person);
      }
    }
    

    如上,注释了toString()方法的测试效果:

    it.xinyecom.enhance.domain.Person@677327b6
    
    Process finished with exit code 0
    

    重写toString()方法的测试效果:

    Person{name='语音', age=12}
    
    Process finished with exit code 0
    

    总结
    1、没有重写tostring ,每执行System.out.println() 会默认调用Object 的toString 方法,情况如下:


    2、重写tostring,每执行System.out.println() 会调用重写的toString 方法,情况则会根据重写的方法打印输出成自己想得到的格式。

    3、为了养成良好习惯,建议每次编写实现类都重写一下tostring() 方法!!

    相关文章

      网友评论

          本文标题:三 常用API第二部分——第一节 Object类

          本文链接:https://www.haomeiwen.com/subject/yxyhtktx.html