要求设计一个方法,要求此方法可以接受A类的任意子类对象,并调用方法,此时,如果不使用对象多态性,那代码肯定会类似如下

  1. class A{                    // 定义类A
  2. public void Run1(){     // 定义Run1()方法
  3. System.out.println("A类----Run1方法") ;
  4. }
  5. public void Run2(){
  6. Run1() ;        // 调用父类的Run1()方法
  7. }
  8. }
  9. class B extends A{
  10. public void Run1(){     // 覆写父类中的Run1方法
  11. System.out.println("B类----Run1方法") ;
  12. }
  13. public void Run3(){     // B类特有的方法
  14. System.out.println("B类----Run3方法") ;
  15. }
  16. }
  17. class C extends A{
  18. public void Run1(){     // 覆写父类中的Run1方法
  19. System.out.println("C类----Run1方法") ;
  20. }
  21. public void Run5(){     // C类特有的方法
  22. System.out.println("C类----Run5方法") ;
  23. }
  24. }
  25. public class Demo6{
  26. public static void main(String asrgs[]){
  27. Run(new B()) ;  // 传递B类的实例    B b = new B();
  28. Run(new C()) ;  // 传递C类的实例    C c = new C();
  29. }
  30. public static void Run(B b){
  31. b.Run1() ;      // 调用覆写父类中的Run1()方法
  32. }
  33. public static void Run(C c){
  34. c.Run1() ;      // 调用覆写父类中的Run1()方法
  35. }
  36. }

复制代码

以代码虽然实现要求,但可以发现:如果按照如上方式完成程序,这就相当于产生了一个A类的子类时,Run()方法就要重载一次,则每一次扩充子类都要修改类本身,这样肯定不太好,那么如果使用对象多态性完成呢?具体代码如下

  1. class A{                    // 定义类A
  2. public void Run1(){     // 定义Run1()方法
  3. System.out.println("A类----Run1方法") ;
  4. }
  5. public void Run2(){
  6. Run1() ;        // 调用父类的Run1()方法
  7. }
  8. }
  9. class B extends A{
  10. public void Run1(){     // 覆写父类中的Run1方法
  11. System.out.println("B类----Run1方法") ;
  12. }
  13. public void Run3(){     // B类特有的方法
  14. System.out.println("B类----Run3方法") ;
  15. }
  16. }
  17. class C extends A{
  18. public void Run1(){     // 覆写父类中的Run1方法
  19. System.out.println("C类----Run1方法") ;
  20. }
  21. public void Run5(){     // C类特有的方法
  22. System.out.println("C类----Run5方法") ;
  23. }
  24. }
  25. public class Demo6{
  26. public static void main(String asrgs[]){
  27. Run(new B()) ;  // 传递B类的实例,产生向上转移
  28. Run(new C()) ;  // 传递C类的实例,产生向上转移
  29. }
  30. //接收父类对象
  31. public static void Run(A a){//相当于 A a = new B() & A a = new C()
  32. a.Run1() ;      // 调用覆写父类中的Run1()方法
  33. }
  34. }

复制代码

上代码中在Run()方法中使用了对象的多态性,所以可以接收任何子类的对象,这样无论子类如何增加,Run()方法都不用做任何的改变,因为发生了对象的向上转型关系后,调用的方法一定是被子类覆写过的方法。

