面向对象系列五
一、引用
1.自调传自与this类型
2.类变量引用
3.重写时的发生
二、Object类
1.toString
2.equals
3.hashCode
4.clone
三、排序规则接口
一、引用
1.自调传自与this类型
似复刻变量调用里面的非静态方法时,都是自调传自,自己选择去调用哪个非静态方法并将自己传过去,每一个非静态方法里的this就是接调用者的,所以,谁去调用这个非静态方法的,非静态方法里的this就是谁,但this能不变的只有传值对象头是确定的,经常会有发生转型的,this形参的类型是此非静态方法所属的类的类变量引用类型
2.类变量引用
类变量引用是能掌握此所指似复刻变量里的成员、方法路径信息的访问的,类变量引用的对象是似复刻变量,向上转型向下转型是发生在类变量引用指似复刻变量层面的
引用变量,里面装所指对象的头地址,配合此引用变量类型的访问权限性质进行访问的,向上转型与向下转型是一个引用变量里引用类型的转换,对象头存着,引用类型引用访问权限性质的改变,父子类类变量引用中常常拿着当前似复刻变量对象的对象头去互接去实现对应的整个父子合起来的似复刻变量、单父类似复刻变量的访问,其中,对象头地址是交接着它传它接不变的,始终指向这块对象的地址头,变的是子类类变量引用下、父类类变量引用下的引用访问权限,影响到最后访问的效果
(类变量、似复刻变量可参考面向对象系列一【Java学习】类和对象-CSDN博客)
3.重写时的发生
重写是转型后的父类类变量引用传自己去调用父类里被重写的方法时发生的,发生时的调用现象是转型后的父类类变量引用传接到隐藏的this父类类变量形参,这时发生方法重写,此转型后的父类类变量引用直接向下转型为子类类变量引用类型直接this权限全开为整个对象并去调用子类那边重写的方法,因为重写的两方法是相同的,隐藏形参this外的其它形参都是正常传
所以子类这边super()去调用父类那边的被重写的方法时,父类隐藏形参那边是有发生向上转型,但重写发生的条件是向上转型后的类变量引用去传自己去调用父类的那个被重写的方法,转型后的父类类变量引用传到用被重写方法的父类类变量引用接发生的,所以子类这边传子类似复刻变量自己super指向父类非静态方法调用时是去指向父类的被重写的方法执行父类被重写本身的方法而不会发生重写去执行子类那边的方法
二、Object类
Object类是所有类的父类,所有的类都有默认继承了Object类,Object类里面有很多方法提供给任何一个正常类继承着可以去使用的,但我们常常在子类里重写在默认父类里的这些方法对应实现上针对实际所需情况
- Object类里的方法都是非静态方法,哪个似复刻变量去调用的里面的this就是哪个转型后的似复刻变量引用
- Object类里面都是有具体实现的非静态方法,是没有抽象方法的正常类,是可以直接实例化的
1.toString
1.1Object里原方法:
- getClass().getName() -> 返回调用者当前对象当前似复刻变量的类的包名类名全路径
- Integer.toHexString(hashCode()) -> 返回当前调用它的似复刻变量哈希码值(一个整数)的十六进制
返回当前似复刻变量对象所属于的类所在的包名类名@当前似复刻变量对象的哈希码值的十六进制
1.2子类里重写方法:
更改实现成返回获取当前似复刻变量里复制变量信息
2.equals
2.1Object里原方法:
引用类型数据==拿去判断的是引用变量里装的对象头哈希值这个值而与它的访问权限性质无关的,即比较是不是指向在同一个对象头,纯值拿来比较,与性质无关
2.2子类里重写方法:
重写后的方法比较重心不在是不是指向同一个对象头上同一个对象上,而是比较两引用所指对象里的复制变量数据是否相等
3.hashCode
3.1Object里原方法:
一个对象放在一个地址空间上
未重写hashCode之前,hashCode方法是基于对象地址内容分配所处内存位置并计算内存位置哈希码值并返回,如果重写了equals方法,就会出现判断成是同一个的一个对象的出现在两个不同的地址空间上,同一个的一个对象是只能出现在一个地址空间上的,所以equals重写判断对象相等的标准之后,hashCode分配对象所处空间的标准也要跟着变,用新的equals判断标准来分配空间,原来它们都是共用地址同一块标准的,现在的相等与分配也要改成相同判断依据保持一致,所以要重写hashCode方法,将它的内存分配依据从原来的地址改成与现在重写的equals判断相等的依据一样
3.2子类里重写方法:
以新的分配标准分配对象内存并计算其内存位置哈希码值返回
4.clone
4.1Object里原方法:
Object类中有提供由本地实现的克隆方法,将调用它的对象传过来的this里的对象头指向的原对象全部拷贝一份在堆上(克隆只能对传来的this指向的整对象克隆说明只能克隆类变量创的似复刻变量、克隆只需要对象头地址,不需要它所在的引用的访问权限,有对象头地址就可把整个对象全克隆拷贝一份出来),拷贝出来后的似复刻变量再通过返回值转型都能统一向上转型为Object类的引用以统一的返回值返回出来实现方法的共用,因为向上转型为Object类变量引用了,方法将Object类引用返回后我们要通过强转向下转型回原来克隆出的对象拿到
4.2基于Object原方法
我们我们的克隆都是基于Object类里的那个本地克隆方法实现的,它不是抽象方法不是一定要重写,直接从子类调用Object父类里的那个方法就行了,去实现重写时往往是因为要根据实际拷贝需求自己再重写去调整拷贝设计的,重写的方法也是在重写方法里去调用Object类里原生提供的克隆方法进行的,重写方法时我们可以根据需求把似复刻变量以及如果里面也有装似复刻变量一起深层地把所有似复刻变量都拷贝出来达到深拷贝
4.3clone使用条件
需要实现克隆功能的类仅仅有Object类继承方法提供克隆方法下也还是不够的:
- 需要连接Cloneable空接口来标记此类允许被克隆的
- 有关克隆的任何方法都需要加上 throws CloneNotSupportedException
三、排序规则接口
接口、抽象类都是不能直接对着它实例化的,必须通过连接继承在一个正常类上,通过实例化正常类间接实例化上它们,无法new接口,无法对着接口直接new实例化的,接口的实例化只能通过new连接有它的子类来间接实例化上接口(接口里有抽象方法非静态的需要实例化的才可调用才可传有参才可使用)
基本数据类型元素的数组排序规则是默认已经有定的,似复刻变量类型元素的数组没有默认排序规则的,需要我们连接比较接口,重写实现有比较的排序规则给sort用
1.Comparable<T>
Comparable<T>接口与要实现排序类变量的似复刻变量功能的那个类直接连接的,对类的入侵性强
接口里原方法:
子类里重写方法:
接口变量里面抽象方法的形参Object任何类的父类类变量,子类重写方法的形参是必须为T
这样对象就算从接口向上转型导入执行被重写的抽象方法也能实现:
- 隐藏形参里,隐藏形参里向上转型后的父类引用过重写方法自动完成向下转型权限全打开成为子类引用,先形参转接向上转型再重写向下转型回来
- Object o与 T o 形参里,任何类变量引用传到接口Object类变量引用都会发生形参转接向上转型,因为<T>强制规定了子类这边重写方法的形参必须是T,向上转型后的父类类变量引用又会进行强制类型转换向下转型转成子类类变量引用(如果传参的子类类变量引用类型刚开始就不与T相同的,向上转型时没什么问题,向下转型后就会报错发现转不了传入的不是规定的T引用类型而停下报错),子类实例以接口导入能实现的从子类实例直接调用重写方法肯定也能实现
2.Comparator<T>
Comparator<T>接口可连接在单独出来的比较器类上的,不需要连接在要实现排序规则的类上,连接在一个专门实现比较规则的比较器类上做出一个独立出来的提供比较规则的类,为需要排序的类变量似复刻变量数组sort排序时作为参数多传一个比较器类的实例似复刻变量参数提供sort方法的排序规则