Difference between Abstract Class and Interface in Java
In this post, we will learn about the difference between abstract class and Interface and when should we use interface over abstract class and vice versa.
Difference between Abstract Class and Interface
abstract
keyword is used to create an abstract class and it can be used with methods also whereas interface
keyword is used to create interface and it can’t be used with methods. Subclasses use
extends
keyword to extend an abstract class and they need to provide implementation of all the declared methods in the abstract class unless the subclass is also an abstract class whereas subclasses use implements
keyword to implement interfaces and should provide implementation for all the methods declared in the interface. Abstract classes can have methods with implementation whereas interface provides absolute abstraction and can’t have any method implementations.
Abstract classes can have constructors but interfaces can’t have constructors.
Abstract class have all the features of a normal java class except that we can’t instantiate it. We can use
abstract
keyword to make a class abstract but interfaces are a completely different type and can have only public static final constants and method declarations. Abstract classes methods can have access modifiers as public, private, protected, static but interface methods are implicitly public and abstract, we can’t use any other access modifiers with interface methods.
A subclass can extend only one abstract class but it can implement multiple interfaces.
Abstract classes can extend other class and implement interfaces but interface can only extend other interfaces.
We can run an abstract class if it has
main()
method but we can’t run an interface because they can’t have main method implementation. Interfaces are used to define contract for the subclasses whereas abstract class also define contract but it can provide other methods implementations for subclasses to use.
Thats all for the difference between interface and abstract classes, now we can move on to know when should we use Interface over Abstract class and vice versa.
Interface or Abstract Class
Whether to chose between Interface or abstract class for providing contract for subclasses is a design decision and depends on many factors, lets see when Interfaces are best choice and when can we use abstract classes.
Java doesn’t support multiple class level inheritance, so every class can extend only one superclass. But a class can implement multiple interfaces. So most of the times Interfaces are a good choice for providing base for class hierarchy and contract. Also coding in terms of interfaces is one of the best practices for coding in java.
If there are a lot of methods in the contract, then abstract class is more useful because we can provide default implementation for some of the methods that are common for all the subclasses. Also if subclasses don’t need to implement particular method, they can avoid providing the implementation but in case of interface, the subclass will have to provide implementation for all the methods even though it’s of no use and implementation is just empty block.
If our base contract keeps on changing then interfaces can cause issues because we can’t declare additional methods to the interface without changing all the implementation classes, with abstract class we can provide the default implementation and only change the implementation classes that are actually going to use the new methods.
Use Abstract classes and Interface both
Actually most of the times, using Interfaces and abstract classes together is the best approach for designing a system, for example in JDK
java.util.List
is an interface that contains a lot of methods, so there is an abstract class java.util.AbstractList
that provides skeletal implementation for all the methods of List interface so that any subclass can extend this class and implement only required methods. We should always start with an interface as base and define methods that every subclasses should implement and then if there are some methods that only certain subclass should implement, we can extend the base interface and create a new interface with those methods. The subclasses will have option to chose between the base interface or the child interface to implement according to its requirements. If the number of methods grows a lot, its not a bad idea to provide a skeletal abstract class implementing the child interface and providing flexibility to the subclasses to chose between interface and abstract class.
Java 8 interface changes
From Java 8 onwards, we can have method implementations in the interfaces. We can create default as well as static methods in the interfaces and provide implementation for them. This has bridge the gap between abstract classes and interfaces and now interfaces are the way to go because we can extend it further by providing default implementations for new methods. For more details, check out Java 8 interface default static methods.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.