什么是多态

多态是一个对象的多种实现,是建立在继承的基础上的,即对象“人”,有老师和学生不同的实现,其实总结起来就是允许将子类类型的指针赋值给父类类型的指针。

多态的发生条件

多态发生的前提是:1. 要有继承发生; 2. 要有方法的重写; 3. 要有父类引用指向子类对象。

多态中成员的访问特点

一个类中有成员变量,构造方法,成员方法和静态方法,那在多态中这些成员的访问特点是如何的呢,下面通过代码来总结下。

/*** Created by lili on 15/10/21.*/

classPerson {

String name= "person name";publicPerson() {

System.out.println("person construct");

}public voidshow() {

System.out.println("person show!");

}public static voidplay() {

System.out.println("person play");

}

}class Student extendsPerson {

String name= "Student name";

String nickName= "young boy";publicStudent() {

System.out.println("student construct");

}public voidshow() {

System.out.println("student show!");

}public static voidplay() {

System.out.println("student play");

}public voidstudy() {

System.out.println("student study");

}

}public classPolymorphismTest {public static voidmain(String[] args) {

Person person= newStudent();

System.out.println("***********************************");

System.out.println(person.name);

System.out.println("***********************************");

person.show();

System.out.println("***********************************");

person.play();//System.out.println("***********************************");//person.study();//编译报错,找不到符号//System.out.println(person.nickName);//编译报错,找不到符号

}

}

运行结果如下:

person construct

student construct***********************************person name***********************************student show!

***********************************person play

Process finished with exit code0

对结果进行解释和总结

1. 成员变量

编译看左边,运行看左边。

如果在父类引用总访问子类特有的成员变量则编译报错,例如System.out.println(person.nickName);//编译报错,找不到符号

子类和父类都有的,即子类继承的,不管对子类的成员变量如何做变化,最后显示的该成员变量的结果都是对父类成员变量操作后的结果。

2. 构造方法

这个是继承中的知识,是分层次初始化的,调用默认构造初始化,即虽然是new的Student,但是是先初始化Person,再初始化Student,所以打印顺序是:

person construct

student construct

3. 成员方法

编译看左边,运行看右边。

编译的时候只能调用父类有的成员方法,调用子类特有的成员方法则报错,这是多态的弊端,不能通过分类引用调用子类非继承成员方法。但是可以向下转型实            现这个功能,下文讲述。

运行的时候,由于成员方法重写了,所以运行子类中的该方法的具体实现,这点很有意思!所以person.show()最后打印结果是student show;

4. 静态方法

编译看左边,运行看左边。

静态和类相关,算不上重写,所以,访问还是左边的

多态的好处

多态的好处在于简化了代码,提供了很好的可扩充性。例如有一个“形状”对象,目前有“圆形”,“长方形”,“正方形”三种实现,在画图的测试方法中,方法的传递参数可以是“形状”类型,你传进来的可以是“圆形”,“长方形”,“正方形”对象,最后调用“形状”来画图,执行的是不同对象的画图方法。如果没有多态,则每个对象都需要专门写一个测试方法来测试,而现在只需要一个了。

如何访问多态中子类特有成员方法和成员变量:多态中的向下转型和向上转型

对于子类中的非继承自父类的特有方法和成员变量,例如student中的play方法,肯定有用的,但是如何调用呢?在这里就需要用到向下转型,把父类的引用利用强制类型转换给子类,然后通过这个子类引用去调用。示例程序如下:

/*** Created by lili on 15/10/21.*/

classPerson {

String name= "person name";publicPerson() {

System.out.println("person construct");

}public voidshow() {

System.out.println("person show!");

}public static voidplay() {

System.out.println("person play");

}

}class Student extendsPerson {

String name= "Student name";

String nickName= "young boy";publicStudent() {super.name = "student modified name";

System.out.println("student construct");

}public voidshow() {

System.out.println("student show!");

}public static voidplay() {

System.out.println("student play");

}public voidstudy() {

System.out.println("student study");

}

}class Teacher extendsPerson{

}public classPolymorphismTest {public static voidmain(String[] args) {

Person person= newStudent();

Student student=(Student)person;

student.study();

Teacher teacher= (Teacher)person;

teacher.show();//System.out.println(person.nickName);//编译报错,找不到符号

}

}

运行结果:

person construct

student construct

student study

Exception in thread"main" java.lang.ClassCastException: Student cannot be cast to Teacher

at PolymorphismTest.main(PolymorphismTest.java:54)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:497)

at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)

Process finished with exit code1

向下转型的特点

1. 需要用到强制类型转换,将父类强制转型为子类,但是父类指向的对象必须是该子类实例化对象。

2. 向下转型为父类引用指向子类对象相同的引用,可以实现子类特有方法和成员变量的访问。

向上转型的特点

1. 发生在传参或者new子类对象给父类引用的过程中

多态一个有趣的例子

/*** Created by lili on 15/10/21.*/

classPerson {public voidshow() {

play();

}public voidplay() {

System.out.println("person play");

}

}class Student extendsPerson {public voidplay() {

System.out.println("student play");

}

}class Monitor extendsStudent{public voidshow() {super.show();

}public voidplay() {

System.out.println("Monitor play");

}

}public classPolymorphismTest {public static voidmain(String[] args) {

Person person= newStudent();

person.show();//student中没有重写show,所以调用的是person的show()方法,但是show中调用play在student中有重写,所以最后打印student play

System.out.println("------------------");

Student student=(Student) person;

student.show();

System.out.println("------------------");

student= newMonitor();

student.show();//monitor中有重写show,所以调用student.show()方法时(student中的show是继承自person),由于monitor有继承,调用monitor

//的show()方法,但是monitor中show方法是调用super.show(),super中的show是调用play,最后还是打印Monitor的play

}

}

