Java中的抽象类以及接口及应用

一、抽象类

类到对象是实例化,对象到类是抽象

 抽象类:

    1.什么是抽象类?

        类和类之间具有共同特征,将这些共同特征提取出来,形成抽象类。

类本身是不存在的,所以抽象类无法创建对象(无法实例化)。

    2.抽象类属于什么类型?

       抽象类也属于引用数据类型。

   3.抽象类怎么定义?

         【修饰符列表】 abstract class 类名{

            类体;

           }

   4.抽象类是无法实例化的,无法创建对象的,所以抽象类是用来被子类继承的,子类继承抽象类,子类可以实例化对象。

   5.final和abstract不能联合使用,这两个关键字是对立的。

   6.抽象类的子类可以是抽象类

   7.抽象类虽然无法实例化,但是抽象类有构造方法,这个构造方法是供子类使用的。

   8.抽象类关联到一个概念:抽象方法,什么是抽象方法呢?

         抽象方法表示没有实现的方法,没有方法体的方法。例如:

 public abstract void doSome();

         抽象方法的特点:

           1.没有方法体,以分号结尾

           2.前面修饰符列表中有abstract关键字。

     9.抽象类中不一定有抽象方法,抽象方法必须出现在抽象类中。

判断:java语言中凡是没有方法体的方法都是抽象方法?

   不对

      Object类中就有很多方法没有方法体,都是以“;"结尾的,但他们都不是抽象方法。

例如: public native int hashCode();

   这个方法调用C++写的动态链接库程序。前面修饰符列表中没有:abstract,有一个native,表示调用JVM本地程序。

