Привет, я программная обезьяна, которая выращивает свиней. Обычно я люблю возиться с технологиями и выращивать «свиней». Время от времени я буду делиться некоторыми техническими статьями.
Следуй за мной, не теряйся~
Эта статья полностью понимает, как выбрать абстрактный класс или интерфейс.
предисловие
Абстрактные классы и интерфейсы знакомы таким программистам, как Java и C++, но знаете ли вы, как правильно использовать абстрактные классы и интерфейсы? Вы все еще сомневаетесь, просто запоминаете разницу между ними и не знаете, как выбрать в реальной ситуации?
Сегодня я познакомлю вас с разницей между ними.Конечно, эта статья основана на Java, но она также применима к программистам на других языках.
Что такое абстрактный класс? Что такое интерфейс?
Здесь я позабочусь о программистах, которые только начинают, и кратко представлю определения этих двух.
Абстрактный класс: существует для наследования.
Интерфейс: более абстрактное существование, чем абстрактный класс.
Вступление действительно простое, но я до сих пор не знаю, как выбрать, какое из них... Посмотрим!
Разница между абстрактным классом и интерфейсом
На самом деле, я также резюмировал разницу между ними следующим образом:
Абстрактный класс:
(1) Абстрактный метод должен быть общедоступным или защищенным (поскольку, если он частный, он не может быть унаследован подклассами, а подклассы не могут реализовать метод), и по умолчанию он является общедоступным.
(2) Абстрактные классы нельзя использовать для создания объектов.
(3) если класс наследуется от абстрактного класса, должны быть реализованы подклассы абстрактного родительского класса. Если подкласс не реализует метод абстрактного родительского класса, он также должен быть определен как подкласс абстрактного.
(4) Переменные-члены абстрактных классов могут быть любого типа.
(5) Могут быть статические блоки кода и статические методы.
(6) Класс может наследовать только один абстрактный класс.
(7) Класс «является или не является отношением».
интерфейс:
(1) Переменные могут быть определены только как public static final.
(2) Методы могут быть только абстрактными, без тел методов.
(3) Не может быть статических блоков кода и статических методов.
(4) Класс может реализовывать несколько интерфейсов.
(5) Интерфейс "не имеет значения".
(Если вам нужны какие-то заметки, составленные мной, вы можете обратить внимание на официальный аккаунт программы свиньи, которым поделимся позже)
Конечно, эти различия применимы только до Java 8. Интерфейсы Java 8 могут иметь методы по умолчанию и статические методы.Эти новые функции будут представлены ниже.
Помните, что эти различия, которые я перечислял, и понять некоторые новые функции Java8, поэтому это интервью не должно быть, нечемным проблемой ~ ~ ~ Но интервьюер может сделать ваш пример фактическим или дать вам сценарий для вас на выбор, только для того, чтобы возобновить Игроки, это может быть проблемой. Однако не паникуйте, вот я беру тебя через пример очень близко к жизни, чтобы вы могли тщательно понять, как выбрать!
как выбрать?
На самом деле, выше написана разница, абстрактный класс - это отношение "есть или нет", а интерфейс - это отношение "есть ли". Поэтому легко думать, что абстрактный класс должен быть общим признаком класса вещей, такого как Человек,у него есть глаза и кожа, эти характеристики, описывающие человека, могут быть определены в абстрактных классах, в то время какповедение похоже на игру в баскетбол, они могут быть определены в интерфейсах.
Этот пример на самом деле не очень очевиден.Я буду использовать пример реального программиста, чтобы говорить через реальный бой!
Для программиста. В начале дня вы должны встать на первое место, тогда вам нужно поддерживать переменную - время пробуждения, потому что время пробуждения каждый раз другой, это состояние, поэтому это время пробуждения не может быть изменено С финалом, поэтому интерфейс пропускается. и поддерживать только эту переменную с абстрактным классом.
Затем приступайте к работе и наносите удары, вы можете использовать функцию для описания ударов. Здесь я предполагаю, что каждая компания требует это hh (конечно, некоторые компании, в которых я остался, гибки, и нет необходимости тактировать в hh), так что это общность каждого программиста, и ее также следует поддерживать в абстрактном виде. классы.
В жизни программиста должно быть не только написание кода, но и какие-то увлечения, например игра в футбол, но не каждый программист любит играть в футбол (сидеть на рабочем месте и ловить рыбу хх), так что нетрудно судить, что Интерфейс должен быть выбран для поддержания интереса к игре.
Вот, напишем код:
//程序猿基类
public abstract class BaseWorker {
//起床时间
protected int wakeupTime = 7;
//上班打卡
protected abstract void clockIn();
}
Модифицированный с защищенным в основном для наследования, чтобы подклассы могли получить доступ.
public interface Interest {
void playBall();
}
//一只程序猿
public class Worker extends BaseWorker implements Interest {
protected int wakeupTime = 6;
@Override
protected void clockIn() {
//……
}
@Override
public void playBall() {
//……
}
}
Однако я хочу сказать вам, что выбор абстрактных классов и интерфейсов не является оговоркой и должен разумно корректироваться в соответствии с бизнесом. Например, в нашей компании в основном все любят играть в футбол, поэтому если мы все же определяем интерес к игре в интерфейсе, нам приходится каждый раз реализовывать этот интерфейс, а количество кода избыточно. Следовательно, в данном случае мы можем отнести игру к новому абстрактному классу воркеров, что может уменьшить количество написания реализаций.
Код изменен следующим образом:
//程序猿都爱打球
public class WorkerLikeBall extends BaseWorker{
protected abstract void playBall();
}
Таким образом, вам нужно только унаследовать BaseWorker, чтобы получить время, чтобы встать и включиться в работу. На первый взгляд, он не соответствует спецификациям абстрактного класса, о котором я упоминал ранее, но такой способ написания больше соответствует нашим требованиям.Только гибкое использование может написать простой и эффективный код.
Стандартные и статические методы интерфейсов
После прочтения того, что я сказал выше, я думаю, вы научились выбирать. Наконец, давайте поговорим о методе по умолчанию и статическом методе интерфейса. Эти два метода являются новыми функциями Java8.
Java8 может писать статические методы в интерфейсе, например, новая версия Comparator, которая добавляет статическое сравнение методов, просто передайте интерфейс функции.
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
int min = list.stream().min(Comparator.comparing(value -> value)).get();
int max = list.stream().max(Comparator.comparing(value -> value)).get();
Вы также можете добавить статические методы в свой собственный интерфейс, не влияя на использование исходного кода (нет необходимости переопределять этот метод в классе реализации).
public interface Interest {
void playBall();
default void start() {
System.out.println("start playing");
}
static void time() {
System.out.println(
LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_TIME)
);
}
}
Метод по умолчанию, модифицированный по умолчанию, класс реализации не реализует метод по умолчанию, если подкласс реализован, метод по умолчанию, реализованный подклассами. Ядро метода по умолчанию совместимо с предыдущим кодом, легко расширяется.
Проблема множественного наследования методов по умолчанию: если класс реализации реализует несколько интерфейсов, и каждый интерфейс имеет метод по умолчанию с тем же именем, то Java не может определить, какой из них использовать.Вы можете переопределить этот метод в классе реализации, поскольку переопределение имеет наивысший приоритет.
Статические методы вызываются только по имени интерфейса, поэтому проблемы множественного наследования не возникает.
Тогда некоторые друзья спросят, зачем вам абстрактные классы, когда интерфейс Java 8 такой сильный?
Другими словами, существование разумно.
Прежде всего, первоначальная цель добавления методов по умолчанию в Java 8 состоит в том, чтобы изменить интерфейс без изменения других классов реализации.
Например, в интерфейсе List в Java метод sort по умолчанию добавлен в Java 8, чтобы другие классы, реализующие интерфейс List, могли наследовать этот метод и использовать его без модификаций.В конце концов, функциональные интерфейсы сейчас так популярны, и многое другое обязательно будут добавлены более сильные методы по умолчанию в интерфейс.
Но для переменных государственного класса они все еще должны быть размещены в абстрактном классе.
Привет, я программная обезьяна, которая выращивает свиней. Обычно я люблю возиться с технологиями и выращивать «свиней». Время от времени я буду делиться некоторыми техническими статьями.
Следуй за мной, не теряйся~
В этой статье используетсяmdniceнабор текста