第五章 继承

简介: 类,超类和子类super和this看似有相似的概念, 但实际没有可比性,this持有对象本身的引用, 可以赋值给另一个变量,super则不具备这样的功能, 它只是一个指示编译器调用超类方法的关键字调用super()构造器的语句必须是子类构造器的第一条语句Object: 所有类的超类判断两个对象是否相等可以使用Objects.

类,超类和子类

  • super和this看似有相似的概念, 但实际没有可比性,this持有对象本身的引用, 可以赋值给另一个变量,super则不具备这样的功能, 它只是一个指示编译器调用超类方法的关键字
  • 调用super()构造器的语句必须是子类构造器的第一条语句

Object: 所有类的超类

  • 判断两个对象是否相等可以使用Objects.equals()静态方法, a.equals(b)的方式如果a=null时会报异常
  • equals()方法的最佳实践:
    1. 参数命名为otherObject
    2. 检测this和otherObject是否引用同一对象, if(this==otherObject) return true;
    3. 检测otherObject是否为null,为null则返回false,if(otherObject==null) return false;
    4. 比较this和otherObject是否为同一个类,如果equals()的语义在每个子类中有改变, 就使用getClass()检测, if(this.getClass()!=otherObject.getClass()) return false; 如果所有子类都有统一的语义, 就使用instanceOf检测
    5. 将otherObject转化为相应的类类型变量,ClassName other = (ClassName)otherObject
    6. 对所有的域进行比较,==比较基本类型,equals比较对象,所有均匹配返回true, 如果子类重新定义了equals(),就要在其中包含调用super.equals(other).

  • 如果不想让子类重新实现equals()方法, 就将其定义为final, 并在其中实现对象的相等比较逻辑
  • Objects.hashCode()方法可以进行参数安全检查,如果参数时null该方法返回0,否则对参数调用hashCode()方法
  • 使用静态的Double.hashCode()来避免创建Double对象,其他包装类也可以这样使用
  • Objects.hashCode()提供了多参数方法,所以可以将多个值传入计算组合的hashcode.
  • Arrays.toString()可以打印数组,Arrays.deepToString()可以打印多维数组

泛型数组列表

  • 可以使用@SuppressWarnings("unchecked")标注来标记变量能够接受类型转换

对象包装器和自动装箱

  • Java可以对包装类进行自动装箱和拆箱, 这就导致包装类的行为有点像基本类型,但对于==比较来说不成立,应该使用equals()方法
  • 另外,装箱对象可能为null,null做运算会抛出异常(NullPointerException)
  • 装箱拆箱时编译器的行为,而不是虚拟机,生成class字节码时由编译器插入必要的方法.
  • 包装类时不可变的,也就是作为参数传递的包装类变量不会在方法内改变

参数数量可变的方法

  • 允许将数组传递给可变参数方法的最后一个参数

枚举类

  • 枚举类比较使用==即可

反射

  • 不建议使用反射,因为反射的大多实现都需要进行类型转换,使用直接调用或者lamda更好;另外反射比较脆弱,容易出问题,且出了问题不好查找
相关文章
|
7月前
|
安全 网络安全 定位技术
VPN虚拟专用网络
VPN(虚拟专用网络)通过公共网络创建安全加密的专用连接,保护数据传输。其核心是建立加密隧道,常用协议包括OpenVPN和IPsec。主要应用涵盖企业远程办公、隐私保护及绕过网络限制。优点为高安全性、灵活性强和成本低,但也存在速度影响、配置复杂及潜在安全漏洞等问题。总体而言,VPN在现代网络中具有重要价值,且随着技术进步持续优化。
2404 16
|
测试技术 C语言
单链表之无头链表(C语言版)
本文详细介绍了使用C语言实现无头单链表的方法,包括节点和链表结构的定义、链表的创建与销毁、节点的插入与删除,以及链表的打印等功能。文章通过具体的代码示例,展示了如何在无头链表中进行头插法、尾插法、自定义位置插入和删除,以及如何清空和销毁链表。
289 0
单链表之无头链表(C语言版)
|
设计模式 测试技术
依赖注入与工厂设计模式的区别
【8月更文挑战第22天】
277 0
|
XML 存储 缓存
记一次雪花算法遇到的 生产事故!
最近生产环境遇到一个问题: 现象:创建工单、订单等地方,全都创建数据失败。 初步排查:报错信息为duplicate key,意思是保存数据的时候,报主键 id 重复,而这些 id 都是由雪花算法生成的,按道理来说,雪花算法是生成分布式唯一 ID,不应该生成重复的 ID。
526 5
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp微信小程序的校园跑腿的详细设计和实现
基于SpringBoot+Vue+uniapp微信小程序的校园跑腿的详细设计和实现
394 0
|
算法 调度
【完全复现】基于改进粒子群算法的微电网多目标优化调度
该文档描述了一个使用改进粒子群算法实现的微电网多目标优化调度的Matlab程序。该模型旨在最小化运行成本和环境保护成本,将多目标问题通过权值转换为单目标问题解决。程序中定义了决策变量,如柴油发电机、微型燃气轮机、联络线和储能的输出,并使用全局变量处理电负荷、风力和光伏功率等数据。算法参数包括最大迭代次数和种群大小。代码调用了`PSOFUN`函数来执行优化计算,并展示了优化结果的图表。
|
存储 弹性计算 运维
阿里云Elasticsearch Serverless助力医疗科技企业实现业务提效和加速创新
通过采用阿里云Elasticsearch Serverless服务,某医疗科技企业解决了大规模智能床垫数据存储和分析的挑战。Serverless架构帮助客户降低50%以上的成本,实现资源弹性伸缩,免去运维负担,提高业务弹性和稳定性,企业能更专注于产品创新和用户体验优化。
802 1
|
监控 Java Android开发
AMS图解
以下是内容的摘要,以Markdown格式呈现: ```markdown - Android体系结构、系统启动流程和Binder机制的图表展示了Android操作系统的核心组件交互。 - Binder启动涉及Zygote进程,它通过反射调用ActivityThread.main来初始化Binder线程池。 - AMS通过Binder通信管理应用进程,如启动Activity,与Zygote通过socket通信fork新进程。 ``` 请注意,由于限制在240个字符内,摘要只能提供高层次的概念和流程,而无法包含详细步骤或具体图片的描述。
|
算法 异构计算
基于FPGA的图像RGB转CIE-Lab实现,包含testbench和MATLAB辅助验证程序
基于FPGA的图像RGB转CIE-Lab实现,包含testbench和MATLAB辅助验证程序
|
Java 数据安全/隐私保护 计算机视觉
基于JSP/SERVLET实现的人脸识别考勤系统(二)
基于JSP/SERVLET实现的人脸识别考勤系统
148 1