Статьи

Справочное руководство по интервью с Java — часть 1

Объектно-ориентированные концепции JAVA

Java основана на объектно-ориентированных концепциях, что позволяет более высокий уровень абстракции для реалистичного решения любой проблемы.

Объектно-ориентированный подход концептуализирует решение проблемы в реальном объекте, который легче повторно использовать в приложении. Например, стул, вентилятор, собака, компьютер и т. Д.

В Java класс — это чертежи, шаблон или прототип, которые определяют общее поведение объекта того же рода. Экземпляр — это реализация определенного класса, и все экземпляры класса имеют схожие свойства, как описано в определении класса. Например, вы можете определить класс с именем House с номером комнаты в качестве атрибута и создать такие экземпляры, как house с 2 комнатами, house с 3 комнатами и т. Д.

Выгоды:

Ниже приведены несколько преимуществ объектно-ориентированной разработки программного обеспечения:

  • Меньшая стоимость обслуживания в основном потому, что она модульная
  • Лучшее повторное использование кода благодаря таким функциям, как наследование и, следовательно, более быстрая разработка.
  • Улучшенная надежность и гибкость кода
  • Легко понять из-за реального моделирования.
  • Лучшая абстракция на уровне объекта.
  • Снижение сложности при переходе от одного этапа разработки к другому.

Существует четыре основных свойства OOPS:

  • Инкапсуляция
  • наследование
  • Полиморфизм
  • абстракция

Инкапсуляция:

Encapsulate предоставляет контракт другому объекту о том, что скрывать и что раскрывать, к чему могут обращаться другие объекты. В Java мы используем частный модификатор доступа, чтобы скрыть метод и переменную для ограничения из внешнего мира. Java также предоставляет различные модификаторы доступа, такие как public, default, protected и private, которые используют, чтобы скрыть видимость на другом уровне, но конечной целью является инкапсуляция вещей, которые не нужно менять. В соответствии с передовой практикой у класса должна быть только одна причина для изменения, и Encapsulate привносит реальность для достижения принципа « единой причины ».

В соответствии с лучшими практиками в Инкапсуляции подразумевается сокрытие вещей, которые, как ожидается, будут часто меняться, чтобы избежать взлома других классов.

Преимущества: Ниже приведены некоторые преимущества инкапсуляции:  

  • Мы можем защитить внутреннее состояние объектов, скрыв его атрибут.
  • Это улучшает модульность кода, предотвращая неожиданное взаимодействие объектов друг с другом.
  • Увеличивает удобство использования
  • Ведение договоров конкретного объекта
  • Инкапсуляция способствует обслуживанию
  • Изменения кода могут быть сделаны независимо

Полиморфизм:

Полиморфизм — это способность (в программировании) представлять один и тот же интерфейс для различных базовых форм (типов данных). Это означает, что классы имеют разные функциональные возможности при совместном использовании общего интерфейса и могут вызываться динамически, передавая конкретную ссылку на класс.

Классическим примером является класс Shape и все классы, которые могут наследовать от него (квадрат, круг, додекаэдр, неправильный многоугольник, сплат и т. Д.).

В этом примере каждый класс будет иметь свою собственную функцию Draw (), и клиентский код может просто сделать:

1
2
3
Shape shape=new Square ();
 
Shape.area() to get the correct behavior for any shape.

Прелесть полиморфизма в том, что коду, работающему с разными классами, не нужно знать, какой класс он использует, поскольку все они используются одинаково.

Процесс, используемый объектно-ориентированным языком программирования для реализации полиморфизма во время выполнения, называется динамическим связыванием.

Примечание . Полиморфизм — это возможность выбирать более специализированные методы во время выполнения в зависимости от объекта, который используется для его вызова. Полиморфизм может возникнуть без участия абстрактных классов.

