Object类的概述

本文介绍了Java中Object类的基础知识,包括它是所有类的父类,以及默认的toString()和equals()方法。讨论了如何重写这两个方法以满足自定义需求,如自定义对象的字符串表示和进行内容比较。此外,还讲解了JDK7提供的Objects工具类,它优化了equals方法,避免空指针异常。最后,展示了如何使用Objects.equals进行安全的对象内容比较。
摘要由CSDN通过智能技术生成

1.Object类:

        java.lang.Object类是Java语言中的根,即所有类的父类
        如果一个类没有指定继承或者没有指定父类,那么默认则继承自Object类

2.toString方法

        public String toString():返回该对象的字符串表示
特点:
          1.toString方法返回的字符串内容格式:类的全路径@十六进制数的地址值
          2.直接打印对象名,其实就是打印对象调用toString方法返回的字符串内容
问题:
          如果打印对象的时候,不希望打印的时地址值这种形式的字符串,那么应该怎么做?
解决:
          重写toString方法--->可以自定义返回的字符串内容格式,也可以使用快捷键生成默认的格式(alt+insert)

public class Person {
    String name;
    int age;

    public Person(String name,int age){
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
class Tests {
    public static void main(String[] args) {


    Person person = new Person("张三",18);
    System.out.println(person);
    System.out.println(person.toString());
    }

}

3.equals方法:

        public boolean equals(Object ob):指示其他某个对象是否与此对象“相等”
源码:
        public boolean equals(Object obj) {
                return (this == obj);
        }
特点:
        1.Object类的equals方法默认比较的时两个对象的地址值是否相等(==)
        2.由于Java中所有类都是继承Object类,所以如果类中没有重写equals方法,默认就是地址值比较
        3.如果希望进行对象的内容比较,即所有或指定的部分成员变量相同就判定两个对象相同,则可以重写equals方法

import java.util.Objects;

public class Person {
    String name;
    int age;

    public Person(String name, int age){
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
    //快捷键重写的equals方法

    @Override
    public boolean equals(Object o) {
        // 如果两个对象的地址值相同,就直接返回true,结束方法
        if (this == o) return true;
        // 如果传入的对象为null,就直接返回false,结束方法
        // 如果两个对象的类型不一致,就直接返回false,结束方法
        if (o == null || getClass() != o.getClass()) return false;
        // 来到这里,说明两个对象地址值不同,并且一定是Person类型
        Person person = (Person) o; // 多态,向下转型
        return age == person.age &&
                Objects.equals(name, person.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}

public class Tests {
    public static void main(String[] args) {

        Person p1 = new Person("张三",29);
        Person p2 = new Person("张三",29);
        // 在开发中,往往认为p1和p2是两个相同的对象因为属性值相同

        System.out.println(p1==p2);
        System.out.println(p1.equals(p2));


    }
}

4.JDK7提供的一个Objects工具类

        提供了一些方法来操作对象,由一些静态的实用方法组成
        在比较两个对象的时候,Object的equals方法容易抛出空指针异常,而Objects类中的equals方法就优化了这个问题


源码:
          public static boolean equals(Object a, Object b) {
              return (a == b) || (a != null && a.equals(b));
          }
扩展知识点:
          public class Object {
          private static native void registerNatives();
          static {
              registerNatives();
          }
上述代码是Object类的源码,这个没有方法体的方法是native方法,native修饰的方法成为【本地方法】
        这种方法是没有方法体的,我们查看不了它的实现,所以我们不需要关系方法如何实现
什么时候会使用?
          - 当需要访问C或者C++的代码时,或者访问操作系统的底层类库时,可以使用本地方法实现,也意味着Java可以和其他编程语言进行交互
          - 本地方法的作用:就是当Java调用非Java代码的接口时,可以使用本地方法,方法的实现由非java语言实现

String name1 = null;
String name2 = new String("张三");
String name3 = "null";
System.out.println(name1);
System.out.println(name2);
// 比较name1和name2字符串内容是否相同
//System.out.println(name1.equals(name2));
System.out.println(Objects.equals(name1,name3));

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值