抽象类:

   1.抽象类中不一定有抽象方法,抽象方法必须出现在抽象类中。

   2.重要结论:一个非抽象的类继承抽象类,必须将抽象类中的抽象方法实现了。这是java语法上强行规定的,必须的,不然编译器就报错了。

       这里的覆盖或者说重写,也可以叫做实现。(对抽象的实现)

 public class AbstractTest{

      public static void main(String[] args){

        //能不能使用多态?

        //父类型引用指向子类型对象

        Animal a = new Bird(); //向上转型。(自动类型转换)

        //这就是面向抽象编程

        //a的类型是Animal,Animal是抽象的

        //面向抽象编程,不要面向具体编程,降低程序的耦合度,提高程序的扩展力

        //这种面程符合OCP原则

        /*分析以下:

             编译的时候这个move()方法是谁的?

                     —编译的时候是Animal的

             运行的时候这个move()方法是谁的?

                    —运行的时候是Bird的

        a.move();

       }

 }

  //动物类(抽象类)

  abstract class Animal{

       //抽象方法

      public abstract void move();

   }

  

  //子类(非抽象类)

  //错误:Bird不是抽象的,并且未覆盖Animal中的抽象方法move()

  /*

  class Bird extends Animal{

  }

  */

  

  //如果Bird是抽象类的话,那么这个Animal中继承过来的抽象方法也可以不去重写/覆盖/实现

  abstract class Bird extends Animla{

  }

  

class Bird extends Animal{

     //需要将从父类中继承过来的抽象方法进行覆盖/重写,或者也可以叫做“实现”

    //把抽象的方法实现了

    public void move(){

    }

  }

  

  /*

    分析:

      Animal是父类,并且是抽象类。Animal这个抽象类中有一个抽象方法move.

      Bird是子类,并且是非抽象类。Bird继承Animal之后,会将抽象方法继承过来。

  */

二、接口

接口:

   1.接口也是一种“引用数据类型”,编译之后也是一个class字节码文件

   2.接口是完全抽象的。(抽象类是半抽象)或者也可以说接口是特殊的抽象类。

   3.接口怎么定义,语法是什么?

       【修饰符列表】 interface 接口名{}

   4.接口支持多继承,一个接口可以继承多个接口。

   5.接口中只包含两部分内容,一部分是:常量。一部分是:抽象方法。接口中没有其他内容了,只有以上两部分。

   6.接口中所有的元素都是public修饰的。(都是公开的)

   7.接口中的抽象方法定义时:public abstract可以省略。

   8.接口中的方法都是抽象方法,所以接口中的方法不能有方法体。

   9.接口中的常量的public static final可以省略。

  10.类和类之间叫做继承,类和接口之间叫做实现,仍然可以将“实现”看作"继承“。

继承使用extends关键字完成,实现使用implements关键字完成。

 11.结论:当一个非抽象的类实现接口的话,必须将接口中所有的抽象方法全部实现(覆盖,重写)

接口和接口之间支持多继承,那么一个类可以同时实现多个接口吗?

   对于计算机来说,一个机箱上有多个接口,一个接口是接键盘的,一个接口是接鼠标的,

一个接口是接电源的,一个接口是接显示器的……

   重点:一个类可以同时实现多个接口。

 这种机制弥补了java中的那个缺陷?

     java中类和类只支持单继承,实际上单继承是为了简单而出现的,现实世界中存在多继承,java中的接口弥补了单继承带来的缺陷。

接口A和接口B虽然没有继承关系,但是写代码的时候,可以互转。编译器没意见。但是运行时可能出现:

ClassCastException异常。

 之前的一个结论:

       无论是向上转型还是向下转型,两种类型之间必须要有继承关系,没有继承关系编译器会报错。(这个不适用接口方面)  

      最终实际上和之前还是一样,需要加:instanceof运算符进行判断

      向下转型养成好习惯。转型之前先if+instanceof进行判断

一个非抽象的类,实现接口的时候,必须将接口中所有方法加以实现。

接口中的方法不能有方法体。

继承和实现都存在的话,代码应该怎么写?

   extends 关键字在前

   implements 关键字在后

使用接口,写代码的时候,可以使用多态(父类型引用指向子类型对象)

三、接口在开发中的作用

接口在开发中的应用

    注意:接口在开发中的作用,类似于多态在开发中的作用

 多态:面向抽象编程,不要面向具体编程。降低程序的耦合度,提高程序的扩展力。

/*

  public class Master{

      public void feed(Dog d){ }

      public void feed(Cat c){ }

      //假设又要养其他动物,那么这个时候需要再加一个方法。(需要修改代码)

     //这样扩展力太差了,违背了OCP原则(对扩展开放,对修改关闭)

    }

}

*/

 public class Master{

    public void feed(Animal a){

    //面向Animal父类编程,父类是比子类更抽象的。

   //所以我们叫做面向抽象编程,不要面向具体编程。

  //这样程序的扩展力就强

  }

}

接口在开发中的作用?

    接口是完全抽象的。

    面向抽象编程可以修改为:面向接口编程

    有了接口就有了可插拔。可插拔表示扩展力很强,不是写死的。

   

 接口有什么用?

      扩展性好,可插拔。

 接口是一个抽象的概念

 分析:中午去饭馆吃饭,这个过程中有接口吗?

      接口是抽象的。

 菜单是一个接口。(菜单上有一个抽象的照片)

 谁面向接口调用。(顾客面向菜单点菜,调用接口。)

 谁负责实现这个接口。(后台的厨师负责把菜做好,是接口的实现者。)

 这个接口有什么用?

    这个饭馆的“菜单”,让“顾客”和“后厨”解耦合了。

   顾客不用找后厨了,后厨不用找顾客了。他们之间完全依靠这个抽象的菜单沟通。

面向接口编程,可以降低程序的耦合度,提高程序的扩展力。符合OCP开发原则。

接口的使用离不开多态机制。(接口+多态才可以达到降低耦合度。)

接口可以解耦合,解开的是谁和谁的耦合?

     任何一个接口都有调用者和实现者。

     接口可以将调用者和实现者解耦合。

     调用者面向接口调用。

     实现者面向接口编写实现。

 以后进行大项目的开发,一般都是将项目分离成一个模块一个模块的。

 模块和模块之间采用接口衔接。降低耦合度。

 

 

类型和类型之间的关系:

  is a(继承)    has a(关联)    like a(实现)

    is a :Cat is a Animal(猫是一个动物)

凡是能够满足is a的表示"继承关系"

A extends B

    has a : I has a Pen(我有一支笔)

凡是能够满足has a关系的表示“关联关系"

关联关系通常以”属性“的形式存在

 A{

       B b;

    }

   like a:Cooker like a FoodMenu(厨师像一个菜单一样)

凡是能够满足like a关系的表示”实现关系")

实现关系通常是:类实现接口

A implements B

抽象类和接口的区别

 

 抽象类是半抽象的

 接口是完全抽象的

 抽象类中有构造方法

 接口中没有构造方法

 接口和接口之间支持多继承

 类和类之间只能单继承

 一个类可以同时实现多个接口

 一个抽象类只能继承一个类(单继承)

 接口中只允许出现常量和抽象方法

 以后接口使用的比抽象类多,一般抽象类使用的比较少

 接口一般都是对“行为”的抽象

  

你可能感兴趣的:(java,开发语言)