Выгоды:

  • Создание кода многократного использования: это означает, что как только классы создают, реализуют и тестируют, его можно легко использовать, не заботясь о том, что написано в классе.
  • Он предоставляет более общий и слабо связанный код.
  • Время компиляции намного меньше и позволяет быстрее разработки.
  • Динамическое связывание:
  • Один и тот же интерфейс может быть использован для создания методов с разными реализациями.
  • Полная реализация может быть заменена использованием сигнатур того же метода

Переопределение метода для достижения полиморфизма: Переопределение имеет дело с двумя методами; один в родительском классе и другой в дочернем классе и имеют то же имя и подписи.

Переопределение позволяет по-разному определять одну и ту же операцию для разных типов объектов.

Например

1
2
3
4
5
6
7
while(it.hasNext()) {
 
Shape s = (Shape) it.next();
 
totalArea += s.area(dim); //polymorphic method call. Will call right object method
 
}

полиморфизм

Метод перегрузки или Ad-hoc полиморфизм или статический полиморфизм:

Перегрузка имеет дело с несколькими методами в одном классе с одним и тем же именем, но разными сигнатурами методов. Перегрузка позволяет по-разному определять одну и ту же операцию для разных данных. Некоторое время это называется статическим полиморфизмом, но на самом деле это не полиморфизм.

Перегрузка методов — это не что иное, как наличие двух методов с одинаковым именем, но с разными списками аргументов. Это не имеет ничего общего с наследованием и полиморфизмом. Перегруженный метод — это не то же самое, что переопределенный метод. [ Head First Java ]

Параметрический полиморфизм через дженерики в Java:

В объявлении класса имя поля может ассоциироваться с разными типами, а имя метода может ассоциироваться с разными типами параметров и возвращаемых типов. Java поддерживает параметрический полиморфизм через дженерики.

Примером является список, который может принимать тип данных, которые он содержит, через дженерики.

1
List<String> list = new ArrayList<String>();

Почему мы не можем переопределить статический метод в Java?

Переопределение зависит от наличия экземпляра класса. Смысл полиморфизма заключается в том, что вы можете создать подкласс класса, и объекты, реализующие эти подклассы, будут иметь разное поведение для одних и тех же методов, определенных в суперклассе (и переопределенных в подклассах). Статический метод не связан ни с одним экземпляром класса, поэтому концепция не применима.

На разработку Java повлияли два фактора. Одна из них была связана с производительностью: было много критических замечаний по поводу того, что Smalltalk слишком медленный (сборщик мусора и полиморфные вызовы являются частью этого), и создатели Java были полны решимости этого избежать. Другим было решение, что целевой аудиторией для Java были разработчики C ++. Заставить статические методы работать так, как они это делали, было полезно для программистов на C ++, а также очень быстро, потому что не нужно подниматься по иерархии классов, чтобы выяснить, какой метод вызывать, вы идете прямо к классу и вызываете указанный метод. [Переполнение стека]

Наследование:

Это включение поведения (т. Е. Методов) и состояния (т. Е. Переменных) базового класса в производный класс, чтобы они были доступны в этом производном классе. Основное преимущество Inheritance заключается в том, что он обеспечивает формальный механизм повторного использования кода и позволяет избежать дублирования.

Унаследованный класс расширяет функциональность приложения, повторно используя родительское поведение и добавляя новые функциональные возможности. Это сделает конструкцию тесно связанной, потому что если вы хотите изменить суперкласс, вы должны знать все детали подклассов, чтобы избежать взлома

Это форма повторного использования программного обеспечения, когда новый класс (подкласс) создается из уже существующего класса (суперкласса), который расширяет функциональные возможности при использовании некоторых свойств суперкласса.

Так что если у вас есть класс Parents, то у вас есть класс Child, который расширяет класс Parent, Child наследует все, что есть у Person.

Выгоды:

  • Улучшить возможность повторного использования
  • Логически устанавливает отношения «есть»: например, собака — это животное
  • Модульный код
  • Избегайте двуличия

недостаток:

  • Тесно связанные : Подкласс зависит от реализации родительского класса, поэтому жесткая пара.

