23.面向对象进阶:常用API——Object(toString、equals)、Objects(equals、isNull)

常用API

Object

Object类的作用

  • 一个类要么默认继承了Object类,要么间接继承了Object类,Object类是Java中的祖宗类
  • Object类的方法是一切子类都可以直接使用的

Object类的常用方法

方法名 说明
public String toString() 默认是返回当前对象在堆内存中的地址信息:类的全限名@内存地址
public Boolean equals(Object o) 默认是比较当前对象与另一个对象的地址是否相同,相同返回true,不同返回false

toString()方法

  • 测试代码:

    package com.java.apitest;
    
    public class Test {
        public static void main(String[] args) {
            Student s = new Student("张三", '男', 20);
            String rs = s.toString();
            
            // 以下语句均返回对象地址值com.java.apitest.Student@3b07d329
            // 以下语句默认调用Student类重写后的toString()方法,此时以下语句将打印对象的内容数据
            System.out.println(rs);
            System.out.println(s.toString());
            System.out.println(s);
        }
    }
    
    
  • 问题引出:

    • 开发中直接输出对象,默认输出对象的地址其实是毫无意义的
    • 开发中输出对象变量,更多的时候是希望看到对象的内容数据而不是对象的地址信息
  • toString()的存在意义:

    • 父类toString()方法存在的意义就是为了被子类重写,以便返回对象的内容信息,而不是地址信息

    因此上述测试代码的中涉及的Student类代码:

    package com.java.apitest;
    
    public class Student {
        private String name;
        private char sex;
        private int age;
    
    
    
        public Student() {
        }
    
        public Student(String name, char sex, int age) {
            this.name = name;
            this.sex = sex;
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public char getSex() {
            return sex;
        }
    
        public void setSex(char sex) {
            this.sex = sex;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        @Override
        public String toString() {
            return "Student{" +
                    "name='" + name + '\'' +
                    ", sex=" + sex +
                    ", age=" + age +
                    '}';
        }
    }
    
    

    使用Alt + Inster实现快速生成本类的toString()方法

    或者编辑toS,两次回车自动生成当前类的toString()方法

equals()方法

  • 测试代码:

    package com.java.apitest;
    
    /**
     * Object类中equals()方法的使用
     */
    public class Test2 {
        public static void main(String[] args) {
            Student s1 = new Student("张三", '男', 20);
            Student s2 = new Student("李四", '女', 20);
            System.out.println(s1.equals(s2)); // false,比较地址值
        }
    }
    
  • 问题引出:

    • 直接比较两个对象的地址是否相同完全可以使用“==”代替equals
  • equals存在的意义

    • 父类equals方法存在的意义就是为了被子类重写,以便子类自己来定制比较规则

    在之前的Student类中重写equals

        @Override
        public boolean equals(Object o) {
            // 判断o是不是学生类型
            if (o instanceof Student) {
                // 判断两个对象的内容是否一样
                Student s2 = (Student) o;   //o是Object类型,必须发生强转,因为Object里面是没有name的
                //注意在进行字符串内容的比较时,一定使用equals而不是==
                //在进行基本数据类型的比较时,应该使用==
                if (this.name.equals(s2.name) &&
                        this.age == (s2.age) &&
                        this.sex == (s2.sex)) {
                    return true;
                /*简化写法
                return this.name.equals(s2.name) &&
                    this.age == (s2.age) &&
                    this.sex == (s2.sex);
                 */
    
                }
    
            } else {
                return false;
            }
            return false;
        }
    

当我们需要比较基本数据类型内容,使用== ,当我们需要比较对象内容,重写equals

  • 使用快捷键Alt + Inster快速生成equals

    连续点击三次下一步,并将生成的hashCode()重写方法删除

        @Override
        public boolean equals(Object o) {
            // 判断是否是同一个对象比较,如果是返回true
            if (this == o) return true;
            // 如果为空返回false
            // 如果比较类型和传进来的类型(被比较类型)不同返回false
            if (o == null || getClass() != o.getClass()) return false;
            // 此时说明o一定是学生类型且不为null
            Student student = (Student) o;
            return sex == student.sex && age == student.age && Objects.equals(name, student.name);
        }
    

    Object的equals更安全

Objects

Objects常见方法

方法名 说明
public static boolean equals(Object a, Object b) 比较两个对象的,底层会先进行非空判断,从而 可以避免空指针异常,再进行equals比较
public static boolean isNull(Object obj) 判断变量是否为null,为null返回true,反之,返回false

Objects概述及equals方法

  • Object类与Object还是继承关系,Objects类是从JDK1.7开始之后才有

  • 回顾之前的自动生成的equals和自己写的equals,发现官方使用的是Objects的

    即官方在进行字符串比较时,没有对象自己的equals方法,而是选择了Objects的equals方法来比较两个对象

  • Objects的equals方法比较的结果是一样的,但是更安全(做了非空校验)

  • 测试代码

    package com.java.apitest;
    
    import java.util.Objects;
    
    public class Test3 {
        public static void main(String[] args) {
            /*
            String s1 = "张三";
            String s2 = new String("张三");
            System.out.println(s1.equals(s2)); // true
             */
            String s1 = null;
            String s2 = new String("张三");
            //System.out.println(s1.equals(s2));        
            // 空指针异常, Cannot invoke "String.equals(Object)" because "s1" is null
    
            System.out.println(Objects.equals(s1, s2)); // false
    /*Objects中equals的源码:
            public static boolean equals(Object a, Object b) {
                return (a == b) || (a != null && a.equals(b));
            }
             */
        }
    }
    
    

    用法:sout(Objects.equals(A,B))

Objects的isNull方法

        System.out.println(Objects.isNull(s1));
        System.out.println(Objects.isNull(s2));

//等价于
//sout(s1 == null);
//sout(s2 == null);

小结:当我们进行对象信息内容的比较时,建议使用objects的equals方法,它更加安全

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,122评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,070评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,491评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,636评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,676评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,541评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,292评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,211评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,655评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,846评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,965评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,684评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,295评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,894评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,012评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,126评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,914评论 2 355

推荐阅读更多精彩内容