美文网首页
Java基础知识之接口和抽象类的区别

Java基础知识之接口和抽象类的区别

作者: alexlee1987 | 来源:发表于2019-10-29 12:12 被阅读0次

    Java基础知识之接口和抽象类的区别

    1.接口

      接口是抽象方法的集合,一个接口只有方法的形状而没有方法的具体实现,接口是Java面向对象提供的一种机制。
      Java语言是一种单继承的,在类的继承中通过实现多个接口间接实现了多继承功能。接口的申明:

    [public] interface InterfaceName{
        void method1(int arg1);
        void method2();
        ...
    }
    

    2.抽象类

      抽象类是用来捕捉子类的通用特性的 。它不能被实例化,只能被用作子类的超类。抽象类是被用来创建继承层级里子类的模板。抽象类申明:

    [public] abstract class ClassName {
        abstract void fun();
        void fun2();
        ...
    }
    

    3.接口和抽象类区别

      (1)、接口只能包含抽象方法,抽象类可以包含普通方法;
      (2)、接口的方法都是完全抽象的,并且方法必须是public,而且默认方法是public abstract的,抽象中的方法可以被public,protected等修饰符修饰;
      (3)、子类用implements来实现接口,子类需要实现接口中的所有方法,但继承抽象类可以不重写父类中非抽象方法,抽象类中的抽象方法必须被重写;
      (4)、一个类可以实现多个接口,但只能继承最多一个抽象类,接口可以继承一个或者多个接口;
      (5)、抽象类中可以有普通成员变量,接口中没有普通成员变量,只能有常量;
      (6)、抽象类中的方法可以被static修饰,接口中的方法不可以被static修饰;
      (7)、抽象类可以有构造函数,接口不可以有构造函数。
      PS:相同点是都不能实例化(不能new),都有抽象方法,子类中必须对父类方法进行重写。

    4.接口和抽象类的使用场景

      接口主要用于实现多继承的场景和模块与模块之间的调用情况,抽象类主要用于当做基础类使用,即基类(基类里面的一些方法都有默认的方法实现,即实现接口的公用的代码,个性化的方法由各个子类去实现)。

    5.Demo

      下面看一个网上流传最广泛的例子:门和警报的例子:门都有open( )和close( )两个动作:

      抽象类定义:

    abstract class Door {
        public abstract void open();
        public abstract void close();
    }
    

      或者接口定义如下:

    interface Door {
        void open();
        void close();
    }
    

      但是现在如果我们需要门具有报警alarm( )的功能,那么该如何实现?下面提供两种思路:
      1)将这三个功能都放在抽象类里面,但是这样一来所有继承于这个抽象类的子类都具备了报警功能,但是有的门并不一定具备报警功能;
      2)将这三个功能都放在接口里面,需要用到报警功能的类就需要实现这个接口中的open( )和close(),也许这个类根本就不具备open( )和close()这两个功能,比如火灾报警器。
      从这里可以看出, Door的open() 、close()和alarm()根本就属于两个不同范畴内的行为,open()和close()属于门本身固有的行为特性,而alarm()属于延伸的附加行为。因此最好的解决办法是单独将报警设计为一个接口,包含alarm()行为,Door设计为单独的一个抽象类,包含open和close两种行为。再设计一个报警门继承Door类和实现Alarm接口。最终的方案源码如下:

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

    相关文章

      网友评论

          本文标题:Java基础知识之接口和抽象类的区别

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