Абстракция:

Абстракция означает разработку класса с точки зрения их интерфейсов и функциональности, а не деталей их реализации. Абстрактный класс предоставляет интерфейсы без фактической реализации. Он отделяет реализацию объекта от его поведения или реализации. Абстракция уменьшает сложность, скрывая не относящиеся к делу детали.

Выгоды:

  • Используя абстракцию, мы можем отделить вещи, которые можно сгруппировать в другой тип.
  • Часто изменяющиеся свойства и методы могут быть сгруппированы в отдельный тип, так что основной тип не требует изменений. Это добавляет силы принципу OOAD — «Код должен быть открыт для расширения, но закрыт для модификации».
  • Упрощает представление моделей предметной области.

Разница между абстракцией и инкапсуляцией

Инкапсуляция — это стратегия, используемая как часть абстракции. Инкапсуляция относится к состоянию объектов — объекты инкапсулируют свое состояние и скрывают его снаружи; внешние пользователи класса взаимодействуют с ним через его методы, но не могут напрямую обращаться к состоянию классов. Таким образом, класс абстрагирует детали реализации, связанные с его состоянием.

Абстракция — более общий термин; это также может быть достигнуто путем (среди прочего) подкласса. Например, класс List в стандартной библиотеке является абстракцией для последовательности элементов, проиндексированных по их положению, конкретными примерами List являются ArrayList или LinkedList. Код, взаимодействующий со списком, абстрагируется от деталей того, какой вид списка он использует [Переполнение стека]

Абстракция часто невозможна без скрытия основного состояния путем инкапсуляции — если класс раскрывает свое внутреннее состояние, он не может изменить свои внутренние действия и, следовательно, не может быть абстрагирован

Что такое абстрактный класс и абстрактный метод?

В дизайне вы хотите, чтобы базовый класс представлял только интерфейс для его производных классов. Это означает, что вы не хотите, чтобы кто-либо на самом деле создавал объект базового класса. Вам нужно только выполнить upcast к нему (неявное upcasting, которое дает вам полиморфное поведение), чтобы можно было использовать его интерфейс. Это достигается тем, что этот класс является абстрактным с использованием ключевого слова abstract.

Предоставьте некоторое ограничение, чтобы не создавать экземпляр абстрактного класса, и тот, кто использует, должен реализовывать абстрактный метод. И обеспечить полиморфизм

Абстрактный класс может содержать как абстрактные методы, так и конкретные методы. В классе, если один метод объявлен как абстрактный, класс должен быть объявлен как абстрактный. Однако обратное утверждение не обязательно верно. Если класс объявлен как абстрактный класс, в нем может не быть абстрактного метода.

Если метод не обеспечивает фактическую реализацию, а просто предоставляет сигнатуру метода, он называется абстрактным методом. Фактическая реализация оставлена ​​для подклассов, которые расширяют абстрактный класс.

Абстрактный метод не может быть создан; другой класс может только расширить его.

Когда использовать абстрактный класс?

Абстрактные классы позволяют вам определять поведение по умолчанию и заставлять подклассы обеспечивать любое конкретное поведение.

Например: List является интерфейсом, тогда как AbstractList обеспечивает поведение List по умолчанию, которое можно использовать как есть или уточнять в подклассе, например, ArrayList.

Что такое интерфейс?

Ключевое слово interface продвигает эту концепцию абстрактного класса на шаг вперед, вообще предотвращая реализацию любого метода или функции. Вы можете только объявить метод или функцию, но не предоставить реализацию. Класс, реализующий интерфейс, должен обеспечивать фактическую реализацию. Интерфейс является очень полезным и часто используемым аспектом в дизайне ОО, так как он обеспечивает разделение интерфейса и реализации и позволяет вам :

