Day20 Object类和异常处理

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);
		
		/*
		 * equals默认比较方式是空间首地址比较, 这里person6和person7两个对象都是通过new + 构造方法创建而来
		 * 空间首地址完全不一样!
		 * 
		 * 但是从代码中可以发现, 这里两个对象保存的内容是一致的, 对于这样的一种情况, 其实在开发中还是存在一定的需求
		 * 实际开发中存在需要比较两个对象中保存数据是否一致的情况, 这里需要重写equals方法
		 * 
		 * equals方法在使用过程中一定要明确调用者是谁
		 */
		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) {
		// 比较两个对象的空间首地址, 如果两个对象的空间首地址一致, 直接返回true
		if (this == obj)
			return true;
		
		/*
		 * 数据类型要求一致
		 * 需要判断传入的参数类型是否是Person类型, 如果不是直接返回false
		 *
		 * 使用一个关键字
		 * 		instanceOf
		 * 类对象 instanceOf 类型
		 * 判断类对象时候不是当前指定类型
		 */
		if (!(obj instanceof Person)) { // obj instanceof Person == false
			// 数据类型不一致, 直接返回false
			return false;
		}
		
		/*
		 * 按照自定义方法
		 * 比较对象中保存的数据内容
		 * 
		 * 我们认为
		 * 		Person类型中我们认为id name age一致才是两个相同的对象
		 */
		// 完成强制转换操作,Object类型转换成当前使用的Person类型操作
		Person p = (Person) obj;
		
		return this.id == p.id
				&& this.age == p.age
				/*
				 * this.name.equals这里执行的是String类equals方法
				 * 这里在调用方法时需要明确方法的调用者是谁
				 */
				&& 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);
		// com.qfedu.a_Object.Cat@15db9742
		
		System.out.println(cat.hashCode());
		// 366712642

	}
}
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() {
		/*
		 * id为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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值