Некоторые из популярных вопросов интервью: «В чем разница между абстрактным классом и интерфейсом», «Когда вы будете использовать абстрактный класс и когда вы будете использовать интерфейс». Итак, в этой статье мы пройдем эту тему.
Прежде чем перейти к различиям между ними, давайте рассмотрим их введение.
Абстрактный класс
Абстрактные классы создаются для захвата общих характеристик подклассов. Его нельзя создать, его подклассы можно использовать только как суперкласс. Абстрактные классы используются для создания шаблона для его подклассов вниз по иерархии.
Давайте возьмем пример класса JDK GenericServlet:
1
2
3
4
5
6
7
8
|
public abstract class GenericServlet implements Servlet, ServletConfig,Serializable{ // abstract method abstract void service(ServletRequest req, ServletResponse res) ; void init() { // Its implementation } // other method related to Servlet } |
Когда HttpServlet расширяет универсальный сервлет, он обеспечивает реализацию метода service ():
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
|
public class HttpServlet extends GenericServlet { void service(ServletRequest req, ServletResponse res) { // implementation } protected void doGet(HttpServletRequest req, HttpServletResponse resp) { // Implementation } protected void doPost(HttpServletRequest req, HttpServletResponse resp) { // Implementation } // some other methods related to HttpServlet } |
Интерфейс
Интерфейс — это коллекция абстрактных методов. Класс реализует интерфейс, тем самым наследуя абстрактные методы интерфейса. Так что это своего рода подписание контракта, вы соглашаетесь, что если вы реализуете этот интерфейс, то вам придется использовать его методы. Это просто шаблон, он ничего не может сделать сам.
Давайте возьмем пример внешнего интерфейса:
01
02
03
04
05
06
07
08
09
10
|
public interface Externalizable extends Serializable { void writeExternal(ObjectOutput out) throws IOException; void readExternal(ObjectInput in) throws IOException, ClassNotFoundException; } |
Когда вы реализуете этот интерфейс, вы должны реализовать два вышеупомянутых метода:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
|
public class Employee implements Externalizable{ int employeeId; String employeeName; @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { employeeId=in.readInt(); employeeName=(String) in.readObject(); } @Override public void writeExternal(ObjectOutput out) throws IOException { out.writeInt(employeeId); out.writeObject(employeeName); } } |
Абстрактный класс против интерфейса
Когда использовать Абстрактный класс и интерфейс:
- Если у вас много методов и вы хотите использовать реализацию по умолчанию для некоторых из них, используйте абстрактный класс
- Если вы хотите реализовать множественное наследование, вы должны использовать интерфейс. Поскольку Java не поддерживает множественное наследование, подкласс не может расширять более одного класса, но вы можете реализовать несколько интерфейсов, чтобы вы могли использовать интерфейс для этого.
- Если ваш базовый контракт продолжает изменяться, то вы должны использовать абстрактный класс, как если бы вы продолжали изменять свой базовый контракт и использовать интерфейс, тогда вам придется изменить все классы, которые реализуют этот интерфейс.
Введение стандартных и статических методов в Java 8
Oracle попытался преодолеть разрыв между абстрактным классом и интерфейсом, введя в интерфейс концепцию стандартных и статических методов. Так что теперь мы можем обеспечить реализацию метода по умолчанию в интерфейсе и не будем применять класс для его реализации. Я расскажу об этой теме в моем следующем посте.
Ссылка: | Отличие между Абстрактным классом и Интерфейсом в Java от нашего партнера по JCG Арпит Мандлия в фреймворках Java и шаблонах проектирования для начинающих . |