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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • strlen函数用法举例(strlen字符串)

    strlen(char*)函数求的是字符串的实际长度,它求得方法是从开始到遇到第一个’\0’,如果你只定义没有给它赋初值,这个结果是不定的,它会从aa首地址一直找下去,直到遇到’\0’停止。charaa[10];cout<charaa[10]={‘\0’};cout<charaa[10]=”jun”;cout<而sizeof()返回的是变量声明后所占的内存数,不是实际长…

    2022年4月13日
    61
  • 矩阵范数推导_向量范数怎么求

    矩阵范数推导_向量范数怎么求参考自:1999年08月清华大学出版社出版的施妙根的《科学和工程计算基础》。

    2022年9月19日
    2
  • python运维实战pdf_python运维实例.pdf[通俗易懂]

    python运维实战pdf_python运维实例.pdf[通俗易懂]python运维实例第一部分Part1基础篇■第1章系统基础信息模块详解■第2章业务服务监控详解■第3章定制业务质量报表详解■第4章Python与系统安全Chapter1第1章系统基础信息模块详解系统基础信息采集模块作为监控模块的重要组成部分,能够帮助运维人员了解当前系统的健康程度,同时也是衡量业务的服务质量的依据,比如系统资源吃紧,会直接影响业务的服务质…

    2022年7月12日
    15
  • 什么是重载什么是覆盖_java覆盖和重载的关系

    什么是重载什么是覆盖_java覆盖和重载的关系java中的方法重载发生在同一个类里面两个或者多个方法的方法名相同但是参数不同的情况。与此相对,方法覆盖是说子类重新定义了父类的方法。方法覆盖必须有相同的方法名,参数列表和返回类型。覆盖者可能不会限

    2022年8月2日
    6
  • 解决iframe参数过长无法加载问题小记

    解决iframe参数过长无法加载问题小记项目中用到了iframe,传参的时候使用的src属性,默认采用的get方式,此种方式在参数较长的时候就会报错(404无法找到资源),为了解决这种情况,改为采用post方式提交。解决方法:结合form表单,利用表单的post请求方式达到目的。实现方式 增加一个form表单的标签,method设置为post,target设置一个标识,假如target=”target1” 在iframe设置na…

    2022年7月12日
    38
  • document.documentElement.clientWidth

    document.documentElement.clientWidth关于获取各种浏览器可见窗口大小的一点点研究functiongetInfo(){vars=””;s=”网页可见区域宽:”document.body.clientWidth;s=”网页可见区域高:”document.body.clientHeight;s=”网页可见区域宽:”document.body.offsetWidth”(包括边线和滚动

    2022年7月22日
    13

发表回复

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

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