前言
介绍:大家好啊,我是hitzaki辰。
社区:(完全免费、欢迎加入)日常打卡、学习交流、资源共享的知识星球。
自媒体:我会在b站/抖音更新视频讲解 或 一些纯技术外的分享,账号同名:hitzaki辰。
正文开始,抓紧上车!
一 - 概念
继承是类与类的一种关系,是一种“is a”的关系。比如“狗”继承“动物”,这里动物类是狗类的父类或者基类,狗类是动物类的子类或者派生类。
java中的继承是单继承,即一个类只有一个父类。在Java中,类的继承是指在一个现有类的基础上去构建一个新的类,构建出来的新类被称作子类,现有类被称作父类。
继承的好处: 子类拥有父类的所有属性和方法(除了private修饰的属性不能拥有)从而实现了实现代码的复用;
语法规则: 只要在子类加上extends关键字继承相应的父类就可以了:
若继承的父类没有无参构造,但我们在构造方法也没调用它的有参构造,则报错,因为使用new构造一个对象时,
会先执行父类的构造方法,若没有使用super(参数列表)来调用父类指定构造方法,则默认调用父类无参构造方法。
二 - super关键字
它是一个关键字,用来表示父类,但不像this一样是一个实际变量,它不可以作为变量使用。它可以:
(1)调用父类构造方法,构造方法第一行且只能调用一次
(2)可以调用父类的非私有方法、属性
三 - 根类Object
Object类是所有类的父类(基类),如果一个类没有明确的继承某一个具体的类,则将默认继承Object类。
Object 类是所有 Java 类的根基类,也就意味着所有的 Java 对象都拥有Object 类的属性和方法。
实现了Cloneable接口,才可以调用clone。
1 - toString
获取对象信息的字符串,默认返回 "类名+@+hashCode()返回结果的十六进制格式"(重写它以返回自定义信息)
2 - equals
(1)它的原始实现是使用 == 来比较指针的值, 但系统类一般已经覆盖了equals(),比较的是内容。
(2)==符号不可以比较两个没有父子关系的对象。
如何高质量实现equals重写?
1. 使用==符号检查
2. 使用instanceof判断类型是否相同,作为比较的是equals方法所在类。
3. 进行类型转换,因为使用过instanceof,所以能比较成功的一定可以转换。
4. 比较每个关键属性,全部比较通过则返回true。
5. 测试重写的equals是否符合这5点。
3 - hashCode
1)hashCode的默认实现是一个本地方法,不同虚拟机有不同实现。
2)无论是否覆盖,我们可以使用System.identityHashCode(Object x)方法返回此对象默认的hashcode值。
3)设计一个hashCode,它必须快,而且具有意义(使用有意义的字段来生成hashcode)。
4)hashCode不需要唯一(默认的hashCode唯一),因此更应该关注它的速度,而不是唯一性。
4 - 为什么hash和equals要一起重写
为了使诸如HashMap这样的哈希表正常使用,才有了如下的规定:
(因为我们想快速定位一个key,若通过equals一个一个比较,效率太低了,所以引入了hashcode)
1)因此,重写了equals,必须重写hashCode,使其满足这些规定。
2)当然,如果我们不把自定义对象当成HashMap的键来使用,那么自定义对象不重写equals和hashCode也是可以的。
3)拿它当键时,哈希值是会发生冲突的,当定位到同一个位置,只能通过equals才能定位了正确的位置。
5 - finalize
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,
可以覆盖此方法提供垃圾收集时的敏感词资源的回收,例如关闭文件等。(可以,但是不建议这么做)
结尾
感谢你看到这里,如果感觉内容不错的话请点赞支持一下!
如果小伙伴对我的讲解有疑问,欢迎评论区讨论。