当前位置: 首页 > news >正文

Java多态

1.基于继承
覆盖

子类覆盖父类的方法,实现多态

抽象

子类实现父类的抽象方法,实现多态

2.基于接口

3.案例

摘自http://www.cnblogs.com/chenss...

public class A {
    public String show(D obj) {
        return ("A and D");
    }

    public String show(A obj) {
        return ("A and A");
    } 
}

public class B extends A{
    public String show(B obj){
        return ("B and B");
    }
    
    public String show(A obj){
        return ("B and A");
    } 
}

public class C extends B {

}

public class D extends B {

}

public class Test {
    public static void main(String[] args) {
        A a1 = new A();
        A a2 = new B();
        B b = new B();
        C c = new C();
        D d = new D();
        
        System.out.println("1--" + a1.show(b));
        System.out.println("2--" + a1.show(c));
        System.out.println("3--" + a1.show(d));
        System.out.println("4--" + a2.show(b));
        System.out.println("5--" + a2.show(c));
        System.out.println("6--" + a2.show(d));
        System.out.println("7--" + b.show(b));
        System.out.println("8--" + b.show(c));
        System.out.println("9--" + b.show(d));
    }
}

运行结果:

1--A and A
2--A and A
3--A and D
4--B and A
5--B and A
6--A and D
7--B and B
8--B and B
9--A and D

我来理解下4、5和9:

a2.show(b)

A a2 = new B();a2.show(b);
调用的是a2的方法,因为a2向上转型为A,那么show只能调用类A的方法,A里有参数为A和D两种,所以a2.show(b)对应于A.show(B)对应于A.show(A),由于多态性,最终调用的是B.show(A)即B and A。

a2.show(c)

A a2 = new B();a2.show(c);
调用的是a2的方法,因为a2向上转型为A,那么show只能调用类A的方法,A里参数有A和D两种,所以a2.show(b)对应于A.show(C)对应于A.show(B)对应于A.show(A),由于多态性,最终调用的是B.show(A)即B and A.

b.show(d)

B b = new B();D d = new D();b.show(d);
由于B是A的子类,那么B可以继承A的所有非private方法,当然A的show(D)也在内,所以,就直接调用的是A.show(D)即A and D.

相关文章:

  • Anaconda使用总结 - Python - 伯乐在线
  • 数据库基础积累
  • Device Mutipath参数设置
  • zookeeper集群的搭建
  • 《Java从小白到大牛精简版》之第2章 开发环境搭建
  • 面向未来十年的物联网设备安全评估方法集合
  • Java排序之直接插入排序、希尔排序、冒泡排序、快速排序(持续更新)
  • 1-SDK开发初探-8266
  • Tornado异步阻塞解决方案
  • Ansible
  • Windows10 UWP开发 - 响应式设计
  • Hbase万亿级存储性能优化总结
  • linux 查看用户常用命令
  • RESTful API 设计指南
  • mysql 存储过程中使用游标中使用临时表可以替代数组效果
  • 【RocksDB】TransactionDB源码分析
  • Java,console输出实时的转向GUI textbox
  • Java面向对象及其三大特征
  • mysql 5.6 原生Online DDL解析
  • PHP的Ev教程三(Periodic watcher)
  • Spring框架之我见(三)——IOC、AOP
  • 成为一名优秀的Developer的书单
  • 缓存与缓冲
  •  一套莫尔斯电报听写、翻译系统
  • 因为阿里,他们成了“杭漂”
  • No resource identifier found for attribute,RxJava之zip操作符
  • 阿里云ACE认证学习知识点梳理
  • 说说我为什么看好Spring Cloud Alibaba
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • #pragma pack(1)
  • (5)STL算法之复制
  • (6)设计一个TimeMap
  • (二)构建dubbo分布式平台-平台功能导图
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (十五)devops持续集成开发——jenkins流水线构建策略配置及触发器的使用
  • (原創) 系統分析和系統設計有什麼差別? (OO)
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • (转)为C# Windows服务添加安装程序
  • (轉)JSON.stringify 语法实例讲解
  • .net framework 4.0中如何 输出 form 的name属性。
  • .Net IOC框架入门之一 Unity
  • .net 桌面开发 运行一阵子就自动关闭_聊城旋转门家用价格大约是多少,全自动旋转门,期待合作...
  • .Net6使用WebSocket与前端进行通信
  • /etc/sudoers (root权限管理)
  • @AliasFor注解
  • @angular/cli项目构建--Dynamic.Form
  • @selector(..)警告提示
  • [ vulhub漏洞复现篇 ] JBOSS AS 5.x/6.x反序列化远程代码执行漏洞CVE-2017-12149
  • [20171106]配置客户端连接注意.txt
  • [BZOJ 4129]Haruna’s Breakfast(树上带修改莫队)
  • [BZOJ 4598][Sdoi2016]模式字符串
  • [C++从入门到精通] 14.虚函数、纯虚函数和虚析构(virtual)