1. Object类
1.1 object类概述
面向对象语言中都会有一个类是作为所有类的基类, 万物之根本! Object是Java中所有类的基类, 根类. Object类是任何一个类的直接父类或者间接父类
Object提供了一些可以让任何一个Java中类型使用的方法
toString方法
equals方法
hashCode方法
还存在一些和线程相关的方法
wait();
notify();
notifyAll();
sleep();
Object作为一种数据类型, 如果按照Java数据类型规范
一个方法需要的参数是Object类型, 那么该方法可以传入任何类型
一个方法需要的返回值类型是Object类型, 那么该方法的返回值可以是任意类型
【Object定义的数组, 可以保存任何Java类型】
【万物皆可Object】
1.2 toString方法[鸡肋]
格式:
public String toString();
作用:
返回一个字符串, 简要描述当前类对象信息
【Object类内原生方法】
Student stu = new Student();
sout ==> stu
com.qfedu.entity.Student@15db9742
这里就是Object类内toString方法原生效果
【返回的是当前对象对应的完整包名, 类名@当前对象在内存空间首地址(十六进制)】
当涉及到类对象需要进行信息简要描述时, toString方法会默认自行调用
比如:
sout -- 信息保存
【Object原生方法效果问题】
1. 展示信息较少
2. 无法直观的看到类对象中保存的数据
在存在需求的情况下, 可以重写toString方法来满足当前类对象简要描述需求. 通常情况下, 这里不需要手写.
使用快捷键直接完成
Alt + Shift + S
package com.qfedu.a_Object;
class Dog {
private String name;
private int age;
public Dog() {}
public Dog(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Dog [name=" + name + ", age=" + age + "]";
}
}
public class Demo1 {
public static void main(String[] args) {
Dog dog = new Dog("王可可", 5);
System.out.println(dog);
}
}
1.3 equals方法【重点】
1.3.1 equals方法原生概述
格式:
public boolean equals(Object obj);
作用:
比较两个类对象是否一致, 是否是同一个对象, 如果是返回true, 如果不是返回false
在Object类内的原始操作:
比较两个对象的空间首地址
public boolean equals(Object ojb) {
return (this == obj);
}
this表示调用当前方法的类对象, 实际就是一个空间首地址
obj是传入的参数, 也是一个引用数据类型, 同时也是保存一个空间首地址
【两个对象空间首地址一致, 表示同一个对象】
1.3.2 equals方法为什么需要重写
package com.qfedu.a_Object;
public class Demo2 {
public static void main(String[] args) {
Person person1 = new Person(1, "马尔扎哈", 1000);
Person person2 = new Person(2, "迪丽热巴", 28);
Person person3 = new Person(3, "古力娜扎", 30);
Person person4 = new Person(4, "哈利波特", 30);
Person person5 = new Person(5, "罗纳尔多", 50);
Person person6 = new Person(6, "努尔哈赤", 1500);
Person person7 = new Person(6, "努尔哈赤", 1500);
System.out.println(person1);
System.out.println(person2);
System.out.println(person3);
System.out.println(person4);
System.out.println(person5);
System.out.println(person6);
System.out.println(person6.equals(person7));
}
}
1.3.3 方法如何重写
思路
1. 判断比较的两个对象是不是同一个对象
保留原本的this == obj, 满足条件直接判断为true
2. 数据类型要求一致
Animal ani1 = new Cat();
Animal ani2 = new Dog();
sout ==> ani1.equal(ani2) false
数据类型必须是一直的情况下才可以进行比较, 如果equals方法传入的参数的数据类 型不是当前调用方法的类对象对应数据类型, 没有必要进行比较
3. 判断【自定义比较】内容
in name age完全一致, 为同一个对象
【注意】
equals方法实际上是可以通过IDE开发工具直接完成的, 完成的思路过程和以上方法内容一致, 这里需要大家首先来自定义完成方法, 后期使用工具来完成
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (!(obj instanceof Person)) {
return false;
}
Person p = (Person) obj;
return this.id == p.id
&& this.age == p.age
&& this.name.equals(p.name);
}
1.3.4 equals方法答疑
1. 明确equals方法的调用对象是谁, 后期代码中会存在大量同名方法, 但是调用对象不一致, 效果不一样
2. 基本数据类型不能使用equals方法
3. 这里存在多态的使用
a. equals方法所需参数是Object类型, 不管什么类型数据传入到方法中, 都会自动转换为Object类型
b. 方法内instanceOf判断是判定当前传入的对象真实情况是不是当前Person类型
c. 强制类型转换是在明确数据类型一致的情况下完成的, 是用于方便操作成员变量
4. this
this表示调用当前方法的类对象, equals方法调用方式
类对象.equals(另一个类对象)
this表示类对象
1.4 hashCode方法【重点】
1.4.1 hashCode方法原生概述
hash ==> 哈希
hashCode ==> 哈希值
哈希值是对象在开发中的唯一标识
哈希值一般用于一定的哈希结构存储中
Java中hashCode方法是定义在Object类内, 也就是说在Java中任何一个对象都有hashCode方法, 可以获取当前对象的哈希值
Object类内默认的哈希值是当前对象的空间首地址 十进制展示方式
package com.qfedu.a_Object;
public class Demo3 {
public static void main(String[] args) {
Cat cat = new Cat();
System.out.println(cat);
System.out.println(cat.hashCode());
}
}
1.4.2 Java开发语法规定
Java中规定:
如果Java中的两个对象使用equals方法比较结果为true, 表示相同的对象, 那么要求当前比较的两个对象对应的hashCode是一致的
有且只重写equals方法的情况下, hashCode方法返回的数据依然是对象对应的空间首地址十进制展示方式, 如果两个对象按照自定义equals方法比较结果为true, 存在可能性两个对象hashCode值不一致, 这样会导致后期使用的数据结果中, 出现一些违背原则的问题
hashCode方法返回的哈希值, 也是当前对象在一定结构内的唯一索引!
【代码开发强制规定】
如果按照自己的比较方式重写了equals方法, 必须重写hashCode方法来满足要求.
1.4.3 如何重写hashCode方法
格式:
public int hashCode();
返回值为int类型
一般要求:
1. 会选择带有一定独立性数据, 不可重复性数据作为hashCode返回数据的首要选择
2. hashCode值在开发中或多或少都有可能出现冲突重复问题, 这里尽量避免
【原则】
equals方法比较结果为true, hashCode方法返回哈希值一致
@Override
public int hashCode() {
return id;
}
1.4.4 属性不存在对应的int类型数据如何解决【小拓展】
情况解释:
实体类不存在任何一个int类型数据, 不存在唯一性数据.
需要通过成员变量来完成组合操作获取hashCode值
推荐方法:
Objects工具类提供的hash方法
public static int hash(Object... values) {
return Arrays.hashCode(values)
}
Object...
Object当前方法所需数据类型为Object, 也就是说支持任何数据类型
... 表示这里参数个数不做任何限制, 任意长度, 可以没有参数, 可以是多个参数
... 不定长参数
指定的数据转换计算之后得到一个具有唯一性的哈希值
@Override
public int hashCode() {
return Objects.hash(name, color);
}
2. 异常处理
2.1 生活中的异常
什么是生活中的异常?
感冒了
去医院看病:
医生问你: 你怎么了?
我: 我难受
医生问你: 哪里难受
我: 我浑身难受
医生问你: 具体哪里难受, 有什么症状
我: 头疼, 困, 冷, 不舒服
医生问你: 怎么回事
我: 昨天晚上吃了十斤雪糕 二十斤冰啤 十五斤小龙虾
医生: ...
这里存在一个前因后果
2.2 Java中的异常规则
Java中异常和错误的提示机制也是前因后果
都是存在一个最基本的原则, 从哪里到哪里
Java中的异常, 错误提示已经非常优秀!
2.3 Throwable类
Throwable是Java中所有异常和错误的基类
--| Error 错误
--| Exception 异常
构造方法:
Throwable();
创建一个Throwable类对象, 其中保存的异常或者错误信息为null
Throwable(String message);
创建一个Throwable类对象, 其中保存的异常或者错误信息为message
成员方法:
String toString();
得到当前异常的简要信息描述
String getMessage();
获取当前Throwable当前类对象中保存的异常或者错误信息
void printStackTrace();【伪重点】
在命令行中展示错误的前因后果! 红色字体
2.4 Error 和Exception
Error 错误
无法处理, 只能避免!
Exception 异常
可以处理, 还有挽回的余地
异常都是Exception结尾
Java代码中有一个数组需要申请64GB内存(目前电脑内存32GB)
不可能! 错误 Error
Java中代码需要一个数组, 但是比给予操作的数组不合法
可以处理,Exception