二十四、常用API之Object

前面学习的Java的语法基础, 后面的几篇介绍一下Java的常用API

那么什么是API?(Application Programming Interface,应用程序编程接口
API就是一组用于构建和集成应用软件的定义和协议。

学习类的过程就是学习Java的过程:换句话说学Java就是学习类

  • 首先,了解这个类是干啥的(看介绍)JDK帮助文档由官方类的解释
  • 看构造方法
  • 看常量或者静态属性
  • 看有哪些方法,静态方法还是成员方法 (这个API能实现什么功能)
  • 调用方法 (使用其中的功能)

Object是老祖宗类,所有类都继承Object类并实现了他所有的功能和方法

Object类型的构造方法

1、Object():空参数构造方法,该构造方法内,第一行没有super(),因为Object没有父类

用途:① 创建Object类型的对象

​ ② 子类去使用,所有的子类都会直接的或者间接的访问到这个顶层父类的构造方法
在JAVA中所有的类都默认继承Object类

java 复制代码
public class Demo01 {
    public static void main(String[] args) {
        //使用空参构造创建对象
        Object o1 = new Object();
        Person p = new Person();
        p.equals(o);//可以调用Object类中的方法,因为所有的类都是Object的子类,所以可以使用Object类中的方法
        Object o2 = new Person();//父类的引用指向子类对象
        //Object类型根据多态关系,可以接收任意类型的对象
        //所有的类都直接的或者间接的继承自Object类
    }
}
class Person{
}

1.toString

toString()方法在Object类里定义的,其返回值类型为String类型,返回类名和它的引用地址

1、public String toString() 返回对象的字符串表示,默认使用Object类的toString方法打印的对象, 在 idea中我们可以右键生成to String,或者alt+insert生成to String

2、对象返回一个地址值和全类名没有什么意义,所以建议将toString方法进行重写

  • 重写的原则:返回该对象中所有成员变量的值

3、重写之后使用该方法,或者打印一个对象名,都是打印的toString方法返回的结果,重写之后,打印的结果就是一个类名和属性值的集合

java 复制代码
public class Demo02 {
    public static void main(String[] args) {
        Person p = new Person("小黑",20);
        System.out.println(p.toString());
        System.out.println(p);
       // System.out.println(p.getClass().getName() + "@" + Integer.toHexString(p.hashCode()));
        //一般自定义类中都要重写toString方法,如果不重写打印地址值没有意义
        //重写不需要自己手写,而是通过alt + insert 或者鼠标右键生成
        Person p2 = new Person("小明",222);
        System.out.println(p2);
    }
}
class Person{
    private String name;
    private int age;
//    如果不重写toString方法,默认调用的就是父类的方法功能    也就是object中的打印全类名+@+哈希值
//    @Override
//    public String toString() {
//        return "Person{" +
//                "name='" + name + '\'' +
//                ", age=" + age +
//                '}';
//    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public Person() {
    }
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

2.equals

特点:是一个方法,并非运算符只适用于引用数据类型

1、public boolean equals(Object obj) 比较两个对象是否相同

2、比较的是Object类型,比较的是地址值,地址值是否相同

3、在实际生活中,比较地址值没有意义,因此在自定义类中都需要重写该方法

4、重写的原则:比较两个对象的属性值是否相同,如果属性值相同则认为是同一个对象

5、== 和 equals区别:比较的规则不同:

① ==比较任意数据类型,可以比较基本数据类型 ,也可以比较引用数据类型 比较的是地址值

② equals只能比较引用数据类型,equals方法在重写之前,比较是两个对象的地址值,重写之后比较的是对象的属性值

java 复制代码
public class Demo03 {
    public static void main(String[] args) {
        Man m = new Man();
        System.out.println(m.hashCode());//hashCode方法 重写之前是根据地址值生成的哈希值
        Man m2 = new Man();      
        //重写之后,是根据属性值产生对应的哈希值
        //属性值相同,哈希值相同
        //属性值不同,哈希值大概率不同
        System.out.println(m2.hashCode());
        System.out.println(m == m2);
        System.out.println(m.equals(m2)); //equals方法重写之前比较的是地址值,重写之后比较的是属性值
    }
}
class Man{
    //以后在使用自定义类的时候 一般都要重写 toString 和equals方法
    private String name;
    private int age;
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Man man = (Man) o;
        return age == man.age && Objects.equals(name, man.name);
    }
    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
    @Override
    public String toString() {
        return "Man{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public Man() {
    }
    public Man(String name, int age) {
        this.name = name;
        this.age = age;
    }
}
相关推荐
杨DaB16 分钟前
【SpringBoot】Swagger 接口工具
java·spring boot·后端·restful·swagger
YA33317 分钟前
java基础(九)sql基础及索引
java·开发语言·sql
桦说编程36 分钟前
方法一定要有返回值 \ o /
java·后端·函数式编程
小李是个程序1 小时前
登录与登录校验:Web安全核心解析
java·spring·web安全·jwt·cookie
David爱编程1 小时前
Java 创建线程的4种姿势,哪种才是企业级项目的最佳实践?
java·后端
hrrrrb2 小时前
【Java Web 快速入门】十一、Spring Boot 原理
java·前端·spring boot
Java微观世界2 小时前
Object核心类深度剖析
java·后端
MrSYJ2 小时前
为什么HttpSecurity会初始化创建两次
java·后端·程序员
hinotoyk2 小时前
TimeUnit源码分享
java
AAA修煤气灶刘哥3 小时前
Java+AI 驱动的体检报告智能解析:从 PDF 提取到数据落地全指南
java·人工智能·后端