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. PostgresSql开放局域网访问

    1) 确认已经退掉所有的MASF终端和MSF GUI,然后打开PostgresSQL的启动文件在文件POSTGRESQL_START参数后面添加-h 0.0.0.0,让PostgreSQL启动时绑定到 ...

  2. Linux基础※※※※访问Windows共享文件夹

    参考Linux公社链接:http://www.linuxidc.com/Linux/2014-06/103749.htm 实际上,可以直接用sambaclient程序访问共享资源. 列出共享主机的列表 ...

  3. kakfa源代码开发环境搭建过程中的错误处理

    在window上搭建kafka的源代码开发环境,主要参考如下的blog: http://www.bubuko.com/infodetail-695974.html    << Window ...

  4. Codeforces Round #198 (Div. 2)

    A.The Wall 题意:两个人粉刷墙壁,甲从粉刷标号为x,2x,3x...的小块乙粉刷标号为y,2y,3y...的小块问在某个区间内被重复粉刷的小块的个数. 分析:求出x和y的最小公倍数,然后做一 ...

  5. Nofollow

    今天整理一下SEO中经常用到的nofollow属性. nofollow它是HTML标签中的一个属性值,作用是告诉搜索引擎不要跟踪带有改属性值的链接, 用于指示搜索引擎不要追踪(即抓取)网页上的带有no ...

  6. MyEclipse + Tomcat 热部署问题

    myEclipse设置对应的tomcat时,只需要在jdk的Optional Java VM arguments中添加如下设置: -Xms256m -Xmx512m-Dcom.sun.manageme ...

  7. Docker-创建一个mysql容器,并保存为本地镜像

    查找docker hub上的镜像 [root@wls12c ~]$ docker search mysql NAME DESCRIPTION STARS OFFICIAL AUTOMATED mysq ...

  8. (十)Linux内核中的常用宏container_of

    Container_of在Linux内核中是一个常用的宏,用于从包含在某个结构中的指针获得结构本身的指针,通俗地讲就是通过结构体变量中某个成员的首地址进而获得整个结构体变量的首地址. Containe ...

  9. hdu 1005 简单题

    今早水出的第一道题,带着情绪做的,竟然1Y了,确实惊奇.这道简单的线性递推取模,直接递推是不行的,因为n的规模达到了100,000,000,要么超时要么超内存.可以用矩阵快速幂来搞,根据题意构建出对应 ...

  10. hdu 5713(状态压缩DP)

    要进行两次dp, 第一个,dp[i],1<=i<=(1<<n) 其中用i的二进制形式表示已选择的点. dp[i] 用来保存i中的点构成一个连通块,边集多少种可能. 转移方程: ...