美文网首页
Object类及其常用方法简介

Object类及其常用方法简介

作者: 初心myp | 来源:发表于2019-07-25 15:02 被阅读0次

    Object类是一个特殊的类,是所有类的父类,如果一个类没有用extends明确指出继承于某个类,那么它默认继承Object类。这里主要总结Object类中的三个常用方法:toString()、equals()、hashCode()。

    1.取得对象信息的方法:toString()

    该方法在打印对象时被调用,将对象信息变为字符串返回,默认输出对象地址。

    class Student
    {
        String name = "Mary";
        int age = 21;
    }
    
    public class Text{
        public static void main(String[] args)
        {
            Student s = new Student();
            System.out.println("姓名:"+s.name+",年龄:"+s.age);//输出对象属性
            System.out.println(s);//直接输出对象信息
            System.out.println(s.toString());//调用父类方法输出对象信息
        }
    }
    

    输出结果:

    姓名:Mary,年龄:21

    ClassNotes.Student@15db9742

    ClassNotes.Student@15db9742

    上述结果看出编译器默认调用toString()方法输出对象,但输出的是对象的地址,我们并不能看懂它的意思。那么就要通过重写Object类的toString()方法来输出对象属性信息。

    2.对象相等判断方法:equals()

    该方法用于比较对象是否相等,而且此方法必须被重写。

    class Student
    {
        String name;
        int age;
        public Student(String name,int age)
        {
            this.name=name;
            this.age=age;
        }
    }
    
    public class Text{
        public static void main(String[] args)
        {
            Student s1 = new Student("Mary",21);
            Student s2 = new Student("Mary",21);
            System.out.println(s1.equals(s2));//输出一个boolean值
            System.out.println(s1.equals(s2)?"s1和s2是同一个人":"s1和s2不是同一个人");//?:条件运算符
        }
    }
    

    输出结果:s1和s2不是同一个人。

    很明显输出的结果是错误的,因为equals()方法比较的是两个对象的地址,所以必须重写方法才能到达目的。

    //第一种方法:重写父类(Object类)中的equals方法
        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            StudentTest that = (StudentTest) o;
            return Objects.equals(name, that.name) &&
                    Objects.equals(sex, that.sex);
        }
    
    //第二种方法:重写父类(Object类)中的equals方法
    public boolean equals(Object o) {
        boolean temp = true;
        Student s1 = this;
        if(o instanceof Object) {
            Student s2 = (Student)o;
            if(!(s1.name.equals(s2.name)&&s1.age==s2.age)) {
                temp = false;
            }
        }
        else {
            temp = false;
        }
        return temp;//返回一个布尔值
    }
    

    3.对象签名:hashCode()

    该方法用来返回其所在对象的物理地址(哈希码值),常会和equals方法同时重写,确保相等的两个对象拥有相等的.hashCode。

    class Student
    {
        String name;
        int age;
        //重写父类(Object类)中的equals方法
        public boolean equals()
        {
            boolean temp;
            Student s1 = new Student();
            s1.name="张三";s1.age=12;
            Student s2 = new Student();
            s2.name="张三";s2.age=12;
            System.out.println("s1的哈希码:"+s1.hashCode());
            System.out.println("s2的哈希码:"+s2.hashCode());
            if((s1.name.equals(s2.name))&&(s1.age==s2.age))
            {
                temp = true;
            }
            else
            {
                temp = false;
            }
            return temp;
        }
        //重写hashCode()方法
        public int hashCode()
        {
            return age*(name.hashCode());
        }
    }
    
    public class Text{
        public static void main(String[] args)
        {
            Student s3 = new Student();
            System.out.println(s3.equals()?"s1和s2是同一人":"s1和s2不是同一人");
        }
    }
    

    输出结果:
    s1的哈希码:9298668
    s2的哈希码:9298668
    s1和s2是同一人

    说到重写equals()方法,就会想到==和equals()的区别。
    ==是比较两个对象使用的内存地址和内容是否相同,如果两个对象使用的是同一个内存地址,并且内容相同,则结果为true,否则结果为false。(比较的是引用地址)
    equals()方法比较两个对象时,则是比较两个对象的内容是否相同,而与对象的内存地址无关,如果两个对象的内容相同,则结果为true,否则结果为false。

    我自己写的例子:

    demo如下:

    import java.util.Objects;
    
    /**
     * @FileName: StudentTest
     * @Description:
     * @author: <a href="mailto: ***@163.com">myp</a>
     * @create: 2019-07-25 11:53
     */
    public class StudentTest {
    
        private String name ;
    
        private String sex;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getSex() {
            return sex;
        }
    
        public void setSex(String sex) {
            this.sex = sex;
        }
    
        public StudentTest(String name, String sex) {
            this.name = name;
            this.sex = sex;
        }
    
        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            StudentTest that = (StudentTest) o;
            return Objects.equals(name, that.name) &&
                    Objects.equals(sex, that.sex);
        }
    
        @Override
        public int hashCode() {
    
            return Objects.hash(name, sex);
        }
    }
    
    public static void main(String[] args) {
            StudentTest s1 = new StudentTest("Mary","女");
            StudentTest s2 = new StudentTest("Mary","女");
            System.out.println(s1.toString());
            System.out.println(s2.toString());
            System.out.println(s1.equals(s2));
            System.out.println(s1 == s2);
            System.out.println(s1.hashCode());
            System.out.println(s2.hashCode());
    
            StudentTest s3 = s2;
            System.out.println(s3 == s2);
        }
    

    输出结果如下:
    com.xiaojukeji.fund.ecm.controller.StudentTest@46b4199
    com.xiaojukeji.fund.ecm.controller.StudentTest@46b4199
    true
    false
    74138009
    74138009
    true

    注意:如果new两个对象,里面的值都是相同的,那么无论用==比较还是equals()方法比较返回的都是false;
    如果重写父类的equals()方法,那么用equals()方法比较返回的就是true,==返回的就是false;
    同时如果重写hashCode()方法,返回的hashCode值就是相同的,如果不重写hashCode()方法,返回的hashCode值就是不相同的

    相关文章

      网友评论

          本文标题:Object类及其常用方法简介

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