美文网首页
Java中类,抽象类,接口之间的异同

Java中类,抽象类,接口之间的异同

作者: Harper324 | 来源:发表于2019-02-16 14:45 被阅读0次
    • 是一个模板,是对一系列具有相同属性和方法的对象的描述;如果一个类含有抽象方法或者被声明为abstract,则称这个类为抽象类

    类与抽象类的主要区别在于:

    1、抽象方法必须为public或者protected,缺省情况下默认为public。

    2、抽象类不能用来创建对象:抽象类创建对象其实没有任何意义。

    3、如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。

    • 接口是一种声明的集合,是一种声明的规范,里面只能包含抽象方法。

    接口与抽象类的主要区别有:

    1、语法层面的区别

    1)抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法;

    2)抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的;

    3)接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;

    4)一个类只能继承一个抽象类,而一个类却可以实现多个接口。

       5)抽象类可以有构造方法,而接口不可以有构造方法。
    

    2、设计层面的区别

    1)抽象类是对一种事物的抽象,即对类抽象,而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象。比如,老虎和牛都能吃东西,在设计时可以将老虎设计为一个类Tiger,牛设计为一个类Cow,但吃不能设计为一个类,因为它是行为特性而不是对一类事物的抽象描述,可以将吃设计为接口Eat,包含eat()方法

    2)设计层面不同,抽象类作为很多子类的父类,它是一种模板式设计。而接口是一种行为规范,它是一种辐射式设计。PPT模板就是模板式设计,对模板做的修改也会出现在应用该模板的全部PPT中,而辐射式设计则需要对每个子类都进行更改

    门和报警的例子:门都有open( )和close( )两个动作,可以定义通过抽象类和接口来定义这个抽象概念:

    // 抽象类
    abstract class Door {
        public abstract void open();
        public abstract void close();
    }
    
    //接口
    interface Door {
        public abstract void open();
        public abstract void close();
    }
    

    但是现在如果需要门具有报警alarm( )的功能,有两种思路来实现:

    1)将这三个功能都放在抽象类里面,所有继承于这个抽象类的子类都具备了报警功能,但是有的门并不一定具备报警功能;

    2)将这三个功能都放在接口里面,需要用到报警功能的类就需要实现这个接口中的open( )和close( ),也许这个类根本就不具备open( )和close( )这两个功能,比如火灾报警器。

    从这里可以看出, Door的open() 、close()和alarm()根本就属于两个不同范畴内的行为,open()和close()属于门本身固有的行为特性,而alarm()属于延伸的附加行为。因此最好的解决办法是单独将报警设计为一个接口,包含alarm()行为,Door设计为单独的一个抽象类,包含open和close两种行为。再设计一个报警门继承Door类和实现Alarm接口。

    interface Alram {
        void alarm();
    }
     
    abstract class Door {
        void open();
        void close();
    }
     
    class AlarmDoor extends Door implements Alarm {
        void oepn() {
          //....
        }
        void close() {
          //....
        }
        void alarm() {
          //....
        }
    }
    

    相关文章

      网友评论

          本文标题:Java中类,抽象类,接口之间的异同

          本文链接:https://www.haomeiwen.com/subject/eybbeqtx.html