首页 > 代码库 > [Java]接口和抽象类

[Java]接口和抽象类

0.0 为什么会有接口和抽象类

        假设一个任务:要写一个公司员工管理的软件。如果这个公司所有的人都是普通员工,没有任何职位和岗位区别,那就定义一个职工类即可。

        

 class employee{        private  String name;      private  int      age;      private Sting   address;      public String getAddress(){                return this.address;      }     }

      这就是一个具体类。

      现在问题来了,公司有不同等级的不同部门的员工,按照常理,直接继承这个类即可。但是,又有一个需求:IT部门的岗位员工的地址

不能直接访问。意思就是,IT部门的和其他部门的员工在getAddress()这个方法上的实现是不一样的。按照我的思路就是:那就方法重写

不就完了。嗯。可以。

     但是!如果IT部门继承了这个employee类,结果getAddress()方法忘写了....程序不会给出提示错误,软件写完之后,就傻了...IT部门

的地址都特么的显示出来了。

     如果用抽象类呢?那继承它的子类就必须实现这个方法,要不然程序会提示错误。

     这个例子不算糟糕,再举个更糟糕的例子:草鱼的做法有很多种,红烧、清炖、酸菜、清蒸、糖醋...

     如果写一个具体类GrassCarp,然后再定义一个cook()方法,这时候,你就必须得实现这个方法(也就是说你必须写一种做法进去),要么

你就得把所有的做法都写在这个类里面,cook_qingzheng(); cook_suancai();......

     如果现在把它定义成一个抽象类呢?就只需要定义一个abstract cook();即可,需要酸菜鱼的时候,就 class SuancaiFish extends GrassCarp{}

然后实现cook方法即可。放心,如果你忘了,系统是会提示的。

 

     接下来说接口。假设一个任务:电子商务平台的订单处理这块业务,包括:添加订单、取消订单和订单清算(这特么的要是抽象成具体的东西,还

真是不容易啊...这看上去是一个动作集合而不是实体集合啊!!!)。而且,不同类别产品的订单在“添加订单、取消订单和订单清算”时处理方式不一样。

举例啊,比如书籍类在取消订单的时候要扣5%的手续费,而电子音乐类不用。这时候你写一个具体类试试?

 

     不用继承的话,你得多写多少代码啊...所以,这时候接口就出现了!可以理解接口为:一套动作的组合。先不写方法怎么实现的,先写出这个方法来,

然后再去实现这些方法,交给后面实现这个接口的那些类。

     

 

1.1 什么是抽象类

        抽象类就是对一系列看上去不同,但是本质相同的具体事物们的抽象。就像:梨树、枣树、松树-----抽象----->树。要是让你具体描述一下树,谁能描述

的具体呢?但是梨树、枣树和松树的本质还是一样的,都是树。

1.2 抽象类的使用

      跟具体类不一样,定义如下:

       

    abstract class  Tree{                 public int age;//可以有普通成员变量                                public abstract void grow(){                 //抽象方法                  }                 public abstract  int getAge(){                 //抽象类中可以赋予非抽象方法方法的默认行为,即方法的具体实现                    return age;                 }    }

 

  继承如下:

 

class  TaoTree  extends Tree{          @Override          public void grow(){          System.out.print("我是桃树,我会开花,我能结果");          }}

  

 

class  SongTree  extends Tree{          @Override          public void grow(){          System.out.print("我是松树,我不会开花...T_T");          }}

  

1.3 抽象类的注意事项

       包含一个或多个抽象方法的类必须定义为抽象类!否则,用户在调用这个抽象方法的时候,系统该骂了:你用这个方法,你特么的倒是给实现以下啊!!!

        抽象类不能被实例化。你想做也做不了的。

        

2.1 什么是接口

       Java中的接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,

而这些实现可以具有不同的行为(功能)。假设一个任务:定义一个Door的类,每个门都有开和关的功能,这属于它的固有属性。现在要给门一个报警的功能,

那报警的功能算是门的固有属性吗?如果你把报警写进了Door里面,那如果有的门不能报警,你还能继承这个Door类吗?

       那就不如把报警、窥视、按铃这些功能写进接口里。如果有这个功能的们,就继承一下这个接口。

       看,接口就是一套行为的模板,有这些行为发生的时候,就实现这个接口。

2.2 接口的使用

      使用很方便,用上面门的例子:

       


Interface Alerm{    public void doAlerm();}

 

  找个门继承一下:

class  Mydoor implements Alerm{    public void doAlerm(){             System.out.print("有坏人!有坏人!");    }}

  

     就这么简单。

2.3 接口的注意事项

      接口中定义的成员变量,只能是static final 的。先说一下,接口中一般不需要成员变量。不过,为什么必须是static final 的呢?假设不是static的,

然后一个类可以实现好几个接口,这样一来,两个接口有相同的变量,你咋办???假如不是final的,这个接口里面的方法没有一个能够修改它,因为

都是抽象的嘛!然后你要修改了这个静态变量,那实现这个接口的所有类只要用到这个变量的值都会被修改...那都这么统一了,干嘛不用抽象类去呢?

 

3.0 接口和抽象类的区别

     这本质是个关于设计思想上的问题。

      先说语法上的:

      抽象类就像父亲,每个实现它的子类只能继承一个抽象类。而可以继承多个接口。接口就像情人,可以同时多交几个(如果你三观不正外加肾功强大)。

      抽象类可以有具体的成员变量以及非抽象方法。接口只能有static final 的成员变量以及所有方法都要抽象。如此来看,接口要比抽象类还要抽象。

      再说思想上的:

....待续

      

[Java]接口和抽象类