5.继承相关的小知识
文章目录
- 1. 多态
- 2. 子类强转与抽象创建
- 3. equals原则
- 4. 反射编写泛型数组
- 5. 继承的设计技巧
1. 多态
什么是多态?是不是被面试官这样问道过。
用书中的话来讲,一个对象变量可以只是多种实际类型的现象称之为多态。
说人话就是,一个变量 bb
他可能既可以是Person
类型,也可能是Student
类型,只要这两个类型有着继承关系即可,根据实际的对象来表现出对应的行为。
话不多说,看代码。
public class Demo1 {public static void main(String[] args) {Person person = new Person();//虽然左边的类型是Person 但最终的对象取决于右边Person student = new Student();person.say();student.say();//I'm person//I'm student}
}class Person {public void say() {System.out.println("I'm person");}
}
class Student extends Person {@Overridepublic void say() {System.out.println("I'm student");}
}
可以看到。Student重写了父类的方法,虽然实际类型是父类,但编译器在运行的时候会去找该对象的实际类型是什么再调用对应的方法,这个过程就被称之为动态绑定
。
相对的,一些private,static,final
修饰符,不涉及到父子类的重写,在编译期就可以直接确定了,这被称之为静态绑定
。
2. 子类强转与抽象创建
首先说第一点,子类强转,如果得到的类是父类,但我们需要调用的方法只有子类才有,那么必须要强转。
public class Demo5 {public static void main(String[] args) {Dad[] dads = new Dad[3];dads[0] = new Dad();dads[1] = new Dad();dads[2] = new Son();//因为play方法只有Son类才有 所以只能强转,父类是调用不了的Son son = (Son) dads[2];son.play();}
}class Son extends Dad {public void play() {System.out.println("一起来玩啊");}
}class Dad {}
对于抽象类,要稍微提一嘴,有时候我们可以看到下面示例代码,通过抽象类去接收真实的对象,这并没有任何问题,但如果你需要一个真实的抽象对象,就得像代码第三行一样创建了。
public class Demo5 {public static void main(String[] args) {//可以看到 前面的类型可以通过Fish来接收Fish fish1 = new BlackFish();Fish fish2 = new RedFish();Fish fish = new Fish() {//除非创建匿抽象对象 如果有抽象方法那也需要实现};}
}abstract class Fish {}
class BlackFish extends Fish{}
class RedFish extends Fish{}
3. equals原则
篇幅有点长,这里贴下链接好了
你真的知道如何重写equals吗?
4. 反射编写泛型数组
之前可能也有同学碰到过,如果说我的数组是Object[]
类型的,即便内部装的是int类型,也是无法通过(int[])进行强转的。
所以书中给出了一个方法,可以让我们拓展任意类型的数组,代码也很简单,看下注释就能明白了,如下所示。
public class Demo3 {public static void main(String[] args) {int[] arr = {1, 3, 4, 5, 6};Object arrObj = goodCopyOf(arr, 10);System.out.println(Arrays.toString((int[]) arrObj));//[1, 3, 4, 5, 6, 0, 0, 0, 0, 0]}/*** 可以扩展任意类型的数组** @param a 数组* @param newLength 要扩展的数组长度* @return 数组对象 可通过强转获取数组*/public static Object goodCopyOf(Object a, int newLength) {//首先获取数组的类型Class<?> cl = a.getClass();//传入的必须是一个数组 但用对象类接收 如果不是数组 则直接返回nullif (!cl.isArray()) {return null;}//返回数组的元素类型Class<?> componentType = cl.getComponentType();//获取传入数组的长度int length = Array.getLength(a);//实例化一个长度为newLength的新数组Object instance = Array.newInstance(componentType, newLength);//将原有的数据进行拷贝System.arraycopy(a, 0, instance, 0, Math.min(length, newLength));return instance;}
}
5. 继承的设计技巧
最后说下书中给的建议,如何更好的使用继承。
1.将公共操作和域放在超类,这个很好理解,既然子类都要用到这些字段,就不必一个个的去创建了。
2.不要使用受保护的域,因为你不知道这个类会被接下里多少类所继承,可能在不经意间破坏了其封装性,除非迫不得已,一般都设置为private即可。
3.使用继承实现“ is-a” 关系,书中给出了钟点工和员工不是继承关系,个人感觉这个说明不是很好,但里面提到了一点,员工有工资,小时工是计时工资,这样钟点工类中就含有了两种工资,容易造成混淆,所以最好不要用继承关系,而是新开一个类。
4.除非所有继承的方法都有意义,否则不要使用继承。
5.在覆盖方法时,不要改变预期的行为。
6.使用多态, 而非类型信息,这里的类型信息指的是,无需通过if,else来判断是哪个类,再调用特定的方法,通过多态,编译器自己就能找到对应的行为。
7.不要过多地使用反射。其实反射在编写应用程序时用不太到,我觉得这点可以忽略了,个人认为在架构设计时,反射很有用。
5.继承相关的小知识相关推荐
- 【C#小知识】C#中一些易混淆概念总结(七)---------解析抽象类,抽象方法
目录: [C#小知识]C#中一些易混淆概念总结--------数据类型存储位置,方法调用,out和ref参数的使用 [C#小知识]C#中一些易混淆概念总结(二)--------构造函数,this关键字 ...
- 成都盛铭轩:直通车小知识
拼多多电商平台自从出现在大众的视野和日常生活当中以后,很多人都感受到了拼多多电商平台的便捷.纷纷想入驻电商平台建一个属于自己的网店.当商家入驻成功后,便要进行运营推广,然后在产品有了一定的销量和评价之 ...
- 从浏览器输入url到页面加载(六)前端必须了解的路由器和光纤小知识
前言 上一章我们说到了数据包在网线中的故事,说到了双绞线,还说到了麻花.这一章继续沿着这条线路往下走,说一些和cdn以及路由器相关,运营商以及光纤相关的小知识,前端同学应该了解一下的 目录 前言 1. ...
- zabbix5.0 High swap space usage ( less than 50% free)解决步骤。相关小知识:linux系统mem和swap的关系
zabbix5.0 系统报错High swap space usage ( less than 50% free) 一,执行free -m,看看目前内存是多少 total used ...
- 机构数据分析培训之关于Mysql定义及数据库相关小知识
机构数据分析培训之关于Mysql定义及数据库相关小知识 一.关于Mysql定义 MySQL是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度 ...
- DRAM刷新refresh相关知识归类-基础小知识(三)
文章目录 一.背景小知识 1.1 DRAM的层次结构 1.2 刷新要求 1.3 DRAM存储芯片的读写时序 1.4 刷新方式分类 参考文献 RAM每一位数据都是通过芯片内的一个 小电容充电(或低电平) ...
- [转]VC常用小知识
[转]VC常用小知识 (1) 如何通过代码获得应用程序主窗口的 指针? 主窗口的 指针保存在CWinThread::m_pMainWnd中,调用AfxGetMainWnd实现. AfxGetMai ...
- VC学习资料收集(12):VC小知识总结
VC小知识总结! (1) 如何通过代码获得应用程序主窗口的 指针? 主窗口的 指针保存在CWinThread::m_pMainWnd中,调用AfxGetMainWnd实现. AfxGetMainWnd ...
- CSS的基本概念———每天一遍小知识
前言 这是我学习了这个网站整理的笔记,接下来还会持续更新. 这是我的博客首页:https://blog.csdn.net/weixin_46654114?t=1 博客名:RodmaChen 如果写的不 ...
最新文章
- unicode编码过php的magic_quotes_gpc设置为on的mysql注入与文件写入(待测试)
- linux c 设置utc时间,C/C++标准库之转换UTC时间到local本地时间详解
- Mysql8.0注意url变更写法
- Android 基础教程之-------Android ProgressBar的使用!
- 开发springboot项目,遇到的一些问题总结
- Linux学习笔记---移植官方uboot步骤(二)
- 【Hive】Hive表数据的导入导出
- 海康威视摄像头激活失败的几个原因和方法
- 李永乐2021线代讲义练习题答案
- biopython简介
- 浪潮服务器 虚拟光驱,玩转虚拟光驱:DAEMON TOOLS Pro
- Asp.net 使用weboffice实现Word在线编辑
- 线性回归:异方差检测及其处理方法
- 解决问题win10无线网卡:无法连接到此网络
- 使用 Hexo 快速免费搭建个人网站
- 《算法新解》作者刘新宇:我只是想打开那些黑盒子,告诉人们里面有什么。
- ecshop首页幻灯片大小设置
- maven -Dmaven.multiModuleProjectDirectory system propery is not set. Check $M2_HOME
- python之用scapy分层解析pcap报文(Ethernet帧、IP数据包、TCP数据包、UDP数据包、Raw数据包)
- ICV:2022年中国车载摄像头市场规模有望突破50亿美元大关