object类clone、finalize

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类

object类clone、finalize_第1张图片

object类clone、finalize_第2张图片

8.2 Object 类的方法

根据 JDK 源代码及 Object 类的 API 文档,Object 类当中包含的方法有 11 个。
这里我们这一节课主要关注其中的 4个:

重点:equals、tostring
了解:clone、finalize

1、(重点)equals()

= =: 基本类型比较值:只要两个变量的值相等,即为 true。

object类clone、finalize_第3张图片

引用类型比较引用(是否指向同一个对象):只有指向同一个对象时,= =才返回 true。

object类clone、finalize_第4张图片

用“= =”进行比较时,符号两边的数据类型必须兼容(可自动转换的基本数据类型除外),否则编译出错

equals():所有类都继承了 Object,也就获得了 equals()方法。还可以重写。
只能比较引用类型,Object 类源码中 equals()的作用与“==”相同:比较是否指向同一个对象
格式:obj1.equals(obj2)

object类clone、finalize_第5张图片

注意⚠️:当用 equals()方法进行比较时,对类 File、String、Date 及包装类来说,是比较类型及内容而不考虑引用的是否是同一个对象,因为底层重写了equals方法,说白了就是说不是使用的object的equals方法;
object类clone、finalize_第6张图片

object类clone、finalize_第7张图片

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方法

object类clone、finalize_第8张图片
object类clone、finalize_第9张图片

  //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()
本方法用于返回对应对象的字符串表示

object类clone、finalize_第10张图片

请添加图片描述
如果我们不想打印对象的地址值,而是打印对象的内容就需要重写tostring方法在这里插入代码片
tostring 方法我们手动写object类clone、finalize_第11张图片

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()
本方法用于返回对应对象的哈希码值
小贴士:哈希码值的得出是通过一种算法,意在让不同的对象具有不同的哈希码值,用于区分不同的对象.但是有时候也存在不同对象哈希码值相同的特殊情况,我们称之为”哈希碰撞”现象

你可能感兴趣的:(cy,java,android,开发语言)