一、多态的语法

1.两个类之间没有继承关系的,使用多态是不能编译的。

2.无论向上还是向上转型,都需要有继承关系。

3.什么时候需要向下转型?

当调用的方法或者属性是子类型特有的,在父类型中不存在,就需要向下转型。

4.著名异常:java.lang.ClassCastException

package com.bjpowernode.java_learning;

​

public class D47_ {

  public static void main(String[] args) {

    Animal46 a3 = new Cat46();

    //a3.catchMouse();//这里使用的方法在Animal46中不存在,但是在Cat46中存在,所以需要强制类型转换

    Cat46 c4 = (Cat46)a3;

    Animal46 a5 = new Bird46();

    /**Cat46 c5 = (Cat46)a5;

    *

     * 上面这个程序编译是没有问题的,因为编译器检查到a5的数据类型是Animal46,Animal46和Cat46之间是存在

     * 继承关系的,并且Animal46是父类型,Cat46是子类型,父类型转换为子类型叫做向下转换类型,语法是合法的,

     * 程序虽然编译通过了,到那时程序在运行阶段会出现异常,因为JVM堆内存中真是存在的对象是Bird类型,Bird

     * 对象是无法转换为Cat对象的,因为两种类型之间不存在任何继承关系此时就会出现著名的异常:

     * java.lang.ClassCastException

     * 类型转换异常,这种异常总是在“向下转型”的时候会发生。

     *可以修改为:

     *if(a5 instanceof Cat46){

     *  Cat46 c5 = (Cat46) a5;}

     *else if(a3 instanceof Bird46){

     *  Bird46 b5 = (Bird46) a5;}

     */

  }

}

class Animal46{

  public void move() {

    System.out.println("动物们再行走");

  }

}

class Cat46 extends Animal46{

  public void move() {

    System.out.println("小猫在行走");

  }//重写函数

  //下面是小猫类特有的函数

  public void catchMouse() {

    System.out.println("小猫是会抓老鼠的");

  }

}

class Bird46 extends Animal46{

  public void move() {

    System.out.println("小鸟在飞翔");

  }

}

注意:

(1)以上异常只有在强制类型转换的时候才会出现,也就是说“向下转型”存在隐患(编译通过了,到那时运行出错了)

(2)向上转型,只要编译通过了,运行一定不会出错.Animal46 a1 = new Cat46()

(3)向下转型,运行可能会出错,:Animal46 a1 = new Cat45();Bird46 b1 = (Bird46)a1;

5.如何避免向下转型出现的ClassCastException呢?

使用instanceof运算符可以避免出项上述情况,怎么用呢?

(1)格式:这个后面的数据类型是它在堆内存中的实际存储的数据类型。

(引用  instanceof 数据类型名)

(2)以上运算符的执行结果是布尔类型,结果可能是true/false

(3)关于运算结果true/false

假设:(a instanceof Animal)

true表示:a这个引用指向的对象是一个Animal类型

false表示:a这个引用指向的对象不是一个Animal类型

6.java规范中要求:在进行强制类型转换之前,建议采用instanceof运算符进行判断,避免ClassCastException异常的发生。

二、代码调试

快捷键:

F5:进入到该程序中

F6:下一步

F7:当前方法结束

F8:执行下一个断点

四、多态的作用

1.多态在实际开发的作用,以下以主人喂养宠物为例说明多态的作用:

(1)分析:主人喂养宠物这个场景要实现需要进行类型的抽象:

主人(类)

主人可以喂养宠物,所以主人有喂养的这个动作

宠物(类)

宠物可以吃东西,所以宠物有吃东西的这个动作

(2)面向对象编程的核心:定义好类,然后将类实例化为一个对象,给一个环境驱使一下,让各个对象之间协作起来形成一个系统

(3)多态的作用

先举个不使用多态的例子

package com.bjpowernode.java_learning;

​

public class D47_2_EffectOfPolymorphic {