AJPFX关于多态的应用的更多相关文章

  1. AJPFX关于多态中的动态绑定和静态绑定的总结

    在多态中:成员变量和静态方法编译和运行都看左边:成员方法编译看左边,运行看右边,这是为什么:在Java中存在两种绑定方式,一种为静态绑定,又称作早期绑定.另一种就是动态绑定,亦称为后期绑定1.静态绑定 ...

  2. AJPFX关于面向对象之封装,继承,多态 (上)

    Java是一种面向对象的语言,这是大家都知道的,他与那些像c语言等面向过程语言不同的是它本身所具有的面向对象的特性--封装,继承,多态,这也就是传说中的面向对象三大特性 一:从类和对象开始说起: Oo ...

  3. AJPFX关于面向对象之封装,继承,多态 (下)

    (3)private: 对于对于成员来说:只能在该成员隶属于的类中访问. 对于类来说:类不可以声明为private. 4)protected: 对于对于成员来说:相同包中的类可以访问(包访问权限):基 ...

  4. Java中的多态

    1.多态:具有表现多种形态的能力的特征 父类: public abstract class Animal {public abstract void Say();} 子类: public class ...

  5. C# 工厂模式+虚方法(接口、抽象方法)实现多态

    面向对象语言的三大特征之一就是多态,听起来多态比较抽象,简而言之就是同一行为针对不同对象得到不同的结果,同一对象,在不同的环境下得到不同的状态. 实例说明: 业务需求:实现一个打开文件的控制台程序的d ...

  6. C#非常重要基础之多态

    前几天看了一位同志的博客,写的是关于他自己去支付宝面试的经历.过程大体是这样的:问答的时候,前面部分,作者都应答如流,说起自己经验如何之丰富,最后面试官问了作者一个问题:请简述多态的概念和作用.结果这 ...

  7. C++多态详解

    多态是面向对象的程序设计的关键技术.多态:调用同一个函数名,可以根据需要但实现不同的功能.多态体现在两个方面,我们以前学过的编译时的多态性(函数重载)和现在我们这一章将要学习的运行时的多态性(虚函数) ...

  8. 【那些年关于java多态应用】

    1.多态:具有表现多种形态的能力的特征 父类: public abstract class Animal { public abstract void Say();} 子类: public class ...

  9. JAVA多态

    多态是指当系统A访问系统B的服务时,系统B可以通过多种方式来提供服务,而这一切对系统A是透明的.比如动物园的饲养员能够给各种各样的动物喂食.下图显示了饲养员Feeder,食物Food和动物Animal ...

随机推荐

  1. 【手记】小心在where中使用NEWID()的大坑 【手记】解决启动SQL Server Management Studio 17时报Cannot find one of more components...的问题 【C#】组件分享:FormDragger窗体拖拽器 【手记】注意BinaryWriter写string的小坑——会在string前加上长度前缀length-prefixed

    [手记]小心在where中使用NEWID()的大坑 这个表达式: ABS(CHECKSUM(NEWID())) % 3 --把GUID弄成正整数,然后取模 是随机返回0.1.2这三个数,不可能返回其它 ...

  2. [IT学习]阿铭Linux 微信公众号 每日一题 解析

    1.shell习题171020公布的昨日答案 习题171019 - 打印正方形 #!/bin/bash read -p "please input a number:" sum a ...

  3. vs2013发布网站提示 “未能将文件**复制到**”

    原因:年久失修,原来在项目中的一些文件给删掉或移除了 解决方法:打开.csproj文件(记事本打开),把提示的文件给删除掉.

  4. Hibernate 之 How

    分享自: http://blog.csdn.net/jnqqls/article/details/8242520 在上一篇文章Hibernate 之 Why? 中对Hibernate有了一个初步的了解 ...

  5. 一步一步学Silverlight 2系列(2):基本控件

    述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...

  6. 《Visual C++ 2010入门教程》系列二:安装、配置和首次使用VS2010

    作者:董波 日期:2010.6.15 写在前面 在我还在上学的时候,我选择了C++,最初我用VC6作为我的IDE,我看过很多本C++的教材,有的适合我,有的不适合我,其中有一本叫<Visual ...

  7. POJ - 1470 Closest Common Ancestors(离线Tarjan算法)

    1.输出测试用例中是最近公共祖先的节点,以及这个节点作为最近公共祖先的次数. 2.最近公共祖先,离线Tarjan算法 3. /* POJ 1470 给出一颗有向树,Q个查询 输出查询结果中每个点出现次 ...

  8. Ural2040:Palindromes and Super Abilities(离线&manecher算法)

    Dima adds letters s1, …, sn one by one to the end of a word. After each letter, he asks Misha to tel ...

  9. Spring事物注意事项

    一.尽量用注解声明事务 过去开发喜欢用tx:advice+aop命名空间方式来配置事务,一次配置对满足切点规则的方法永久生效.但也可能因此导致事务滥用,在不需要用到事务的地方用了会影响系统的并发性能. ...

  10. Gerrit2安装配置

    我主要根据下面这个文章而安装,遇到一些小问题,记录如下:2016.4.30 安装 2.12.2,要将加密的东东全装上!!!注意                      1) 由于新的git-bash ...