抽象类和接口的区别

作者: 第四单元 | 来源:发表于2019-01-07 10:09 被阅读120次

    Java中的抽象类和接口是两个有些类似的概念,在某些情况下他们有着类似的语义。下面来总结一下他们各自的特点。

    一.抽象类

    首先要强调的是抽象类是类,用class声明。当一个类中有抽象的方法时,这个类也必须被声明为抽象的。抽象的方法或类都使用abstract修饰符来修饰。抽象类中可以有属性和非抽象的方法。抽象类不能被实例化,因为它有抽象的方法,无法调用。所以抽象类一般被设计用于继承。继承一个抽象类需要实现其所有的抽象方法,否则的话子类也应该被声明为抽象的。可以定义一个抽象类的引用来指向它的一个非抽象子类的对象。

    二.接口

    接口比抽象类的抽象程度更高,它完全不包括实例方法或属性。接口使用关键字interface来声明。接口中只包含方法的声明,它就是用来描述类具有什么功能,而并给出每个功能的具体实现。接口中所有方法都自动地属于public,所以不用显示地声明。实现一个接口就要实现它所有的方法。

    三.比较

    1.相同点
    • 接口和抽象类都不能被实例化;
    • 可以定义一个抽象类或接口类型的引用,用来引用子类或实现类;
    2.不同点
    • 是否含有实例方法:抽象类中可以有实例属性和实例方法,接口中只能有抽象的方法和常量属性(static final修饰)。注:接口中不需要显示地声明方法为public,同样属性也不用显示声明为public static final;
    • 继承抽象类时可以不实现其全部的抽象方法。当然这时子类也要被声明为抽象的。实现接口时所有的方法都要被实现;
    • 抽象类使用关键字abstract class定义。接口使用interface定义。继承抽象类使用extends关键字,实现接口使用implements关键字;
    • 每个类最多继承一个抽象类,而可以实现多个接口;
    • 抽象类可以有main方法,并且我们可以运行它,接口不能有main方法;
    • 抽象类有构造方法,接口没有;
    • 使用抽象类时添加一个新的实例方法时,不需要修改子类;而为接口增加方法时,其所有实现类都要修改;
    • 在需要复用父类提供的一些基本代码,并且另外有部分代码需要子类实现时可以使用抽象类,它就像一个类的模板,如jdk中的aqs抽象类;如果要实现多继承那就必须使用接口;

    相关文章

      网友评论

        本文标题:抽象类和接口的区别

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