1.定义

允许不同类的对象对同一消息做出响应,即同一消息可以根据发送对象的不同而采用多种不同的行为方式。

2.存在条件

2.1存在继承关系

2.2子类重写了父类方法

2.3父类类型的变量指向子类对象的引用(向上转型)

3.实现方式

3.1接口实现

3.2继承父类进行方法重写

3.3同一个类中进行方法重载

4.类型的强制转换

4.1转换格式:子类  新变量=(子类)变量(父类类型的引用变量指向子类对象)

4.2父类类型的变量可以转换成子类类型的变量,但是可能出现“类型转换异常”

4.3使用x instance A判断异常,要求x所属的类B与类A为父子关系:结果为true,不抛出异常

5.实例分析

实例一:

 class A {
public String show(A obj) {
return ("A and A");
}
public String show(D obj) { //方法的重载
return ("A and D");
}
} class B extends A {
public String show(B obj) { //方法的重载
return ("B and B");
}
public String show(A obj) { //方法的重写
return ("B and A");
}
} class C extends B {
} class D extends B {
} public class Polymorphic {
public static void main(String[] args) {
A a1 = new A();
B b = new B();
C c = new C();
D d = new D();
//多态:父类类型的变量指向子类对象的引用
A a2 = new B(); //多态的表现形式:相同类型的变量,调用相同的方法,产生不一样的结果。
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

详细说明:

当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,

但是这个被调用的方法必须是在超类中定义过的,也就是被子类覆盖的方法。方法的调用关系如下:

  • this.method(O)                                 // 该类自身的方法
  • super.method(O)                             // 基类的方法
  • this.method((super)O)                     // 该类自身的方法,参数向上转型
  • super.method((super)O)                 // 基类的方法,参数向上转型

示例讲解:

a1.show(b):

1.a1是类型为A的引用变量,该变量指向A对象,b是B的一个实例;

2.在类A中查看是否存在show(B obj)方法,不存在;

3.查看类A是否存在超类(父类),不存在;

4.查看类A是否存在show(A obj)方法,存在;

注:(super) O即(super) B,即为A,则对应的方法为show(A obj));

5.a1是对本身对象的引用,不考虑方法的重写,答案为 A and A。

注:第1步是分析,第2-4步分别对应上面的this.show(O),super.show(O),this.show((super) O) 

a1.show(c):

1.a1是类型为A的引用变量,该变量指向A对象,c是C的一个实例;

2.查看类A是否存在show(C obj)方法,不存在;

3.查看类A是否存在超类(父类),不存在;

4.查看类A是否存在show(B obj)方法,不存在;

5.查看类A是否存在超类(父类),不存在;

6.查看类A是否存在show(A obj)方法,存在;

7.a1是对本身对象的引用,不考虑方法的重写,答案为 A and A。

a2.show(b):

1.a2是类型为A的引用变量,该变量指向A对象,b是B的一个实例;

2.查看类A是否存在show(B obj)方法,不存在;

3.查看类A是否存在超类(父类),不存在;

4.查看类A是否有show(A obj)方法,存在;

5.a2是对子类B对象的引用,考虑方法的重写,在子类B中对类A的show(A obj)进行了重写,所以答案为B and A。

b.show(c):

1.b是类型为B的引用变量,该变量指向B对象,c是C的一个实例;

2.查看类B是否存在show(C obj)方法,不存在;

3.查看类A是否存在show(C obj)方法,不存在;

4.查看类B是否存在show(B obj)方法,存在;

5.b是对本身对象的引用,不考虑方法的重写,答案为B and B。

实例二:

 public class Person {
public void walk(){
System.out.println("走路");
}
}
public class Man extends Person{
public void walk(){
System.out.println("男人快步走");
}
public void work(){
System.out.println("男人是个工作狂");
}
} public class Woman extends Person{
public void walk(){
System.out.println("女人漫步走");
}
public void shopping(){
System.out.println("女人是个购物狂");
}
}
public class Test {
public static void main(String args[]){
Person p1=new Person(); //多态:父类类型的变量指向子类对象的引用
Person p2=new Man();
Person p3=new Woman(); //多态的表现形式:相同类型的变量,调用相同的方法,产生不一样的结果。
p1.walk();
虚拟方法调用:当父类的方法被子类重写时,会调用子类重写的方法,而不是父类的方法。
p2.walk();
p3.walk(); 在多态的情况下,只能调用父类的方法和被子类重写的方法;如果向调用子类的方法,需要进行类型的前置转换
// p2.work(); 错误 Man m=(Man) p2;
m.work();
Woman w=(Woman) p3;
w.shopping(); 父类类型的变量可以转换成子类类型的变量,但是可能出现“类型转换异常”。
/*Woman w=(Woman) p2;
w.shopping();*/ /*instanceof操作符
x instance A,要求x所属的类B与类A为父子关系
instanceof可以检测是否会抛出类型转换异常,返回true表示可以转换类型*/
System.out.println(p2 instanceof Man);
}
}

!!!

Java三大特征--多态的更多相关文章

  1. Java三大特征之继承(二)

    在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句 ...

  2. Python面向对象初始(三大特征,多态,继承,封装)

    Python面向对象的初始 面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优点是:极大的降低了写程序的 ...

  3. java三大特性--多态(1)

    定义 对象具有多种形态 类型 引用的多态: 父类的引用指向自身对象 父类的引用指向子类对象 TrafficTool traffictool=new TrafficTool();//父类的引用指向本身类 ...

  4. Java三大特征之多态(三)

    面向对象编程有三大特性:封装.继承.多态. 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据.对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法. 继承 ...

  5. 【java基础】面向对象的三大特征---多态

    java的引用变量有两种类型,编译时类型和运行时类型,如果编译时类型和运行时类型不一致,就会出现多态. 多态分为: 运行时多态 java运行时系统根据调用该方法的实例的类型来决定选择调用哪个方法则被称 ...

  6. Java三大特征:封装 继承 多态

    内部类:成员内部类.静态内部类.方法内部类.匿名内部类. 内部类:定义在另外一个类里面的类,与之对应,包含内部类的外部类被称为外部类. 内部类的作用:(1)内部类提供了更好的封装,可以把内部类隐藏在外 ...

  7. Java三大特征之------多态

    1.定义 指允许不同类的对象对同一消息做出响应.即同一消息可以根据发送对象的不同而采用多种不同的行为方式. 2.存在条件 2.1存在父子关系 2.2子类中存在重写方法 2.3父类类型的变量指向子类对象 ...

  8. Java 三大特征之--多态

    http://www.cnblogs.com/chenssy/p/3372798.html

  9. 三、java三大特性--多态

    面向对象编程有三大特性:封装.继承.多态. 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据.对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法. 继承 ...

随机推荐

  1. 轻松搭建CAS 5.x系列(7)-在CAS Server使用第三方帐号做认证

    概述说明 CAS除了使用自身数据库配置的帐号体系外,也可以使用第三方帐号来做认证. 比如实现如下类似的红色标注部分的登录效果: CAS自带了Facebook.GitHub.WordPress和CAS的 ...

  2. Java CountingSort

    Java CountingSort /** * <html> * <body> * <P> Copyright 1994-2018 JasonInternation ...

  3. .htaccess 转 SAE AppConfig

    新浪的SAE不支持 htaccess,但是他们开发了 AppConfig,可以完全代替 htaccess 的常见功能,AppConfig采用类自然语言的规则描述,还是很人性化的. 这里来写一个短网址的 ...

  4. 前端开发 Vue -0前言

    Vue2.0 新手完全填坑攻略——从环境搭建到发布 Vue2 入门,读这篇就够了 Jinkey原创感谢 showonne.yubang 技术指导Demo 地址:http://demo.jinkey.i ...

  5. Asp.Net Core 轻松学系列-1阅读指引目录

    https://www.cnblogs.com/viter/p/10474091.html 目录 前言 1. 从安装到配置 2. 业务实现 3. 日志 4. 测试 5. 缓存使用 6.网络和通讯 7. ...

  6. CSS3实现瀑布流布局

    讲干货,不啰嗦,瀑布流布局是种常见的布局方式,常用于图片相关的样式展示,通过CSS3的多列(Multi-column)属性,可以简单的实现类似效果. 具体步骤: 1.设置外部容器多列列数(column ...

  7. 微服务、SOA、ESB比较

    很多时候会听到微服务.SOA.ESB之间有着联系也有着区别,有时候了解了一下,过段时间有混肴模糊了今天看了一篇文章写的很好,特地记录一下. 原文地址:https://mp.weixin.qq.com/ ...

  8. django的信号应用

    问题? 比如说我们在操作数据库的时候,要在插入数据之前写入日志,插入完成之后也写入日志,那这个就会用到我们今天的django信号. 也许你会想到,函数装饰器的有这样的功能.其实不用那个,django的 ...

  9. Oracle 安装步骤

    目录 Oracle 安装步骤 一.安装流程 二.登录流程 三.新建数据库 四.图形化连接 Oracle 安装步骤 一.安装流程 解压oracle 11g两个压缩文件 点击安装,修改目录,新建一个文件夹 ...

  10. Codeforces 567C - Geometric Progression - [map维护]

    题目链接:https://codeforces.com/problemset/problem/567/C 题意: 给出长度为 $n$ 的序列 $a[1:n]$,给出公比 $k$,要求你个给出该序列中, ...