美文网首页js css html收藏
23.面向对象进阶:常用API——Object(toString

23.面向对象进阶:常用API——Object(toString

作者: 每天起床都想摆 | 来源:发表于2022-01-30 18:24 被阅读0次

常用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方法,它更加安全

相关文章

网友评论

    本文标题:23.面向对象进阶:常用API——Object(toString

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