关于Object
- Object类是Java中所有的类默认的父类,所有的类都默认继承Object类印次使用Object来接收所有类的对象。Object obj =new Class();
Object是最高参数统一化
除了Object是默认所有类的父类外,JDk赋予了Object可以接收所有引用数据类型的权利Object还可以接收数组和接口对象!
int [] arr ={1,2,3,4,5,6};
//1.Object的引用接收数组对象向上转型
Object obj =arr;
int ret =(int [])obj;
System.out.println(Arays.toString(ret));
//2.Object还可以接收接口对象
Ifly fiy =new Duck(name:"鸭子");
//向上转型
Object obj1 = fly;
//向下转型
IFly fiy1=(IFly) obj1;
fly.fly();
注意
由于向上转型的存在,大家一定要记住千万别被前面的类名给迷惑了,我们重点关注的是NEW在哪!!!!
Object类的默认equals方法
对于引用数据类型来说”==“是比较引用类型保存的地址值是否相等,若要进行对象内部属性值比较是否相等使用equals方法!!(Object类提供的方法)
Person per1=new Person(name:"张三",age:18);
Person per2=new Person(name:"张三",age:18);
//false .==比较的是per1和per2变量报讯的地址值
System.out.println(per1==per2);
public boolen equals(Object obj){
return (this == obj);
}
Object默认的equals方法的效果:当前对象和传入对象obj的地址是否相同当前对象的引用this和传入的obj引用是否指向同一个对象
=> per1 == per2没啥区别!
因此,自定义的类中,想要比较当前类的对象属性,必须覆写equals方法!
equals覆写
public booLean equals(Object obj) {
// 1.base case
if (this == obj) {
//1.当前对象和转入对象obj都指向的是同一个对象
return true;
}
//2.若传入对象为空或传入对象obj压根就不是Person类型的引用
if (obj==nul! || !(obj instanceof Person)) {
return false;
}
//代码若走到这里,是什么情况
//传入对象obj和当前对象this确实是指向的两个不同对象,且obj一定是当前Person的引用
//脱掉外衣,向下转型,将obj还原为Person引用进行具体属性值的比较
Person per = (Person) obj;(向下转型)
//只要是引用数据类型进行的对象相等比较,统一使用equals方法,JDK常用的类已经实现好了
//String,包装类,集合类等等DK帮助大家实现好了equals方法
return this.age == per.age && this.name.equals(per.name);
//调用String类的equals方法
Object类型除了基本数据类型无法处理外,所有引用数据类型都可以通过Object接收这就是包装类的由来
包装类
- 包装类和基本类型的相互转换
基本类型—>包装类对象,这个过程称之为”装箱“要么通过相应的包装类的构造方法或valueOf(推荐)
包装类对象---->基本数据类型,这个过程称为”拆箱“调用相应的包装类的XXValue方法实现拆箱 - 包装类的装箱和拆箱解决了将基本数据行封装到类之中的问题,这就引入了一个新问题,若要进行基本类型的运算,需要来回装箱和拆箱,代码写起来很麻烦因此,JDK在编译阶段引入了自动拆装箱,我们只管写代码剩下的交给编译器
- 什么时候使用包装类,什么时候用基本数据类型?
对于基本的POJO类(自定义的类),成员变量统一使用包装类,方法中局部变量可以使用基本数据类型 - 基本类型和包装类本质上是两个不同的类型,包装类的本质还是类,对于类来说,默认值为NUll基本类型的默认值就是各个数据类型的默认值
- 包装类仍然是对象,要比较属性值是否相等,用equals方法