java——为什么要有接口?和抽象类有什么不一样?

Posted 高圈圈

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java——为什么要有接口?和抽象类有什么不一样?相关的知识,希望对你有一定的参考价值。

1.接口不是类,为什么?

  接口如果是类,那就失去了java引入接口的意义了。

  java之所以引入接口,就是为了弥补不能多继承的缺点,在java中每个类只能有一个超类,但却可以实现多个接口。

2.接口可以有静态常量(一定是静态的,无论写没写static),但是不能含有实例域,为什么?

  接口就类似一个说明文档,定义继承接口的类应该必须有什么方法以及该方法的输入输出。

  接口的思想不允许出现变量,接口只是对一类事物的属性和行为更高层次的抽象。对修改关闭,对扩展(不同的实现 implements)开放。所以接口中的属性必然是常量,只能读不能改,这样才能为实现接口的对象提供一个统一的属性。

3.接口中可以有静态方法,为什么?

  JAVA SE 8中可以定义带有方法体的静态方法,以保证“源代码兼容”。

4.就扣可以有静态常量,并且这个常量一定是静态的,为什么?

  因为static是所有对象可以访问,而且可以直接通过类名访问。接口没有对象,必须通过类名来访问所以是要静态的。

 

想清楚这些,再想想接口和抽象类有什么不一样,什么时候用接口,什么时候用抽象类?

  1.抽象类是类,但接口不是。

  2.接口中的方法都是抽象方法,而抽象类必须有抽象方法,但也可以有普通方法。

  3.接口定义的方法以及常量都是public,而抽象类是可以有私有方法或私有变量的。

  4.实现接口需要实现接口中的每一个方法,而继承抽象类则可以选择实现抽象类中的一部分抽象方法,但此时这个子类仍然是一个抽象类。

  5.接口可以实现多继承,但是一个类只能实现一个超类。

  6.接口中定义的变量默认是public static final 型,必须给其初值,所以实现类中不能重新定义,也不能改变其值。抽象类中的变量默认是default 型,其值可以在子类中重新定义,也可以重新赋值。

  接口更像是一种协议,实现接口的子类需要按照这种协议来编写自己的代码,但抽象类就更接近一个不能实例化的普通类,只不过为了子类更加灵活多变,将一部分方法留给子类去实现,这也体现了java的多态。

以上是关于java——为什么要有接口?和抽象类有什么不一样?的主要内容,如果未能解决你的问题,请参考以下文章

接口和抽象类有什么区别

接口和抽象类有什么区别?

接口和抽象类有什么区别

接口和抽象类有什么区别

接口和抽象类有什么区别

Java面试题|接口和抽象类有什么区别?