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 Duotai {
        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(a1.show(b));

a1.show(b):

1.先看引用变量a1的类型,为A,b是B的一个实例;

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

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

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

注:参数b是B的实例,B为A的子类,将参数b转换为a再找方法,在A中查找是否有B可以继承的方法show(A obj)

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

System.out.println(a1.show(c));

a1.show(c):

1,2,3同上

4.A中不存在方法show(B obj);继续步骤3,没有;继续步骤4,类A中有show(A obj);

5.同上
            System.out.println(a1.show(d));
            
            System.out.println(a2.show(b));

a2.show(b):

1,2,3同上

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

注: 将参数b转换为a

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

b.show(c):

1,2同上

3.B的父类A中是否有方法show(c obj),不存在;

4.B中是否有方法show(B obj),存在;

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

System.out.println(b.show(d));
        }
    }

实例二:

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三大特征之多态(三)

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

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

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

  3. Java的OOP三大特征之一——多态

    OOP(面对对象)三大特征之一——多态 What:多态性是指允许不同类的对象对同一消息作出响应,多态性包括参数化多态性和包含多态性,多态性语言具有灵活.抽象.行为共享.代码共享的优势,很好的解决了应用 ...

  4. JAVA三大特性之多态

    面向对象的三大特性:封装.继承.多态.从一定角度来看,封装和继承几乎都是为多态而准备的.这是我们最后一个概念,也是最重要的知识点. 多态的定义:指允许不同类的对象对同一消息做出响应.即同一消息可以根据 ...

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

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

  6. Java面试题,Java三大特性之一——多态的理解

    首先我们知道Java是一门面向对象的语言 面向对象三大特性,封装.继承.多态. 封装.继承.多态 ↓ 无论是学习路线,还是众人的口语习惯,都是按照这个这样进行排序,这是有原因的.因为封装好了才能继承, ...

  7. java中类的三大特征之多态

    Java 多态 同一种事物由于条件不同,展示出不同的结果,叫做多态. 父类的引用类型,由于使用不同的子类对象实例,而执行不同的操作. 多态存在的三个必要条件 1. 子类继承父类: 2. 子类重写父类方 ...

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

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

  9. 面向对象三大特征之多态——Java笔记(七)

    多态:     同一个实体同时具有多种形式     编译时的类型有声明该变量时使用的类型决定,运行时的类型有实际赋值给变量的对象决定     如果编译时类型和运行时类型不同,就出现多态 例: clas ...

随机推荐

  1. 请求webservice接口的某方法数据

    NSURL *url = [NSURL URLWithString:@"http://xxx.xxx.com/xxx/xxxxWS?wsdl"]; NSString *soapMs ...

  2. python_way day12 sqlalchemy,原生mysql命令

    python_way day12  sqlalchemy,mysql原生命令 1.sqlalchemy 2.mysql 原生命令 一,sqlalchemy SQLAlchemy本身无法操作数据库,其必 ...

  3. XAF学习笔记之 Upcasting

    通常,我们会定义继承层次结构,假设有类型,CustomerBase,CustomerTrialed,CustomerRegistered三个类型,并且继承结构如下: 业务对象代码定义如下: using ...

  4. 整理的一些常用的CSS HACK

     ie8以下兼容透明都和支持CSS圆角,这两个都要在服务器上才看到效果,可以本地搭建一个服务器如IIS -pie-background: rgba(255, 255, 255, 0.10);/*IE6 ...

  5. spring集成quartz scheduler

    创建项目 有两种创建quart配置作业 1.使用MethodInvokingJobDetailFactoryBean  Quartz Scheduler 配置作业(MethodInvokingJobD ...

  6. [转载] 深入 nginx 架构

    原文: http://www.cnbeta.com/articles/402709.htm 了解 nginx 架构帮助我们学习如何开发高性能 web 服务. 为了更好地理解设计,你需要了解NGINX是 ...

  7. 设计js通用库

    设计js通用库的四个步骤: 1.需求分析:分析库需要完成的所有功能. 2.编程接口:根据需求设计需要用到的接口及参数.返回值. 3.调用方法:支持链式调用,我们期望以动词方式描述接口. (ps:设计链 ...

  8. Object Pascal 过程与函数

    过程与函数 过程与函数是实现一定功能的语句块,是程序中的特定功能单元.可以在程序的其他地方被调用,也可以进行递归调用.过程与函数的区别在于过程没有返回值,而函数有返回值. 1.过程与函数的定义 过程与 ...

  9. Android Contacts (android通讯录读取)-content provider

    Content Provider 在数据处理中,Android通常使用Content Provider的方式.Content Provider使用Uri实例作为句柄的数据封装的,很方便地访问地进行数据 ...

  10. you don't have permission to view it 解决

    the file couldn't be opened because you don't have permission to view it   简单设置下面的选项即可,不要谢我啊! change ...