二十四、常用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;
    }
}
相关推荐
w_312345410 分钟前
自定义一个maven骨架 | 最佳实践
java·maven·intellij-idea
岁岁岁平安13 分钟前
spring学习(spring-DI(字符串或对象引用注入、集合注入)(XML配置))
java·学习·spring·依赖注入·集合注入·基本数据类型注入·引用数据类型注入
武昌库里写JAVA16 分钟前
Java成长之路(一)--SpringBoot基础学习--SpringBoot代码测试
java·开发语言·spring boot·学习·课程设计
Q_192849990623 分钟前
基于Spring Boot的九州美食城商户一体化系统
java·spring boot·后端
张国荣家的弟弟40 分钟前
【Yonghong 企业日常问题 06】上传的文件不在白名单,修改allow.jar.digest属性添加允许上传的文件SH256值?
java·jar·bi
ZSYP-S1 小时前
Day 15:Spring 框架基础
java·开发语言·数据结构·后端·spring
yuanbenshidiaos1 小时前
C++----------函数的调用机制
java·c++·算法
是小崔啊1 小时前
开源轮子 - EasyExcel01(核心api)
java·开发语言·开源·excel·阿里巴巴
黄公子学安全1 小时前
Java的基础概念(一)
java·开发语言·python
liwulin05061 小时前
【JAVA】Tesseract-OCR截图屏幕指定区域识别0.4.2
java·开发语言·ocr