学习笔记:Object类(toString 和 equals 方法)

        Object类是一个特殊的类,是所有类、数组(数组和对象都是引用类型,都储存在对内存中)、枚举类的父类(任何Java对象都可以调用Object类的方法),一个类如果没有显式声明继承于某个类,那么他将默认继承object类。

        Object源码中,这样描述Object类:“Object是类层次结构的根。每个类都有对象作为超类。所有对象,包括数组,实现该类的方法。”

          他有一个构造方法,用来构造一个新的对象:

public Object() {}

Object类主要包含11个方法;

         ①public String toString();

public String toString() {

    return getClass().getName() + "@" + Integer.toHexString(hashCode());

}

        源码中,这样描述toString方法:“返回对象的的字符串表示。一般来说, toString方法返回一个字符串“文本表示”这个对象。结果应该成为一个简洁但信息丰富的代表,这很容易读的人。建议所有的子类都覆盖这个方法。”,该字符串内容就是对象的类型+@+内存地址值。

       在实际开发中,经常需要按照对象的属性得到相应的字符串表现形式,因此每个实体类也需要重写它,重写格式一般为显示实体类属性值,可作为测试使用。 

       在IntelliJ IDEA中,可以点击 Code 菜单中的 Generate... ,也可以使用快捷键 alt+insert ,点击 toString() 选 项。选择需要包含的成员变量并确定。

例如自定义的Person类,如下所示:

public class Person {

    private String name;

    private int age;

    @Override

    public String toString() {

        return "Person{" + "name='" + name + '\'' + ", age=" + age + '}';
    
    }

    // 省略构造器与Getter Setter

}

Ps:直接使用输出语句输出对象名的时候,其实通过该对象调用了其toString()方法

 

②public boolean equals(Object obj) ;

【如果你之前使用过了String类中的equals方法,那么先请忘记他】

public boolean equals(Object obj) {

    return (this == obj);

}

jdk源码中,这样描述equals方法:"表示其他对象是否“等于”这个",其比较的的对象的内存地址,与对象内容无关。

 

【关于 == 和 equals 的区别:https://www.cnblogs.com/dolphin0520/p/3592500.html

如需对象内容的比较,则需重写equals方法(开发中,比较地址值直接用 == 就足够了,equals 一般用来比较有意义的东西

)。

import java.util.Objects;

public class Person {

    private String name;

    private int age;

    @Override

    public String toString() {

        return "Person{" + "name='" + name + '\'' + ", age=" + age + '}';

    }

    // 省略构造器与Getter Setter

    @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 &&

        Objects.equals(name, person.name);

    }

}

【 Objects类

在刚才IDEA自动重写equals代码中,使用到了 java.util.Objects 。

在JDK7添加了一个Objects工具类,它提供了一些方法来操作对象,它由一些静态的实用方法组成,这些方法是 null-save(空指针安全的)或null-tolerant(容忍空指针的),用于计算对象的hashcode、返回对象的字符串表 示形式、比较两个对象。

在比较两个对象的时候,Object的equals方法容易抛出空指针异常,而Objects类中的equals方法就优化了这个问 题。方法如下:

public static boolean equals(Object a, Object b) :判断两个对象是否相等。

源码:

public static boolean equals(Object a, Object b) {

    return (a == b) || (a != null && a.equals(b));

}

例: 

public static void main(String[] args) {

        /*
                 public static boolean equals(Object a, Object b) {
                    return (a == b) || (a != null && a.equals(b));
                }

                || : 左边为true,右边不执行

                空指针安全
         */
        String s1 = "abc";
        String s2 = null;
        //        boolean result = s1.equals(s2); // 空指针 java.lang.NullPointerException
        boolean equals = Objects.equals(s1, s2);
        System.out.println(equals);
    }

 

  • 看下列程序,不运行写出答案,并分析原因。

        (1)

String s1 = new String("abc");

String s2 = "abc";                 

System.out.println(s1 == s2);                   

System.out.println(s1.equals(s2));                 

        (2)

String s1 = "abc";                 

String s2 = "abc";                 

System.out.println(s1 == s2);                 

System.out.println(s1.equals(s2));       

        (3)

String s1 = "a" + "b" + "c";                 

String s2 = "abc";                 

System.out.println(s1 == s2);                 

System.out.println(s1.equals(s2));      

        (4)

String s1 = "ab";                 

String s2 = "abc";                 

String s3 = s1 + "c";                 

System.out.println(s3 == s2);                 

System.out.println(s3.equals(s2));

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值