java_Day20_Object类和异常

Object类和异常

1. Object类

1.1 Object类概述
	面向对象语言中都会有一个类是作为所有类的基类,万物之根本!!!Object是Java中所有类的基类,根类。Object类是任何一个类的直接父类或者间接父类。
	Object提供了一些可以让任何一个Java中类型使用的方法
		toString方法
		equals方法
		hashCode方法
	还存在一些和线程相关的方法:
		wait();
		notify();
		notifyAll();
		
	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
		==> toString方法重写
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 obj) {
        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 equals方法如何重写
思路
	1. 判断比较的两个对象是不是同一个对象。
		保留原本的this == obj,满足条件直接判断为true
	2. 数据类型要求一致。
		数据类型必须是一致的情况下才可以进行比较!!!如果equals方法传入参数的数
		据类型不是当前调用方法的类对象对应数据类型。没有必要进行比较。
	3. 判断【自定义比较】内容
		id name age 完全一致,两个对象相同。

【注意】
	equals方法实际上是可以通过IDE开发工具直接完成的,完成的思路过程和以上内容一致,这里需要大家首先来自定义完成方法,后期使用工具来完成。
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类内默认的哈希值是当前对象的空间首地址 十进制展示方式
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. 会选择带有一定独立性数据,不可重复性数据作为hashCodo返回数据的首要选择。
	2. hashCode在开发中或多或少都有可能出现冲突重复问题,这里尽量避免!!!

【原则】
	equals方法比较结果为true,hashCode方法返回哈希一致
1.4.4 属性不存在对应的int类型数据如何解决【小拓展】
情况解释
	实体类不存在任何一个int类型数据,不存在唯一性数据。
	需要通过成员变量来完成组合操作获取哈希值。

推荐一个方法
	Objects工具类提供的hash方法
	public static int hash(Object... values) {
        return Arrays.hashCode(values);
    }
    Object...
    	Object当前方法所需数据类型为Object,也就说支持任何数据类型
    	... 表示这里参数个数不做任何限制,任意长度,可以没有参数,可以是多个参数
    	... 不定长参数
    指定的数据转换计算之后得到一个具有唯一性的哈希值。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DAhAaj3w-1589200212149)(img/强转内存分析图.png)]

2. 异常处理

2.1 生活中的异常
什么是生活中的异常?
	感冒了
	去医院看病:
		医生问你:你怎么了?
		我: 我难受
		医生问你:哪里难受
		我: 我浑身难受
		医生问你: 具体哪里难受,有什么症状
		我: 头疼,困,冷,不舒服
		医生问你: 怎么回事
		我: 昨天晚上吃了10斤雪糕 20斤冰啤 15斤小龙虾
		医生....
	
	这里是不是存在一个前因后果,百因必有果,你的报应就是我~~~
2.2 Java中的异常规则
Java中异常和错误的提示机制也是前因后果!!!
	都是存在一个最基本的原则,从哪里到哪里
	
Java中的异常,错题提示已经非常优秀了!!!
	TeamViewer
	
	耐心看错误!!!
	错误修改有助于提升技术!!!
	
C语言
	段错误!!!
	从头到尾去捋逻辑!!
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 错误
	无法处理,只能避免!!!
	错误都是Error结尾
Exception 异常
	可以处理,还有挽回的余地
	异常都是Exception结尾
	
Java代码中有一个数组需要申请64GB内存,(目前电脑内存32GB)
	不可能!!!错误 Error

Java中代码需要一个数组,但是比给予操作的数组不合法
	可以处理的,Exception
2.4 Error和Exception
Error 错误
	无法处理,只能避免!!!
	错误都是Error结尾
Exception 异常
	可以处理,还有挽回的余地
	异常都是Exception结尾
	
Java代码中有一个数组需要申请64GB内存,(目前电脑内存32GB)
	不可能!!!错误 Error

Java中代码需要一个数组,但是比给予操作的数组不合法
	可以处理的,Exception

猜你喜欢

转载自blog.csdn.net/zhu_fangyuan/article/details/106061912