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


相关推荐

  • 查看mysql日志命令_linux查看mysql安装路径

    查看mysql日志命令_linux查看mysql安装路径centos是linux吗_网站服务器运行维护centos是一个基于RedHatLinux提供的可自由使用源代码的企业级Linux发行版本,它是来自于RedHatEnterpriseLinux依照开放源代码规定释出的源代码所编译而成。Linux中MySQL日志在哪Linux中MySQL日志一般保存在/var/log/目录下,但还需要看具体的配置文件才能确定,具体方法如下:1、首先登陆…

    2022年10月14日
    1
  • 几种滤波算法,总结一下

    几种滤波算法,总结一下最近在做武术擂台,发现对于红外测距传感器的返回值速度很快,但是误差值很大,经过简单函数调校之后,发现还是有误差,有干扰数据,于是导入了math.h,进行的绝对值滤波,但是用循环暂存了十组数据,进行简单的加权算法,发现还是不行,于是去找了一些经典的滤波算法,算是简单记录一下。分享给大家。1、限幅滤波法(又称程序判断滤波法)A、方法:根据经验判断,确定两次采样允许…

    2022年5月1日
    38
  • 7、 正则化(Regularization)

    7、 正则化(Regularization)7.1过拟合的问题到现在为止,我们已经学习了几种不同的学习算法,包括线性回归和逻辑回归,它们能够有效地解决许多问题,但是当将它们应用到某些特定的机器学习应用时,会遇到过拟合(over-fittin

    2022年7月4日
    33
  • vuex的使用之mapGetters[通俗易懂]

    vuex的使用之mapGetters[通俗易懂]vue项目中,经常会使用到vuex,vuex是vue的一个状态管理。本文简单总结一下:vuex中mapGetters的使用。如果一个变量或对象需要在多个页面和组件中使用,那么,可以使用mapGetters。一.vuex中声明变量个方法1.在state中声明:state:{freeShipping:cookie.get(‘freeShipping’),}2.在mutations中书写方法:mutations:{updatefreeShipping(state,fre

    2022年5月20日
    117
  • C++按位异或运算符

    C++按位异或运算符参与运算的两个值,如果两个相应位相同,则结果为0,否则为1。即:0^0=0,1^0=1,0^1=1,1^1=0例如:10100001^00010001=101100000^0=0,0^1=10异或任何数=任何数1^0=1,1^1=01异或任何数-任何数取反 任何数异或自己=把自己置0(1)按位异或可以用来使某些特定的位翻转,如对数10100001的第2位和

    2022年5月20日
    50
  • Laravel 开发常用手册[通俗易懂]

    Laravel 开发常用手册[通俗易懂]分享8个Laravel模型时间戳使用技巧laravelapi文档Laravel项目开发规范LaravelWiki这个有时候比文档更好用//todo

    2022年8月3日
    6

发表回复

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

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