4.1.1 Object
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
1.概念
Object类是所有Java类的祖先,也就是说我们所说的”顶级父类”
它存在于java.lang.Object,这个包不需要我们手动导包
需要注意的是:每个类都使用Object作为超类.所有对象(包括数组)都实现这个类的方法.
在不明确给出超类的情况下,Java会自动把Object类作为要定义类的超类.
Object 类可以显示继承也可以隐式继承
显示继承
public class Runoob extends Object{
}
隐式继承
package partThree;
/* 本类用于顶级父类Object的入门案例*/
public class TestObject {
public static void main(String[] args) {
//4.创建学生类的对象进行测试
Student s = new Student();
Student s1 = new Student("海绵宝宝",3);
Student s2 = new Student("海绵宝宝",3);
//5. 测试hashCode()
/* 本方法的作用是返回对应对象的int类型的哈希码值
* 本方法力求不同的对象返回的哈希码不同
* 这样我们就可以根据哈希码值区分不同的对象*/
System.out.println(s.hashCode());
System.out.println(s1.hashCode());
System.out.println(s2.hashCode());
//6. 测试toString()
/* 打印s对象的是println这个方法会层层调用一直到Object中的toString
* Object中toString的默认实现对象的名字@十六进制的哈希码值
* 但是子类重写了toString方法以后打印的是对象的类型+属性+属性值*/
System.out.println(s); // 虽然方法调用中没有写s.toString但是实际调用中会调用
System.out.println(s1);
}
}
//1.创建一个学生类
class Student{
//2.定义属性
String name; //姓名
int age; //年龄
//3.1 添加本类的无参构造
public Student() {
System.out.println("我是无参构造");
}
//3.2 添加本类的全参构造
public Student(String name, int age) {
this.name = name;
this.age = age;
System.out.println("我是全参构造");
}
//在student类中添加重写的toString方法
//右键--Generate--toString
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
2.hashCode()
hashCode()的作用是返回对应对象的哈希码值
本方法力求不同的对象返回的哈希码不同这样我们就可以根据哈希码值区分不同的对象
注意:哈希码值的得出是通过一种算法,意在让不同的对象具有不同的哈希码值,用于区分不同的对象.但是有时候也存在不同对象哈希码值相同的特殊情况,我们称之为”哈希碰撞”现象
3.toString()
toString()的作用是打印s对象的是println这个方法会层层调用一直到Object中的toString
Object中toString的默认实现对象的名字@十六进制的哈希码值
但是子类重写右键–Generate–toString了toString方法以后打印的是对象的类型+属性+属性值
4.equals()
equals()作用是指示其他某个对象是否与当前对象”相等”
Object中equals()的默认实现使用的是 /* ==比较 */
==比较的是左右俩边的值如果是基本类型比较的是字面值比如1和1,3.4和4.3
如果是引用类型比较的是引用类型保持的地址值输出的是布尔值类型
5.查找object的方法
本地的API手册文件已放到如下目录下大家可以自行到gitee下载
通过IDEA查找API手册
---- 查API手册
---- 连点俩下Shift打开IDEA手册的搜索查找object
---- 按住Ctrl点hashCode()
---- 在拓展库Ecternal Libraries 找到jdk1.8—rt.jar—java.Lang.Object
6.练习Object类
package partThree;
import java.util.Objects;
/* 本类用于顶级父类Object的入门案例*/
public class TestObject {
public static void main(String[] args) {
//4.创建学生类的对象进行测试
Student s = new Student();
Student s1 = new Student("海绵宝宝",3);
Student s2 = new Student("海绵宝宝",3);
//5. 测试hashCode()
/* 本方法的作用是返回对应对象的int类型的哈希码值
* 本方法力求不同的对象返回的哈希码不同
* 这样我们就可以根据哈希码值区分不同的对象*/
System.out.println(s.hashCode());
System.out.println(s1.hashCode());
System.out.println(s2.hashCode());
//6. 测试toString()
/* 打印s对象的是println这个方法会层层调用一直到Object中的toString
* Object中toString的默认实现对象的名字@十六进制的哈希码值
* 但是子类重写了toString方法以后打印的是对象的类型+属性+属性值*/
System.out.println(s);
System.out.println(s1);
//8.测试equals方法
/* Object中equals()的默认实现使用的是==比较
* ==比较的是左右俩边的值如果是基本类型比较的是字面值不如1和1,3.4和4.3
* 如果是引用类型比较的是引用类型保持的地址值*/
System.out.println(s1.equals(s2));
}
}
//1.创建一个学生类
class Student{
//2.定义属性
String name; //姓名
int age; //年龄
//3.1 添加本类的无参构造
public Student() {
System.out.println("我是无参构造");
}
//3.2 添加本类的全参构造
public Student(String name, int age) {
this.name = name;
this.age = age;
System.out.println("我是全参构造");
}
//7. 在student类中添加重写的toString方法
//右键--Generate--toString
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
//9. 添加重写的equals与hashCode
/* equals方法与hashCode方法逻辑保持一致要重写都重写要不重写都不重写
* 如果不重写hashCode()的哈希码根据地址值生成
* equals()底层使用==比较俩个对象的地址值
* 如果重写了hashCode()的哈希码根据重写传入的属性值生成
* equals()比较的是重写后的类型+所有属性与属性值
* 重写方法右键-----Generate--equals() and hashCode()*/
@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.比较的是俩个对象的属性与属性值
// 如果是基本类型直接比较值所以用==
// 如果是引用类型比较的是地址值所以用Objects.equals
return age == student.age && Objects.equals(name, student.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
注意equals方法与hashCode方法逻辑保持一致要重写都重写要不重写都不重写
如果不重写hashCode()的哈希码根据地址值生成
equals()底层使用比较俩个对象的地址值
如果重写了hashCode()的哈希码根据重写传入的属性值生成
equals()比较的是重写后的类型+所有属性与属性值
重写方法右键-----Generate–equals() and hashCode()