java基础知识整理——多态(二)
1.必要条件:
- 满足继承关系
- 父类引用指向子类对象。
2.多态的实现:
- 多态可由向上转型和动态绑定机制实现。
- 向上转型:子类对象向上转型为父类类型。
- 动态绑定:在程序运行期间,JVM根据对象的类型自动的判断应该调用哪个方法,也叫后期绑定。(静态绑定也叫前期绑定,指在程序运行之前进行绑定,由编译器和链接程序完成)
- 动态绑定例子:
设有一个类Pen,它有三个子类penA,penB,penC;
三个子类都重写了父类中的writing()方法。静态绑定: 这种调用是在代码中指定的,编译时编译器就知道a调用的是penA类中的writing()方法,b调用的是penB类中的writing()方法。
penA a = new penA();
a.writing();
penB b = new penB();
b.writing();
penC c = new penC();
c.writing();
动态绑定:
Pen[] pens = new Pen[5];
int n;
for(int i = 0; i < pens.length; i++){n = (int)(Math.random()*3);switch(n){case 0: pens[i] = new penA(); break;case 1: pens[i] = new penB(); break;case 2: pens[i] = new penC(); break;}
}
for(int i = 0; i < pens.length; i++){pens[i].writing();
}
直到运行时才能根据产生的随机数n的值来确定pens[i]到底代表哪一个子类的对象,这样才能最终确定来调用哪一个类的writing()方法,这就是动态绑定。
3.向上转型:
父类类型 父类引用 = new 子类类型(参数);
问1:这个父类引用能不能调用子类独有的方法?
答:不能,只能调用继承或者重写父类的方法。
问2: 向上转型有什么好处,直接创建子类对象不是更方便吗?
答:向上转型多适用于有多个同父子类的应用场景,此时可借用父类引用,根据需要转为特定的子类对象。
- 父类静态方法无法被子类重写,所以向上转型之后,只能调用到父类原有的静态方法。
4.向下转型:
问1:为什么要有向下转型?
答:向下转型一般是为了重新获取向上转型而丢失的子类的特性而存在的,因此,通常向下转型前先进行向上转型,向下转型通常会和instanceof一起使用。
例如:
5.向下转型易错点:
向下转型需满足向上转型的前提下进行。
类型转换时的括号应用,如上面的例子中的注释部分。
6.关于抽象类:
定义抽象类的意义在于
- 为其子类提供一个公共的类型(父类指向子类对象)
- 封装子类中的重复内容(成员变量和方法)
- 将父类设计为抽象类后,即可借由父类继承关系限制子类的设计随意性,在一定程度上避免了无意义父类的实例化。
- 一个类继承抽象类后,必须实现其所有的抽象方法,否则也是本身也得定义为抽象类。
- abstract方法不能用static和private修饰,对于类,不能同时用final和abstract修饰;因为final关键字使得类不能继承,而abstract修饰的类如果不可以继承将没有任何意义。两者放在一起,也会引发编译异常。
java基础知识整理——多态(二)相关推荐
- 电学基础知识整理(二)
电学基础知识整理(二) 电容和电容器 电容器 两个靠近且夹着绝缘电介质的导体,这样的系统称为电容器. 电容器可以存储电荷,从而可以储能. 电容 指在给定电位差下自由电荷的储藏量,记为C,国际单位是法拉 ...
- 【转】Java基础知识整理
本博文内容参考相关博客以及<Java编程思想>整理而成,如有侵权,请联系博主. 转载请注明出处:http://www.cnblogs.com/BYRans/ PDF版下载链接:<Ja ...
- 2022全新Java基础知识整理,阿里大牛纯手绘思维导图文档
最近趁着年初空闲的时间,总结一下自己这么多年来使用Java的一些心得体会,主要是一些Java基础知识点相关的, 分享给刚刚入门的Java程序员和需要巩固Java基础的朋友们,希望可以给大家一些经验,能 ...
- java基础知识整理
Day01 常见DOS命令和环境变量的配置 每天要做的事--笔记.作业.代码 知识点的学习--A:是什么? B:有什么特点? C:如何使用? D:什么时候使用? E:能讲给别人听么? 一.学习的前提 ...
- java基础知识 整理
1.面向对象的特征有哪些方面? 答:面向对象的特征主要有以下几个方面: - 抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面.抽象只关注对象有哪些属性和行为,并不关注 ...
- Java基础知识总结(二)
一.异常 1.1java中的异常 编译异常:类找不到.文件找不到.sql异常...... ClassNotFoundException:类找不到的异常 FileNotFoundException:文件 ...
- Java基础知识总结(二)更新ing。。。
本文章记录笔者在学习Java历程中总结的一些简单问题,以便后续复习回顾,后面的天数内会有重复的问题 DAY16 重载重写的区别 重写[override]1.必须是继承关系2.在子类中去重写父类的方法3 ...
- java程序中单方法接口通常是,Java基础知识整理
面向对象和面向过程的区别 面向过程 优点: 性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机.嵌入式开发.Linux/Unix等一般采用面向过程开发,性能是最重要的因素. ...
- Java 基础知识整理 (待整理)
JVM之类加载器(ClassLoader)基本介绍 类加载器用于将class文件加载到JVM中去执行.下面介绍类加载器涉及到的基本概念和加载基本过程. 一.Java虚拟机与程序的生命周期 在运行Jav ...
最新文章
- ICML 2018大奖出炉:伯克利、MIT获最佳论文(附论文、项目链接)
- 创建一个类 new 与 不加new 有什么区别?
- loadrunner编写脚本常用策略,用以记录,看的懂的拿走,看不懂说明与你有缘无份...
- 手把手教你C语言静态库的开发
- 云开发系列课程让你从入门到精通快速上手Serverless和云开发技术
- SmartRaiden 和 Lighting Network 进行去中心化跨链原子资产交换
- python函数式编程思想_python函数式编程
- 报告表明混合云带来IT管理挑战
- 常见服务器返回的错误代码(转)
- android 音量调节流程分析,Android 4.4 音量调节流程分析(二)
- 凯悦宣布旗下凯悦悠选品牌首次进入亚太地区;格林酒店发布2021年三季报 | 全球旅报...
- vscode 忽略pep8的指定报错码
- Omnipeek空口抓包(3):过滤器的设置和使用
- (十四)从零开始学人工智能-深度学习基础及CNN
- 快速查询快递物流,根据更新量筛选出只揽收的单号
- 纯c语言打造的雷霆战机,飞机大战。可吃道具加强。
- DDR4内存条电路设计
- 为你的NAS开启DDNS服务,独立IP IPV6 可用 - DDNS-GO
- API网关—Ocelot之服务发现
- 如何获得查新检索报告?
热门文章
- 80后90后夹缝中的一代!
- events.js:187 throw er; // Unhandled 'error' event ^ Error: connect ETIMEDOUT at Co
- java map 递归_Java实现递归将嵌套Map里的字段名由驼峰转为下划线
- (未完)p2p金融+技术选型
- UE4文本编辑组件EditableText输入中文拼音的时候会触发OnTextChanged
- AfterShip 十周年演讲:创业是一场赢得信任,创造价值的修行
- Qemu下安装Sun Solairs8简明教程 转
- 排查解决Java进程占用内存过高
- 电商API为电商企业提供的机会和优势
- 一加手机怎么root权限_一加手机2怎么root? 一加2一键获取root权限教程图解