java中多态_java之多态

java中多态_java之多态1.多态的概述:是面向对象的三大特性之一,封装、继承、多态。①一个具体的对象有多种形态,老虎既属于猫科动物(因为子父类是相对的,所以猫科动物也可以看做子类),又属于哺乳动物,所以老虎既可以拥有猫科动物的属性,又有哺乳动物的属性。②Java中多态的代码体现在一个子类对象(实现类对象)既可以给这个子类(实现类对象)引用变量赋值,又可以给这个子类(实现类对象)的父类(接口)变量赋值。普通类与普通类,抽象…

大家好,又见面了,我是你们的朋友全栈君。

1.多态的概述:是面向对象的三大特性之一,封装、继承、多态。

①一个具体的对象有多种形态,老虎既属于猫科动物(因为子父类是相对的,所以猫科动物也可以看做子类),又属于哺乳动物,所以老虎既可以拥有猫科动物的属性,又有哺乳动物的属性。

②Java中多态的代码体现在一个子类对象(实现类对象)既可以给这个子类(实现类对象)引用变量赋值,又可以给这个子类(实现类对象)的父类(接口)变量赋值。

普通类与普通类,抽象类与抽象继承类,接口与接口实现类。

ae88748d31f58d5a29f19a5aaa3c6d96.png

多态中成员变量和成员方法的变化

9c9c2edf83e20b7cb5daa316493ddda5.png

成员变量  编译和运行都参考等号的左边。编译运行看左边

成员方法(非静态方法)  编译看左边,运行看右边。

静态方法   编译看左边,运行看左边(父类的)

注:多态创建对象与普通类创建对象对成员变量和成员方法的调用互不影响。

多态中创建的对象,在调用成员变量时,必须是父类中具备的,调用成员方法时,必须是父类具备的,但实际调用时是子类的方法。

3.instanceof关键字,返回值是布尔类型true false。比如:父类A,子类B,子类C,B和C是A的子类,当父类类型A  变量名=new 子类类型B();用instanceof检测是否属于A或B时,返回值是TRUE,当检测是否属于C时,返回值是False。但检测A/B/C以外 的类时,编译不成功。

多态的转型

bdc78c63f0cb49e5569213c59ee89fb2.png

1 父类类型 变量名 = new子类类型();2 如:Person p = new Student();

①多态对象的创建,就是向上转型的过程。此时使用的时父类类型的成员变量(隐藏了子类类型),可以调用各个子类的具体的方法(父类中具有的方法),但不能使用子类中特有的方法。

向上转型用于,父类方法的具体实现,或者使用子类相同方法的不同方法体时。

1 子类类型 变量名 =(子类类型) 父类类型的变量;2 如:Student stu = (Student) p; //变量p 实际上指向Student对象

3 此时可以使用子类的方法和子类的属性

②向下转型的前提是向上转型,所以使用instanceof 判断具体的对象是否属于父类,再进行向下转型。

向下转型,用于使用子类特有的方法。,当提供的对象属于父类对象,但要使用子类特殊的方法时,向下转型。

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 //描述动物类,并抽取共性eat方法

2 abstract classAnimal {3 abstract voideat();4 }5

6 //描述狗类,继承动物类,重写eat方法,增加lookHome方法

7 classDog extends Animal {8 voideat() {9 System.out.println(“啃骨头”);10 }11

12 voidlookHome() {13 System.out.println(“看家”);14 }15 }16

17 //描述猫类,继承动物类,重写eat方法,增加catchMouse方法

18 classCat extends Animal {19 voideat() {20 System.out.println(“吃鱼”);21 }22

23 voidcatchMouse() {24 System.out.println(“抓老鼠”);25 }26 }27

28 public classTest {29 public static voidmain(String[] args) {30 Animal a = new Dog(); //多态形式,创建一个狗对象

31 a.eat(); //调用对象中的方法,会执行狗类中的eat方法32 //a.lookHome();//使用Dog类特有的方法,需要向下转型,不能直接使用33

34 //为了使用狗类的lookHome方法,需要向下转型35 //向下转型过程中,可能会发生类型转换的错误,即ClassCastException异常36 //那么,在转之前需要做健壮性判断

37 if( !a instanceof Dog){ //判断当前对象是否是Dog类型

38 System.out.println(“类型不匹配,不能转换”);39 return; //返回最开始调用的地方main

40 }41 Dog d = (Dog) a; //向下转型

42 d.lookHome();//调用狗类的lookHome方法

43 }44 }

View Code

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/156905.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Git使用流程_git提交流程

    Git使用流程_git提交流程以coding为例,演示如何使用git首先理解下整个流程,如图一,将本地代码上传到远程仓库1.(电脑里得先下载git)登录coding,新建一个仓库,点击代码浏览可以看到2.在本地新建一个文件夹,作为项目根目录,再此启动GitBash,进入目录,并输入gitinit初始化一个本地git仓库3.将本地仓库和我们在coding上创建的远程仓库对接起来,输入gitre…

    2022年9月23日
    3
  • scheduleAtFixedRate 和schedule

    scheduleAtFixedRate 和schedule最近整了一个 TimerTask 要求每天定点执行某一任务 code java importjava util Calendar importjava util Date importjava util Timer importjava util TimerTask importjavax servlet ServletConte imp

    2025年8月8日
    1
  • c++编写简易版2048小游戏

    c++编写简易版2048小游戏

    2021年3月12日
    160
  • 为什么你学不会递归?告别递归,谈谈我的经验[通俗易懂]

    为什么你学不会递归?告别递归,谈谈我的经验[通俗易懂]可能很多人在大一的时候,就已经接触了递归了,不过,我敢保证很多人初学者刚开始接触递归的时候,是一脸懵逼的,我当初也是,给我的感觉就是,递归太神奇了!可能也有一大部分人知道递归,也能看的懂递归,但在实际做题过程中,却不知道怎么使用,有时候还容易被递归给搞晕。也有好几个人来问我有没有快速掌握递归的捷径啊。说实话,哪来那么多捷径啊,不过,我还是想写一篇文章,谈谈我的一些经验,或许,能够给你带来一些帮助…

    2022年9月12日
    2
  • centos开启关闭防火墙(电脑防火墙关闭有什么影响)

    CentOS6:1)永久性生效,重启后不会复原开启:chkconfigiptableson关闭:chkconfigiptablesoff 2)即时生效,重启后复原service iptables status    查看防火墙状态service iptables start     开启防火墙service iptab…

    2022年4月13日
    55
  • 激光雷达(二)——三角测距法和TOF原理

    激光雷达(二)——三角测距法和TOF原理对于市面上的主流激光雷达,主要是用于环境探测、地图构建,按技术路线可分为:三角测距激光雷达,TOF激光雷达。三角测距激光雷达原理三角法的原理如下图所示,激光器发射激光,在照射到物体后,反射光由线性CCD接收,由于激光器和探测器间隔了一段距离,所以依照光学路径,不同距离的物体将会成像在CCD上不同的位置。按照三角公式进行计算,就能推导出被测物体的距离。CCD是ChargeCoupled…

    2022年6月2日
    70

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号