// Tutorial //

Difference between Abstract Class and Interface in Java

Published on August 3, 2022
Default avatar
By Pankaj
Developer and author at DigitalOcean.
Difference between Abstract Class and Interface in Java

While we believe that this content benefits our community, we have not yet thoroughly reviewed it. If you have any suggestions for improvements, please let us know by clicking the “report an issue“ button at the bottom of the tutorial.

Difference between Abstract Class and Interface is one of the popular interview questions. Abstract Class and Interface are a core part of the Java programming language. Whether to choose an interface or abstract class is a design decision that every architect faces. In my last articles, I have provided as much as possible details about java interface and abstract class. In this post, we will learn about the difference between abstract class and Interface and when should we use interface over the abstract class and vice versa.

Difference between Abstract Class and Interface

  1. 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.
  2. 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.
  3. Abstract classes can have methods with implementation whereas interface provides absolute abstraction and can’t have any method implementations. Note that from Java 8 onwards, we can create default and static methods in interface that contains the method implementations.
  4. Abstract classes can have constructors but interfaces can’t have constructors.
  5. 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.
  6. 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.
  7. A subclass can extend only one abstract class but it can implement multiple interfaces.
  8. Abstract classes can extend other class and implement interfaces but interface can only extend other interfaces.
  9. 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.
  10. 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.

That’s all for the difference between an 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 choose between Interface or abstract class for providing a contract for subclasses is a design decision and depends on many factors. Let’s see when Interfaces are the best choice and when can we use abstract classes.

  1. 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 the base for class hierarchy and contract. Also coding in terms of interfaces is one of the best practices for coding in java.
  2. If there are a lot of methods in the contract, then abstract class is more useful because we can provide a default implementation for some of the methods that are common for all the subclasses. Also if subclasses don’t need to implement a particular method, they can avoid providing the implementation but in case of interface, the subclass will have to provide the implementation for all the methods even though it’s of no use and implementation is just empty block.
  3. 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 the 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

Using interfaces and abstract classes together is the best approach to design 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 a 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 the base and define methods that every subclass 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 the 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, it’s 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 an 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 an implementation for them. This has bridged 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.


Want to learn more? Join the DigitalOcean Community!

Join our DigitalOcean community of over a million developers for free! Get help and share knowledge in our Questions & Answers section, find tutorials and tools that will help you grow as a developer and scale your project or business, and subscribe to topics of interest.

Sign up
About the authors
Default avatar
Pankaj

author

Developer and author at DigitalOcean.

Still looking for an answer?

Was this helpful?

“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.” Actually we can do it starting from Java 8 since main method is static.

- Max

    Hi Pankaj, Nowadays many sites for explanations but your blog quite impressive because few points added more and those are very helpful for interview point of view. Thanks a lot

    - Hari

      Hi , first of all your every post is useful . I have one request , can you change the difference between abstract class and interface according to java 8 changes

      - annonymous

        Just a friendly reminder, I’ve noticed that you mistakenly used “chose” in many articles where “choose” should be used in fact. Nonetheless, this is a great set of tutorials on Core Java :)

        - Kenneth

          Dear Pankaj, Please tell me where we use abstract class and where we use interface in java project.

          - Vivek Dubey

            Nice and very straight forward post. Thanks for posting.

            - GST Billing Software

              We can run interface from Java8 as it can have static method and we can execute so the difference of not running interface is invalid after java8, either u can update or add.

              - Chetan

                Nice explanation.

                - sanjay pradhan

                  Thanks for sharing this post. keep it up.

                  - Anurag Singh

                    Great Explanation, Your article provides quality content on difference between Abstract class and Interface. It is a very common question usually asked in interviews. I agree with your all points. We can achieve Abstraction 0-100% through abstract class and 100% abstraction from Interfaces because Interface can contain only abstract methods but Abstract class may have abstract method as well as methods with implementation. I am also running a blog (java2blog) which is tutorial on Java. It also provides useful interview questions and answers on Java.

                    - Arpit Mandliya