|
序
恭喜你发现宝藏文章!!!这里是全网最完整的Java基础知识系列教程!!!每天持续分享Java入门、学习的知识和经验。
Java面向对象的三大特性我们已经介绍了2个了,今天是三大特性的最后一讲——多态。
本章的内容比较多,需要反复阅读和实践,建议大家先收藏起来,以便于更好的记录和复习。

<hr/>一、基本概念
多态,指同一个方法在不同类下返回不同的结果的特性,它允许不同类的对象对同一消息作出不同响应,具体实现逻辑是:父类引用指向子类对象。
让我们以游戏开发为例:
Player.java
public class Player {
public Player() {
}
public void attack() {
System.out.println(&#34;玩家发动了攻击。&#34;);
}
}Soldier.java
public class Soldier extends Player{
@Override
public void attack() {
System.out.println(&#34;战士发动了物理攻击。&#34;);
}
}Magician.java
public class Magician extends Player {
@Override
public void attack() {
System.out.println(&#34;法师发动了魔法攻击。&#34;);
}
}Test.java
public class Test {
public static void main(String[] args) {
Player player1 = new Player();
Player player2 = new Soldier();
Player player3 = new Magician();
player1.attack();
player2.attack();
player3.attack();
}
}在运行Test的主程序后,会得到如下结果
玩家发动了攻击。
战士发动了物理攻击。
法师发动了魔法攻击。上例模拟的是很多游戏开发场景,每个游戏都有各种角色职业(即Soldier类/Magician类等)是为子类,一般这些职业都会被统一到一个父类下(即Player类),不同职业拥有不同的攻击模式(即attack方法)和技能。
在程序开发的时候,工程师只需要对父类Player执行attack的方法,具体是物理攻击还是魔法攻击,则可以利用面向对象的多态特性,在运行时调用到合适的方法。 <hr/>二、向上转型
上例中涉及到一个概念——向上转型,是父类引用指向子类实例,即子类实例被赋予父类对象的情况(如子类Soldier实例被赋为其父类Player对象)。
此时,该实例可以调用的是:
但不能调用的是:
补充:
此时的实例,本质上还是父类对象,只是利用多态的特性可以调用到子类重写的方法和父类自带的方法,但也正因为它还是父类对象,所以父类不存在(仅存在于子类)的方法就无法调用了。 三、向下转型
相对于向上转型,java里也有向下转型,即子类引用指向父类对象。
示例代码:
Player player = new Soldier();
\\ 省略若干中间代码...
if (player instanceof Soldier) {
Soldier soldier = (Soldier) player;
}此时,该实例能向下转型的前提条件是:
- 该实例在创建时必须与向下转型的子类一致(即必须为Soldier类);
- 如果实例创建类型与向下类型不一致,则无法完成向下转型的操作。
关于instanceof的说明:
语句A instanceof B 语句能得到:A实例是否属于B类对象;
instanceof在这里可以用来判断A是否能完成对B的向下转型。 四、abstract关键字
抽象类:
- 特点:不能实例化,只能被继承,可以通过向上转型指向其子类实例;
- 应用场景:用来规范和提醒某个父类的所有子类都必须包含某些方法或属性时使用,能有效避免子类的设计随意性和父类的无意义实例化;
- 示例代码:public abstract class Player{...}。
抽象方法:
- 特点:①不能包含方法体;②包含抽象方法的类必须是抽象类;
- 应用场景:用来约定其子类必须拥有和重写的方法;
- 示例代码:public abstract void method(){...}。
<hr/>以上就是本期课程的全部内容,如果对你有所帮助,记得给老K点个赞哦!
需要了解之前九期课程内容可以点击下方链接。
推荐阅读
以下是本系列之前几讲的内容:
- 老K玩代码:全网最完整的免费java教程讲义系列(一)——java配置和安装
- 老K玩代码:全网最完整的免费java教程讲义系列(二)——java数据和变量
- 老K玩代码:全网最完整的免费java教程讲义系列(三)——java的运算符
- 老K玩代码:全网最完整的免费java教程讲义系列(四)——java的流程控制
- 老K玩代码:全网最完整的免费java教程讲义系列(五)——java数组详解
- 老K玩代码:全网最完整的免费java教程讲义系列(六)——java方法详解
- 老K玩代码:全网最完整的免费java教程讲义系列(七)——面向对象.类
- 老K玩代码:全网最完整的免费java教程讲义系列(八)——面向对象.封装
- 老K玩代码:全网最完整的免费java教程讲义系列(九)——面向对象.继承
<hr/>另外,老K推荐想要自学Java面向对象的小伙伴两本入门时可以读的书目:
- 《On Java》,豆瓣读书评分:9.0 ★★★★★
作者 Bruce Eckel是在硅谷成名已久的大牛,其早年的《Java 编程思想》可谓是Java编程圣经。如今的这部书亦是他呕心沥血之作,增加了很多近期java版本的特性,更适合当下。全书两册,分为基础卷和进阶卷。基础卷对新手友好,循序渐进;进阶卷内容详实、步步为营。
- 《Java面向对象编程》,豆瓣读书评分:7.7 ★★★★
关于Java面向对象的部分,我推荐的书目是孙卫琴的《Java面向对象编程》一书。本书深入浅出,结合实例,在大量典型案例中讲解Java面向对象相关的知识。推荐重点第一章,面向对象的基础知识在这本书里讲得非常清晰。 <hr/>结束语
我是专注于开发领域的 @老K玩代码 ,会持续生产关于Java入门、项目开发等的优质内容。
如果你想学习编程,或者想精进你的编程能力,可以关注我。
如果你对Java开发有任何疑问或有想了解的内容,而我暂时没有写到的,也欢迎随时来找我聊聊。
 |
|