运行结果:

student play------------------student play------------------Monitor play

Process finished with exit code0

java多态app_【Java基础】Java中的多态相关推荐

  1. java中多态到底是什么_java中的多态是指什么

    java中的多态是指什么 发布时间:2020-06-28 09:59:19 来源:亿速云 阅读:119 作者:Leah java中的多态是指什么?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希 ...

  2. java无限循环小数_java基础——java无限循环小数判定问题以及BigDecimal详解

    java基础--java无限循环小数判定问题以及BigDecimal详解 rtk   jmp   目录   big   get   无限循环   style   无限 罢谮烈糜讼市智猩昧锥父兹登htt ...

  3. core java作者_coreJava_Day2(基础Java学习第二天)

    目标: 1. 标识符.关键字和类型介绍 2. 如何构建类 1.java代码中的注释 作用:使部分内容只为程序员可见,不为编译器所编译.虚拟机所执行 位置:类声明前后.方法声明前后.属性声明前后.方法体 ...

  4. java的多态是什么意思_Java中的多态是什么?

    不同的行为特征.而造成这一现象的原因在于Java中的变量有两个类型: 编译时类型,由声明变量时的类型决定. 运行时类型,由实际赋值给变量的对象的类型决定,当一个变量的两个类型不一致,就会出现多态. / ...

  5. java 参数返回_Java基础---Java中带参数返回值方法的使用(四十)

    Java 中带参带返回值方法的使用 如果方法既包含参数,又带有返回值,我们称为带参带返回值的方法. 例如:下面的代码,定义了一个 show 方法,带有一个参数 name ,方法执行后返回一个 Stri ...

  6. java replaceall函数_java基础—-String中replace和replaceAll方法

    这里面我们分析一下replace与replaceAll方法的差异以及原理. replace各个方法的定义 一.replaceFirst方法 public String replaceFirst(Str ...

  7. java hashmap 的api_JAVA基础--JAVA API集合框架(ArrayList、HashSet、HashMap使用)

    一.集合Collection 1. 集合介绍 变量:表示的内存中的一个空间,只能保存确定类型的单个数据 数组:表示的是内存中的多个连续的空间,这些空间中可以存储多个同类型的数据. 后期继续学习面向对象 ...

  8. java 泛型参数_[基础]-Java泛型

    一.概述 Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型. 泛型的本质是参数化类型,也就是说所操作的 ...

  9. java抽象类 抽象方法_Java基础 -- Java 抽象类 抽象方法

    总结: 1. 抽象类不能被实例化(初学者很容易犯的错),如果被实例化,就会报错,编译无法通过.只有抽象类的非抽象子类可以创建对象. 2. 抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类. ...

  10. Java回炉之语言基础

    Java回炉之语言基础 Java回炉之语言基础 DOS命令 java编译过程 path和classpath的区别 关键字表 数据类型 位运算 算数优先级 内存划分 类的初始化过程 static关键字特 ...

最新文章

  1. 使用VC 2010制作和使用静态库
  2. 使用dwz框架配合MVC使用
  3. Kafka 孕育开源 KarelDB
  4. Pytest入门【2】
  5. eq相等,smarty 比较操作符!时间戳
  6. 极光推送小结 - iOS
  7. 移动端API接口优化的术和结果
  8. atitit 板块分类 上市公司 龙头企业公司 列表 attilax总结.docx
  9. Android studio基础练习02【监听器实现下拉菜单】
  10. 【转载】Android 第三方ROM定制之适配谷歌Play Store
  11. ArcHydroTools 10.5版本的安装与使用(附下载链接与教程)
  12. 计算机sci四区论文,sci四区发表论文是什么水平
  13. JS正则验证输入框姓名只能输入中文和英文
  14. 开发Enterprise JavaBeans
  15. DVWA——XSS(Reflected)——多种方法实现+详细步骤图解+获取cookie的利用过程演示
  16. DX11 游戏开发笔记 (二) DX11 基础框架三角形 下
  17. MATLBA基础图像处理算法之四叉树分割法
  18. 安卓开发学习之TCP通信
  19. Linux安装和使用
  20. C4D模型工具—线性切割

热门文章

  1. 传感器的使用_手柄_3、ros使用罗技f710无线控制手柄
  2. “机器学习实战“刻意练习2/8周
  3. ukulele弹奏模拟器v1.0(待完善)
  4. win10查看电脑开机时长
  5. css与mdx,mdx、mdd及css三者关系以及欧路中应如何安装css
  6. 如何注册微信个人公众号,教程来啦!怎样注册微信个人公众订阅号
  7. mysql常见函数面试题_MySql三到常见面试题,整理总结一下
  8. 纪念特洛伊英雄 Sinon - SAP UI5 Mock Server 使用步骤和工作原理介绍
  9. 使用 Git 添加文件时,出现 Warning: LF will be replaced by CRLF in...提示及解决方案
  10. Chrome 神器面世!谷歌学术搜文章,代码链接自动展示