多态

多态简介

多态就是事物存在的多种形态,比如你在大街上看见一只藏獒,你可以说这只藏獒真凶猛,也可以说这只狗真凶猛,还可以说这个动物真凶猛,以上三种说法其实都是指的这只藏獒。

在Java里面,也是存在多态的,只要全部符合下面这三种情况,就是多态

        有继承

        有方法重写

        有父类引用指向子类对象

例如下面代码就构成多态、


定义一个Animal类

public class Animal{

    int num = 10;

    publicvoideat(){

        System.out.println("动物在吃!");

    }

}


定义一个Cat类继承Animal

public class Cat extends Animal{

    int num = 20;

    //重写    publicvoideat(){

        System.out.println("猫吃猫粮");

    }

    //Cat特有的方法.    

    public void move(){

        System.out.println("猫走路很轻盈!");

    }

}

定义一个Dog类继承Animal

public class     DogextendsAnimal{

    //重写    

public void eat(){

        System.out.println("狗啃骨头!");

    }

}

上面的三个类里面已经有继承和方法重写了,那么父类引用指向子类对象是什么?请看下面这段代码:

定义一个测试类

public class AnimalTest01{

    publicstaticvoidmain(String[] args){

        Cat c1 = new Cat();

        c1.eat();

        Animal a1 = new Cat();//父类引用指向子类对象        

        a1.eat();

        System.out.println(a1.num);//因为成员变量不存在重写,所以结果是10    }

}

静态绑定和动态绑定

上面代码中,a1是Animal类型的一个引用,指向的是其子类Cat的对象,这个就叫做父类引用指向子类对象。程序在编译的时候a1被看做Animal类型,所以a1.eat()绑定的是Animal类中的eat()方法,这叫做静态绑定,程序运行时,a1指向的是堆中的Cat对象,而在Cat中对eat()方法进行了重写,所以在运行阶段绑定的是Cat中的eat()方法,这叫做动态绑定

强制类型转换

上面代码中子类向父类型进行转换,是自动类型转换,也叫做向上转型。还有一种情况是父类向子类型转换,是强制类型转换,也叫向下转型。下面的代码演示了强制类型转换

public class AnimalTest01{

    publicstaticvoidmain(String[] args){

        Animal a1 = new Cat();//父类引用指向子类对象        

//如果要是想执行Cat里面的move方法该怎么办?      

  //只能强制类型转换,需要加强制类型转换符       

     Cat c1 = (Cat)a1;

        c1.move();

        Animal a2 = new Dog(); //向上转型.      

  //强制类型转换        

//Cat c2 = (Cat)a2; //会报错 java.lang.ClassCastException   

 }

}


instanceof关键字

上面的代码里面将一个指向Dog对象的Animal引用a2进行强制转换成Cat类型时报出了ClassCastException类转型错误,开发中要是想避免这种错误需要使用instanceof来判断一下。

public classAnimalTest01{

    publicstaticvoidmain(String[] args){

        Animal a1 = new Cat();//父类引用指向子类对象        

//如果要是想执行Cat里面的move方法该怎么办?        

//只能强制类型转换,需要加强制类型转换符        Cat c1 = (Cat)a1;

        c1.move();

        Animal a2 = new Dog(); //向上转型.        

//进行强制类型转换时,需要先使用instanceof进行判断,避免ClassCastException        

if(a2 instanceof Cat){

            //强制类型转换            

            Cat c2 = (Cat)a2;

        }

    }   

}


多态的优点

        提高了程序的扩展性

        降低了代码之间的耦合

请看下面示例:

新建一个Car类

class Car{

    publicvoidrun(){

        System.out.println("汽车在跑");

    }

}


创建一个Benz类继承Car

classBenzextendsCar{

    publicvoidrun(){

        System.out.println("奔驰汽车在跑");

    }

}


创建一个BMW类继承Car

classBMWextendsCar{

    publicvoidrun(){

        System.out.println("宝马汽车在跑");

    }

}

创建一个Person类用来开车

class Person {

    /*

    public void drive(Benz bc){

        bc.run();

    }

    奔驰汽车坏了,再重新创建一个开宝马汽车的方法

    public void drive(BMW bm){

        bm.run();

    }

    */    

//上面代码扩展性太差,每新增加一种品牌的汽车就需要再写一个方法    //将参数修改为Car类型,这样不论增加什么样的品牌汽车,都可以调用这个方法   

 publicvoiddrive(Car c){

        c.run();

    }

}


创建一个测试类

public class Test01 {

    publicstaticvoidmain(String[] args){

        Person james = new Person();

        Benz bc = new Benz();

        james.drive(bc);

        BMW bm = new BMW();   

        james.drive(bm);

    }

}


在工作当中尽量面向抽象编程,不要面向具体编程。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,372评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,368评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,415评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,157评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,171评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,125评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,028评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,887评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,310评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,533评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,690评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,411评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,004评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,812评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,693评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,577评论 2 353

推荐阅读更多精彩内容