关于面试的准备(一)

来源:互联网 发布:织梦5.7自动内链失效 编辑:程序博客网 时间:2024/04/30 17:45

一,谈谈你对abstract和Interface的区别

       首先,abstract和interface是java的两种抽象机制,真应为这两种机制使得java有了面对对象的强大生命力。abstract和interface有着不少的相识之处,但也有不少的不同之处,主要从语法和问题领域上的区别,后者是本质的区别。

        1,语法上来说,abstrac 可以有构造函数,而interface 不行, abstract 可以有私有的,实现的方法,而interface只能是public abstrac的方法,接口中不用指明;抽象类中也可以有私有成员变量而interface中 abstract final的。子类只能继承一个类但可以继承多个接口。

      ,2,从问题领域上的区别是:抽象类要求子类和父类在概念上保持一致:是is a 的关系,而在接口中,不要求实现接口的类和接口保持一致,接口就是一个契约,要求实现它的类能够实现功能,是 like a的关系。

      最后举出一个例子来更加清楚的理解它们之间的区别。

     比如说,我们要设计一个门,它拥有open() 和 close() 的方法,如何设计呢,门是一个抽象的概念,当然我们可以用abstract 和 interface来定义

     abstrac Class Door                     interface  Door

{                                                           {

   abstract void open();                          void open();

  abstract void close();                          void close();

}                                                         }

    但是如果一种门具有Alarm的功能,如何设计呢。本例中主要探讨abstract和interface在设计理念上的区别,其它的问题不考虑。想给出

     abstrac Class Door                     interface  Door

{                                                           {

   abstract void open();                          void open();

  abstract void close();                            void close();

  abstract void alarm();                          void alarm():                                     

}                                                         }

class alarmDoor extends Door

{

        void open(){}

        void close(){}

       void alarm();

}

 

但是这样会带来一个问题,Door的固有的方法和Alarm的方法混在一起,会因为alram()方法的改变例如参数而改变Door,违反了ISP原则。

我门设计的时候吧 AlarmDoor在概念上是Door ,而拥有Alarm的功能。

我们可以这样: interface Alarm {

                             void alarm() }

 

class alarmDoor extends Door implements Alarm

{

        void open(){}

        void close(){}

       void alarm(){}

}

这个较好的反映了我们的设计意图,如果我们把 alarmDoor理解为它是一个Alarm 拥有了door的功能,则可以反过来。

  

   

 

    

原创粉丝点击