Object类是面向对象(下)的一块小知识点,略微有点难以理解,不过多花点时间肯定可以掌握。
定义:Object类是所有类的父类,会默认继承Object类,即所有类的对象都可以使用Object的引用进行接收。Object类是参数的最高统一类型。
一、toString方法:【1】返回对象信息。 【2】数组转字符串。
(1):我们都知道,数组是不能直接打印,以前都是for循环打印数组内容,现在可以用toString方法打印数组的内容了,先要写一条“import java.util.Arrays;”语句,不然编译器会报错。然后给出数组,再打印toString方法就可以了。本质上说:toString方法能实现数组转字符串的功能。
(2)输出结果:
(3):获取对象信息:
创建了一个User类,定义了两个变量name和age,并给出了一个有参构造方法,通过this关键字引用,并给出一个toString方法,用于返回对象信息。
(4):在Main类和main方法中,通过new关键字实例化创建了一个user对象并赋值,之后直接打印user。当直接打印一个对象时,实际上会调用这个对象的toString方法,十分重要!!!
(5):输出结果:
二、equals方法:判断两个对象在逻辑上是否相等。
【1】:如果==左右两侧是基本类型变量,比较的是变量中的值是否相同。
(基本数据类型:int、short、long、byte、float、double、char、boolean,无String类!!!)
【2】:如果==左右两侧是应用类型变量,比较的是引用变量的地址是否相同。
【3】:如果要比较对象中内容,必须重写Object中的equals方法,因为equals方法默认也是按照地址来的。
(1):定义了一个Person类,然后定义了两个变量name和age,然后给出了一个有参构造方法,通过this关键字引用。
(2):之后给出了一个equals方法,返回值类型为boolean,传入的参数类型为Object。
先if语句检查传入的参数o是否为null,如果是null就返回false。
再检查传入的对象和当前对象是否是同一个对象引用,如果不是,返回false。
最后检查传入的对象是否是Person类的实例。
接着向下转型,将对象o强制转换为Person类型,并赋值给新的变量person。最后比较名字(通过String类的equals名字)和年龄(直接使用等号比较基本数据类型)。
(3):最后的测试类Test5,通过new关键字实例化了两个Person类对象p1和p2,并分别赋值。之后给出了两个整形变量a和b,并分别赋值为10和20。
【1】:a不等于b,所以打印false。
【2】:这里的==比较的是两个引用指向的是否是同一个对象,所以打印false。
【3】:equlas方法由于p1和p2的name和age属性都不一样,所以打印false。
【4】:这里的==比较的是两个引用指向的是否是同一个对象,所以打印false。
【5】:equals方法由于p1和p3的name和age属性都一样,所以打印true。
【6】:定义了一个function方法,这个方法可以接受任何类型的对象作为参数,然后打印出这个对象。
(4):输出结果:
三、compareTo方法:用于定义对象之间的自然排序规则。
(1):定义了一个学生类,实现接口Comparable,进而实现compareTo方法。定义了两个变量name和score,给出了一个有参构造方法,并给出了一个toString方法。
(2):定义了一个compareTo方法,返回值类型为int,参数类型为Object,通过向下转型将对象o强制转换为Student型,并赋值给新的变量s。
然后if判断当前对象应排在参数对象之前,返回-1。
如果当前对象应排在参数对象之后,返回1。
如果当前对象和参数对象排名不分先后,返回0。
(3):在main方法中给出一个学生对象数组,元素进行排序(按分数降序),并给四个对象分别赋值。之后用sort方法排序,在sort方法中会自动调用compareTo方法,compareTo方法的参数类型为Object。然后调用toString方法,把数组转换为字符串,最终打印。这里的姓名无法进行排序,只能按成绩进行排序。
切记:不能只用sort方法,因为name属于String类,String类不属于基本数据类型,sort无法识别。而要先调用compareTo方法,把不是基本数据类型的按照基本数据类型的大小进行排序。
(4):输出结果:
最终按照成绩从高到低进行排序。
四、hashCode方法:用来确定对象在内存中存储位置是否相同。
(1):hashCode要用到数据结构的相关知识,后续会有详细讲解,这里作简单阐述。
定义了一个Person类,定义了name和age变量,给出了一个有参构造方法。然后定义了一个hashCode方法,返回值类型为int,这里要导入语句 import java.util.Objects;并返回一个基于name和age参数生成的哈希码。
(2):main方法中,通过new关键字实例化三个Person类对象p1、p2、p3,其中p1的赋值信息和p3的是一样的。然后打印三者的hash值。
(3)输出结果:
从中可以看出,p1和p3在内存中存储位置相同,所以哈希值一样。