  public static void main(String[] args) {

    Master47 m1 = new Master47();

    Cat47 c1 = new Cat47();

    m1.feed(c1);

    Dog47 d1 = new Dog47();

    m1.feed(d1);

  }

​

}

class Cat47{

  public void eat() {

    System.out.println("小猫爱吃鱼");

  }

}

class Dog47{

  public void eat() {

    System.out.println("小狗爱吃骨头");

  }

}

​

class Master47{

  public void feed(Cat47 c) {

    c.eat();

  }

  //函数重载一下,要是养小狗也得调用

  public void feed(Dog47 d) {

    d.eat();

  }

}

从上面的例子可以看出来:这种方式没有使用java语言中的多态机制,存在的缺点:Master47的扩展力很差,因为只要加一个新的宠物,Maset47这个类就要添加新的方法。

我们补充几个概念:

提高程序的耦合度(解耦合),提高程序的扩展力(软件开发的一个很重要的目标)

我们日v行:面向抽象编程不要面向具体过程编程,面向抽象编程的好处是:耦合度低,扩展能力强。

package com.bjpowernode.java_learning;

​

public class D47_3_PolymorphicExample {

  public static void main(String[] args) {

    Pet pDog = new Dog47_2();

    Pet pCat = new Cat47_2();

    Master47_2 m2 = new Master47_2();

    m2.feed(pDog);

    m2.feed(pCat);

    //我们利用多态就可以做到随便养宠物,将宠物作为父类

  }

​

}

class Pet {

  public void eat() {  }

}

class Cat47_2 extends Pet {

  public void eat() {

    System.out.println("小猫还在吃鱼");

  }

}

class Dog47_2 extends Pet {

  public void eat() {

    System.out.println("小狗还在吃骨头");

  }

}

class Master47_2{

  public void feed(Pet p) {

    p.eat();

  }

}

五、源码:

D47_1_polymorphic.java

D47_2_EffectOfPolymorphic.java

D47_3_PolymorphicExample.java

地址:

https://github.com/ruigege66/Java/blob/master/D47_1_polymorphic.java

https://github.com/ruigege66/Java/blob/master/D47_2_EffectOfPolymorphic.java

https://github.com/ruigege66/Java/blob/master/D47_3_PolymorphicExample.java

2.CSDN:https://blog.csdn.net/weixin_44630050(心悦君兮君不知-睿)

3.博客园:https://www.cnblogs.com/ruigege0000/

4.欢迎关注微信公众号:傅里叶变换,个人公众号,仅用于学习交流,后台回复”礼包“,获取大数据学习资料

