2 什么是API
API(Application Programming Interface,应用程序接口)是一些预先定义的函数。目的是提供应用程序与开发人员基于某软件可以访问的一些功能集,但又无需访问源码或理解内部工作机制的细节.
API是一种通用功能集,有时公司会将API作为其公共开放系统,也就是公司制定自己的系统接口标准,当需要进行系统整合,自定义和程序应用等操作时,公司所有成员都可以通过该接口标准调用源代码.
Java api(Java词典)
api网址:https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Object.html
8. Object 类的使用
3.1概念
Object类是所有Java类的祖先,也就是说我们所说的”顶级父类”
它存在于java.lang.Object,这个包不需要我们手动导包
需要注意的是:每个类都使用Object作为超类.所有对象(包括数组)都实现这个类的方法.
在不明确给出超类的情况下,Java会自动把Object类作为要定义类的超类.
注意:默认所有的类的父类都是object类
8.2 Object 类的方法
根据 JDK 源代码及 Object 类的 API 文档,Object 类当中包含的方法有 11 个。
这里我们这一节课主要关注其中的 4个:
重点:equals、tostring
了解:clone、finalize
1、(重点)equals()
= =: 基本类型比较值:只要两个变量的值相等,即为 true。
引用类型比较引用(是否指向同一个对象):只有指向同一个对象时,= =才返回 true。
用“= =”进行比较时,符号两边的数据类型必须兼容(可自动转换的基本数据类型除外),否则编译出错
equals():所有类都继承了 Object,也就获得了 equals()方法。还可以重写。
只能比较引用类型,Object 类源码中 equals()的作用与“==”相同:比较是否指向同一个对象
格式:obj1.equals(obj2)
注意⚠️:当用 equals()方法进行比较时,对类 File、String、Date 及包装类来说,是比较类型及内容而不考虑引用的是否是同一个对象
,因为底层重写了equals方法,说白了就是说不是使用的object的equals方法;
equals方法的代码案例
package com.tedu;public class Test1 {public static void main(String[] args) {User user=new User("name",33);User u1=new User("name",33);
/*
查看底层源码的快捷键:Windows:鼠标放上去 + ctrl
* 查看底层的equals方法的源码:其实equals的作用和==是一样的
*在这里equals判断的是这两个对的地址值是否相同
* 我们在这里没有继承object类,但是我们可以使用equals方法
* 说明类底层默认继承object类,在这里equals方法比较的是是否为同一个对象
* */System.out.println(u1.equals(user));String s1=new String("yes");String s2=new String("yes");System.out.println(s1.equals(s2));}}class User{String name;int age;public User(){}public User(String name, int age) {this.name = name;this.age = age;}}
自定义类的重写equals方法
//9.添加重写的equals与hashCode()/*equals()与hashCode()逻辑要保持一致,要重写都重写,要不重写,都不重写* Object默认实现:hashCode()的哈希码值根据地址值生成* equals()底层使用==比较两个对象的地址值* Student类重写后:hashCode()的哈希码值根据重写后传入的对象的属性生成* equals()比较两个对象的类型+所有属性与属性值* */@Overridepublic boolean equals(Object o) {//前提:this代表的是调用本方法对象s1 o代表的是传入的对象s2//1.比较的是两个对象的地址值,如果==为true,证明直接就是同一个对象//后续就不用比较了,直接返回trueif (this == o) return true;//2.1如果传入的对象是null,说明实际上并没有对象,还是引用类型的默认值//2.2如果两个对象获取类型不一致,比如一个是Cat类型,一个是Car类型//以上两种情况只要满足任意一种,不符合条件,直接返回falseif (o == null || getClass() != o.getClass()) return false;//3.传入对象的类型是Object,父类无法使用子类的特有属性,所以需要强转/*多态:向上造型:把子类型看作是父类型,花木兰替父从军 Animal a = new Cat();向下造型:之前转成父类型的子类对象,又想使用子类自己的特有功能了,可以向下转型写法:Cat c = (Cat) a; 比如花木兰打仗完了想用自己的特有功能:化妆*///向下造型:把父类型Object转回子类型StudentStudent student = (Student) o;//4.比较的是两个对象的属性与属性值//如果是基本类型,直接比较值,所以用==比较//如果是引用类型,比如String,还需要使用bjects.equals()做比较return age == student.age && Objects.equals(name, student.name);}
重写 equals()方法的原则
– 对称性:如果 x.equals(y)返回是“true”,那么 y.equals(x)也应该返回是“true”。
– 自反性:x.equals(x)必须返回是“true”。
– 传递性:如果 x.equals(y)返回是“true”,而且 y.equals(z)返回是“true”,那么z.equals(x)也应该返回是“true”。
– 任何情况下,x.equals(null),永远返回是“false”;x.equals(和 x 不同类型的对象)永远返回是“false”。
面试题:==和 equals 的区别
==可以使用基本数据类型还可以使用在引用数据类型
如果使用在是基本数据类型比较的是基本数据类型和内容是否相同
如果使用在引用数据类型则比较的是地址值是否相同
equals方法只能使用在引用数据类型上
还有一种是自定义类的重写equals方法,主要比较两个对象的属性值是否相等
tostring方法
toString()
本方法用于返回对应对象的字符串表示
如果我们不想打印对象的地址值,而是打印对象的内容就需要重写tostring方法在这里插入代码片
tostring 方法我们手动写
package com.tedu;import java.util.Date;public class Test1 {public static void main(String[] args) {User user=new User("name",33);User u1=new User("name",33);/** com.tedu.User@4617c264下面这两个打印语句结果相同* 都是打印的是对象的地址值* */System.out.println(u1.toString());//com.tedu.User@4617c264System.out.println(u1);String s=new String("这是strig方法");System.out.println(s.toString());Date date=new Date();System.out.println(date.toString());}}class User{String name;int age;public User(){}public User(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", age=" + age +'}';}}
hashCode()
本方法用于返回对应对象的哈希码值
小贴士:哈希码值的得出是通过一种算法,意在让不同的对象具有不同的哈希码值,用于区分不同的对象.但是有时候也存在不同对象哈希码值相同的特殊情况,我们称之为”哈希碰撞”现象