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()比较两个对象的类型+所有属性与属性值
* */
@Override
public boolean equals(Object o) {
//前提:this代表的是调用本方法对象s1 o代表的是传入的对象s2
//1.比较的是两个对象的地址值,如果==为true,证明直接就是同一个对象
//后续就不用比较了,直接返回true
if (this == o) return true;
//2.1如果传入的对象是null,说明实际上并没有对象,还是引用类型的默认值
//2.2如果两个对象获取类型不一致,比如一个是Cat类型,一个是Car类型
//以上两种情况只要满足任意一种,不符合条件,直接返回false
if (o == null || getClass() != o.getClass()) return false;
//3.传入对象的类型是Object,父类无法使用子类的特有属性,所以需要强转
/*多态:向上造型:把子类型看作是父类型,花木兰替父从军 Animal a = new Cat();
向下造型:之前转成父类型的子类对象,又想使用子类自己的特有功能了,可以向下转型
写法:Cat c = (Cat) a; 比如花木兰打仗完了想用自己的特有功能:化妆*/
//向下造型:把父类型Object转回子类型Student
Student 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@4617c264
System.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;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
hashCode()
本方法用于返回对应对象的哈希码值
小贴士:哈希码值的得出是通过一种算法,意在让不同的对象具有不同的哈希码值,用于区分不同的对象.但是有时候也存在不同对象哈希码值相同的特殊情况,我们称之为”哈希碰撞”现象