接口和抽象类的区别:
简单的来说:
1.
接口只能包含抽象方法,default,static修饰的方法,抽象类可以包含普通方法,构造方法,静态代码块,构造代码块。
2.
接口只能定义静态常量属性,抽象类既可以定义普通属性,也可以定义静态常量属性。
3.
接口不包含构造方法,抽象类里包含构造方法,但二者都不能实例化对象。
4.
都是上层的抽象层。
5.
一个类只能继承一个直接父类,这个父类可以是普通类也可以是抽象类,但却可以实现多个接口。
6.
Java中类的继承是单继承的主要原因是:当子类重写父类方法的时候,或者隐藏父类的成员变量以及静态方法的时候,JVM会使用不同的绑定规则。但是如果一个类有多个直接的父类的话,那么就会使绑定规则变得十分的复杂。Java团队为了简化软件的体系结构和绑定机制,所以java语言就禁止了多继承。
7.
接口(不是类)可以多继承,是因为接口中只有抽象的,default,static修饰的方法,没有非常量的属性,只有接口的实现类才会重写接口中方法。因此一个类有多个接口也不会增加JVM的绑定机制和复杂的程度。
8.
对于已经存在的继承树,我们可以方便的从类中抽象出新的接口,但是从类中抽象出新的抽象类就不那么容易了,因此接口更有利于软件系统的维护和重构。
※※※※※重点:
接口的设计的目的就是对类的行为进行约束(因为接口不能规定其实现类类不可以有什么行为,只能规定其实现类需要有什么行为),就是强制要求不同的实现类必须具有一些相同的行为。它只约束了行为的有无,但不对如何实现行为进行限制。对“接口为何是约束”的理解,我觉得配合泛型食用效果更佳。
而抽象类的设计目的,是代码复用。当不同的类具有某些相同的行为(记为行为集合A),且其中一部分行为的实现方式一致时(A的非真子集,记为B),可以让这些类都派生于一个抽象类Father。在Father这个抽象类中实现了B,避免让所有的子类来实现B,这就达到了代码复用的目的。而A减B的部分,留给Father的各个子类自己实现。正是因为A-B在这里没有实现,所以抽象类Father不允许实例化出来(否则当调用到A-B时,无法执行)。
本文详细探讨了接口和抽象类在Java中的主要区别,包括它们的定义、特性以及使用场景。接口主要用于约束类的行为,确保实现接口的类具有相同的操作,而抽象类则侧重于代码复用,允许部分方法的实现。Java中类的单继承和接口的多实现是设计上的考虑,以简化系统结构。理解这两者的不同有助于优化软件设计和维护。

被折叠的 条评论
为什么被折叠?