Java连载47-多态基础语法、作用的更多相关文章

  1. Java学习笔记之---基础语法

    Java学习笔记之---基础语法 一. Java中的命名规范 (一)包名 由多个单词组成时,所有字母小写(例如:onetwo) (二)类名和接口 由多个单词组成时,所有单词首字母大写(例如:OneTw ...

  2. JAVA企业级开发-xml基础语法&约束&解析(04)

    一.什么是xml html:超文本标记语言.它主要是用来封装页面上要显示的数据,最后通过浏览器来解析html文件,然后把数据展示在浏览器上.同样我们可以使用JS和DOM技术对html文件进行解析和操作 ...

  3. Java连载26-方法(语法结构)

    一.方法 1.返回值类型如果不是void,表示这个方法执行结束之后必须返回一个具体的数值,当方法执行结束的时候没有返回任何数值,编译器会报错,怎么返回值呢?并且要求“值”的数据类型必须和“方法的返回值 ...

  4. java学习笔记之基础语法(一)

    1.java语言基础由关键字.标识符.注释.常量和变量.运算符.语句.函数和数组等组成. 2.1关键字 定义:被java语言赋予了特殊含义的单词 特点:关键字中所有的字母都是小写. 2.2用于定义数据 ...

  5. Java学习笔记之基础语法(数据类型)

    8种基本数据类型    整型:   byte[1字节]          short[2字节]        int[4字节]         long[8字节]      1,四种整型之间的区别:申 ...

  6. java快速复习 一 基础语法

    最近看很多算法书,比较不错的有不少都是java语言描述,所以用一天时间快速研究并整理java  ,参考资料:java入门经典 Call this file "Example2.java&qu ...

  7. Java入门笔记 01-Java基础语法

    一.数据类型和运算符 1.注释可以提高程序的可读性.可划分为 单行注释 // 多行注释 /.../ 文档注释 /**...*/ 2.标识符的命名规则: 标识符必须以字母.下划线_.美元符号$开头. 标 ...

  8. JAVA预科:Markdown基础语法

    JAVA预科:Markdown语法 什么是Markdown?Markdown是一种轻量级的「标记语言」,通常为程序员群体所用,目前它已是全球最大的技术分享网站 GitHub 和技术问答网站 Stack ...

  9. java与C#的基础语法区别--持续更新

    1.判断字符串是否相等 java : equals()比较的是对象的内容(区分字母的大小写格式),但是如果使用“==”比较两个对象时,比较的是两个对象的内存地址,所以不相等.即使它们内容相等,但是不同 ...

随机推荐

  1. kotlin之变量与常量

    版权声明:本文为xing_star原创文章,转载请注明出处! 本文同步自http://javaexception.com/archives/217 kotlin之变量与常量 最近开始做新产品,于是乎用 ...

  2. 1、nio说明 和 对比bio

    nio和bio的区别 bio: 面向流的. 单向的. 阻塞的,这也是b这个的由来. nio: 面向块的.(buffer) 双向的. 非阻塞的.同步的编程方式.是一种select模型 nio编程的常规步 ...

  3. 服务守护DOS脚本

    创建一个批处理文件,复制以下内容至文件中并保存,右键文件名,以管理员身份运行.   @@@code  @echo off @echo 请使用管理员身份运行此脚本 rem 运行前先打开文件修改下列变量: ...

  4. pyecharts绘制地图

    python 绘制地图 环境准备 1.1 安装必备绘画库 亲身体验,最新版的pyecharts使用不来,通过百度寻得的教学推荐版本 0.1.9.4 可以绘制完成世界地图,国家地图以及市级地图,但是不能 ...

  5. 【tf.keras】TensorFlow 1.x 到 2.0 的 API 变化

    TensorFlow 2.0 版本将 keras 作为高级 API,对于 keras boy/girl 来说,这就很友好了.tf.keras 从 1.x 版本迁移到 2.0 版本,需要修改几个地方. ...

  6. ResultSet RS_resultxtgg=connDbBean.executeQuery(sqlxtgg);

    <%String sqlxtgg="select * from dx where leibie='系统公告'"; ResultSet RS_resultxtgg=connDb ...

  7. [译]Vulkan教程(01)入门

    [译]Vulkan教程(01)入门 接下来我将翻译(https://vulkan-tutorial.com)上的Vulkan教程.这可能是我学习Vulkan的最好方式,但不是最理想的方式. 我会用“d ...

  8. IT兄弟连 HTML5教程 CSS3揭秘 CSS简介

    HTML使用标签将内容放到网页上,也可使用元素和属性来控制简单的文档外观.如果希望更全面地控制Web页面的外观和布局,则需要使用层叠样式表(简写为CSS).CSS规范的工作原理在于允许用户制定一些规则 ...

  9. 你可能会忽略的 Git 提交规范

    一.为什么需要规范? 无规矩不成方圆,编程也一样. 如果你有一个项目,从始至终都是自己写,那么你想怎么写都可以,没有人可以干预你.可是如果在团队协作中,大家都张扬个性,那么代码将会是一团糟,好好的项目 ...

  10. 【构建之法教学项目】一个简单的基于C#的电子商务系统演练场景的代码示例

    电子商务平台,是一个历史悠久而又充满挑战的行业,他和社交一起成为中国互联网市场的两极.电子商务系统是一个非常复杂的系统,他实现了人与物.人与人的链接,同时也需要大量的技术来支撑,实现系统的高可用.这些 ...