Преимущества интерфейса:

  1. Множественное наследование
  2. Слабая связывающая абстракция операции как отдельная реализация подчеркивания слоя может быть чем угодно, JDBC, JPA, JTA и т . Д.
  3. Программа для интерфейса не реализована
  4. Полиморфизм с динамическим связыванием. Выявите интерфейс программирования объекта, не раскрывая его фактическую реализацию.
  5. Абстрактный слой: проблемы разделения

Разница между интерфейсом и абстрактным классом:

  • Интерфейс — это контракт, чтобы попросить классы (кто бы ни собирался реализовать интерфейс) реализовать интерфейс так, как он определяет интерфейс. Это пустая оболочка с объявлением метода.
  • Абстрактный класс задает некоторое общее поведение и просит подкласс определить необычное или специфическое поведение для этого класса
  • Методы и члены абстрактного класса могут быть определены с любой видимостью, тогда как все методы интерфейса должны быть определены как открытые
  • При наследовании абстрактного класса дочерний класс должен определять абстрактные методы, тогда как интерфейс может расширять другой интерфейс, и методы не должны быть определены
  • Дочерний класс может расширять только один абстрактный (или любой другой) класс, тогда как интерфейс может расширяться или класс может реализовывать несколько других интерфейсов.
  • Дочерний класс может определять абстрактные методы с такой же или менее ограничительной видимостью, тогда как класс, реализующий интерфейс, должен определять методы с точно такой же видимостью
  • Интерфейс не содержит конструктора, тогда как класс Abstract содержит.
  • Переменные, объявленные в интерфейсе Java, по умолчанию являются окончательными. Абстрактный класс может содержать не финальные переменные
  • Члены интерфейса Java являются общедоступными по умолчанию. Абстрактный класс Java может иметь обычные разновидности членов класса, такие как private, protected и т. Д.

Сочинение:

Повторное использование кода может быть достигнуто путем реализации наследования или компоновки, но композиционный подход к повторному использованию кода обеспечивает более сильную инкапсуляцию, чем наследование, потому что изменение внутреннего класса не должно нарушать какой-либо код, который опирается только на внешний интерфейс.

Композиция — это метод проектирования, позволяющий реализовать отношения в классах. Мы можем использовать наследование Java или состав объекта для повторного использования кода

Композиция о выражении отношений между объектами. Подумайте о примере стула. Стул имеет сиденье. Стул имеет спинку. И стул имеет множество ножек. Фраза «имеет» подразумевает отношения, когда стул владеет или, как минимум, использует другой объект. Именно это «имеет» отношения, которые являются основой для композиции

Выгоды:

  • Контролировать видимость
  • Реализация может заменить время выполнения
  • Слабосвязанный интерфейс класса не зависит от реализации.

Разница между составом и наследованием?

Нет . Композиция (имеет) Наследование (есть)
1 Выступает за полиморфизм и повторное использование кода Выступает за полиморфизм и повторное использование кода
2 Объект приобретается в состоянии «Готово» во время выполнения Объект получается динамически во время компиляции
3 Реализация может быть заменена во время выполнения Реализация может быть заменена во время компиляции
4 Подкласс не зависит от родительского класса и поддерживает слабую связь (особенно в интерфейсе) Подкласс зависит от реализации родительского класса, поэтому тесная пара
5 Используется, когда в доме есть ванная комната. Неверно говорить, что дом — это ванная Наследование является однонаправленным. например, дом это здание. Но здание не дом

Примечание. Не используйте наследование только для повторного использования кода. Если нет отношения «есть», используйте композицию для повторного использования кода.

Разница между композицией и агрегацией в объектных отношениях

Агрегация: Агрегация — это ассоциация, в которой один класс принадлежит коллекции. Это часть целых отношений, где часть может существовать без целого. Это более слабые отношения. Нет циклической зависимости. Пример: заказ и товар

Композиция: Композиция — это ассоциация, в которой один класс принадлежит коллекции. Это часть целых отношений, где часть не может существовать без целого. Если целое удаляется, то все части удаляются. Это более крепкие отношения. например, полигон и точки, порядок и детали заказа  

Рекомендации: