黑马程序员——多态和抽象类的相关知识

------android培训java培训、期待与您交流------

有一个多态的宠物案例

  多态的转型中(强制转),容易出现类型转换异常 ClassCastException,宠物的案例中,发生的原因,转型目标是Cat类,传递的参数不是Cat类型,而是Dog类型。

  Cat c = (Cat)a;  Animal a接收到的是Cat类型,接收到的是Dog类型,出现了转换异常,判断出这个a接收到的是什么类型,如果接收到的是Cat类型,强转成Cat,如果a接收到的是Dog类型,强转成Dog

 比较运算符instanceof关键字,运算结果是布尔类型,判断出一个引用型变量,是哪一种类型的格式:

       引用变量instanceof 

        a instanceof Cat 就可以判断出引用型变量a接收到的是不是Cat类型,如果是返回真,如果不是返回假。例如下面的小例子:

//宠物类共性抽取,形成一个父类

class Animal

{

         //共性方法eat

         public void eat(){}

}

 

 

//养猫,吃饭,抓老鼠

class Cat extends Animal

{

         public void eat(){

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

         }

 

         public void catchMouse(){

            System.out.println("抓老鼠");

         }

}

//养狗,吃饭,看家

class Dog extends Animal

{

         public void eat(){

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

         }

         public void lookHouse(){

           System.out.println("狗看家");

         }

}

//养鸟,吃饭,唱歌

class Bird extends Animal

{

   public void eat(){

            System.out.println("鸟吃虫子");

   }

   public void song(){

      System.out.println("鸟唱歌");

   }

}

class DuoTaiDemo

{

         public static void main(String[] args)

         {

                   eat(new Cat());        

                   eat(new Dog());

                   eat(new Bird());

         }

         /*

           定义一个方法

           方法中,封装了吃这个功能

           参数没有指定具体的动物,指定是这些动物的共性内容

           指挥具有共性的一个对象做事情

 

         */

         public static void eat(Animal a ){

              a.eat();

                   //调用cat特有方法,进行类型强转,提升为父类类型的cat转回cat自己

                   //判断a是不是接收到的Cat类型,是,在强转

                   if(a instanceof Cat ){

                     Cat c = (Cat)a;

                     c.catchMouse();

                   }

 

                    if(a instanceof Dog){

                     Dog d = (Dog)a;

                     d.lookHouse();

                   }

 

                    if(a instanceof Bird){

                      Bird b = (Bird)a;

                      b.song();

                   }

         }

}

多态的实现细节

多态中,引用变量调用方法和成员,运行的是谁

多态中,除非静态的方法以外,编译运行全看左边,只有非静态的成员方法,编译看左边,运行看右边

 

抽象方法:定义的方法中,没有方法体,没有大括号,抽象方法,不能调用!

标识出这个方法是抽象方法,使用关键字abstract(抽象)

抽象的方法,必须存在于抽象的类中,类也进行抽象的修饰

抽象类不能建立对象,不可以new 不能实例化

 

抽象类的使用需要定义子类继承抽象类,重写抽象类中的抽象方法,建立子类的对象

如果子类只重写了部分抽象方法,这个子类还是一个抽象类

 

abstract修饰符不能混用

  abstract final抽象方法,子类重写,加final,不能重写

  abstract static抽象方法,没有方法体,类名直接调用,不需要对象

  abstract private抽象方法,子类重写,私有后,子类不知道父类中有这个方法

 

接口概述

  接口:接口是一个特殊的抽象类,当一个抽象类中,方法全部都是抽象方法的时候,更贴切的名字,叫做接口

  定义接口上,不使用关键字class , 关键字interface接口名(类名)

  接口中的成员,都是固定格式

    成员变量: public static final 数据类型变量名 =;

    成员方法: public abstract 返回值类型方法名(参数列表..);

 接口的权限必须public

 

接口的使用

  抽象类,子类继承抽象类,重写抽象方法,建立子类对象

  接口,不能new ,无法实例化,由于接口中全部抽象方法,子类实现接口,重写接口中的全部抽象方法,建立子类对象

  如果子类只重写了部分抽象方法,子类还是一个抽象类

  实现的关键字 implements 

  类的实现格式  class A implements 接口名{

                    重写全部的抽象方法

                }

 A,叫做接口的实现类

 

接口的多实现

  类是单继承,一个类可以同时实现多个接口

  语法 class A implements 接口名,接口名{}类的多实现

  一个类在继承一个类的同时,可以实现多个接口

  多实现的好处:避免了单继承的局限性

 

接口之间的关系

 类与类之间是继承关系,类与接口是实现关系,接口与接口之间是继承关系

 接口之间支持多继承,一个接口可以同时继承多个接口

 

 作为实现类,全部实现整个继承下来的接口

 

接口中的特点:接口就是对外暴露的规则。还有就是接口就是程序的扩展。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值