抽象类和接口的区别

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

一.抽象类

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

二.接口

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

三.比较

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

如果本文对您有帮助,欢迎关注我的原创微信公众号“Java技术小站”第一时间接收我的更多文章

Java技术小站.png

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容