В этой статье мы обсуждаем часто задаваемые вопросы о концепции объектно-ориентированного программирования Java.

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

Интерфейс может иметь только абстрактные методы. Абстрактный класс может иметь абстрактные и неабстрактные методы. Это утверждение применимо только до версии Java 8. После Java 8 он может реализовывать конкретные методы в интерфейсе в виде метода по умолчанию или статического метода.

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

В приведенном выше примере в интерфейсе, если вы просто объявите int number = 10 . Java добавляет public, static и final к переменной. Так что вы можете напрямую получить доступ к этой переменной, используя имя интерфейса (InterfaceExample.number). Также интерфейс не допускает никаких модификаторов доступа, кроме public.

Интерфейс Java можно реализовать с помощью ключевого слова «реализует», а абстрактный класс можно расширить с помощью ключевого слова «extends».

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

Члены интерфейса Java по умолчанию общедоступны. Абстрактный класс Java может иметь такие члены класса, как private, protected и т. д.

В чем разница между абстрактным классом и интерфейсом в перспективе Java 8?

До Java 8 можно сказать, что интерфейс не может иметь никаких конкретных методов, и это было основным различием между абстрактным классом и интерфейсом, но теперь это не так.

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

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

На самом деле методы по умолчанию введены для обеспечения обратной совместимости и в то же время делают API-интерфейс коллекции более подходящим для использования внутри ключевых функций Java 8, таких как лямбда-выражения.

В чем разница между объектно-ориентированным программированием и процедурным программированием?

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

Объектно-ориентированное программирование имеет следующие преимущества перед процедурным программированием:

  • ООП обеспечивает четкую структуру программ.
  • ООП помогает сохранить код Java СУХИМ (не повторяйтесь).
  • ООП упрощает поддержку, изменение и отладку кода Java.
  • ООП позволяет создавать полностью повторно используемые приложения с меньшим количеством кода и более коротким временем разработки.

Зачем использовать генерирующие геттеры и сеттеры, не делая переменную общедоступной?

Основное различие между тем, чтобы сделать поле общедоступным, и его раскрытием через геттеры/сеттеры, заключается в том, что вы контролируете свойство. Если вы делаете поле общедоступным, это означает, что вы предоставляете прямой доступ вызывающей стороне. Затем вызывающий абонент может сделать что угодно с вашим полем, сознательно или неосознанно. Например, можно установить для поля нулевое значение, и если вы используете это поле в другом методе, это может взорвать этот метод с исключением нулевого указателя.

Но если вы предоставляете геттер/сеттер, вы предоставляете им непрямой доступ, получая при этом полный контроль. Единственный способ установить значение — через сеттер, а вы получаете значение через геттер, поэтому теперь у вас есть ровно одна точка входа и одна точка выхода для вашего поля, поскольку геттеры/сеттеры — это методы, которые позволяют использовать блоки кода, поэтому вы можете сделать проверки проверки на них! Объект принимает решение о том, следует ли вам установить значение вызывающего объекта или нет. То же самое относится к методу-получателю — вы можете принять решение вернуть реальную ссылку или клонировать ее и вернуть то же самое вызывающей стороне.

Какие существуют виды наследования?

Единичное наследование: относится к отношениям дочернего и родительского классов, когда класс расширяет другой класс.

Многоуровневое наследование: относится к отношениям дочернего и родительского классов, когда класс расширяет дочерний класс. Например, класс A расширяет класс B, а класс B расширяет класс C.

Иерархическое наследование: отношение дочернего и родительского классов, когда несколько классов расширяют один и тот же класс. Например, класс B расширяет класс A, а класс C расширяет класс A.

Множественное наследование: относится к концепции одного класса, расширяющего несколько классов, что означает, что дочерний класс имеет два родительских класса. Java не поддерживает множественное наследование.

Большинство новых OO языков, таких как Small Talk, Java, C#, не поддерживают множественное наследование. Множественное наследование поддерживается в C++.

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

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

public class Tomatto extends Vegitable, Fruit{}

Почему java не поддерживает множественное наследование, потому что это вызывает проблему алмаза. Я объясню вам на примере.

Бриллиантовая проблема

Предположим, что Java допускает множественное наследование. Тогда просто перейдите к приведенному ниже примеру.

В приведенном выше примере вы можете увидеть класс Tomato расширенный Fruit и Vegetable классами. Таким образом, класс Tomato содержит функции обоих родительских классов, такие как Fruit и Vegitable.. В основном классе (внутри класса Tomato) он вызывает метод use() метода Tomato. Итак, какой метод use() должен вызываться? Метод Fruit объектов use() или метод Vegitable объектов use()? Существует путаница в java. Это называется проблемой алмаза.

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

Простота

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

В чем разница между жесткой связью и свободной связью?

Сцепление относится к степени прямого знания о том, что один элемент имеет другой. Другими словами, как часто изменения в классе А вызывают соответствующие изменения в классе Б.

Сильная связь

В общем, сильная связь означает, что два класса часто меняются вместе. Другими словами, если A знает о способе реализации B больше, чем следует, то A и B тесно связаны.

Объясню подробно на примере.

В приведенном выше примере вы можете видеть, что объекты Circle object и DrawShape object тесно связаны. Потому что, если я изменю реализацию Circle object в DrawShape object другим объектом Rectangle. Мне нужно переписать код в DrawShape class как часть изменения. Мне нужно заменить код создания Circle object на создание Rectangle object. Кроме того, мне нужно изменить реализацию startDrawing method, которая соответствует Rectangle

Слабая связь

Проще говоря, слабая связь означает, что объекты в основном независимы. Если единственное знание о том, что классу A нужна зависимость от класса B, это то, что класс B открыл через свой интерфейс, то говорят, что класс A и класс B слабо связаны. Чтобы преодолеть проблемы тесной связи между объектами, структура Spring использует механизм внедрения зависимостей с помощью модели POJO/POJI, и посредством внедрения зависимостей можно добиться слабой связи.

Давайте немного изменим дизайн приведенного выше примера и сделаем его слабо связанным.

Здесь, в DrawShape class, если вы измените инициализацию shape variable на Rectangle, тогда она будет работать для прямоугольника. Вам не нужно менять много кода как часть переключения объекта прямоугольника на круг. Таким образом, мы можем сказать, что приведенный выше код слабо связан.

Можно ли сделать абстрактный метод синхронизированным, окончательным или статическим?

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

абстрактный и окончательный

конечное и абстрактное совершенно противоположны по своей природе. Конечный класс или метод не могут быть изменены дальше, если абстрактный класс или метод должны быть изменены дальше. Ключевое слово final используется для обозначения того, что класс или метод не нуждается в дальнейших улучшениях. Ключевое слово "abstract" используется для обозначения того, что класс или метод нуждается в дальнейших улучшениях.

абстрактный и синхронизированный

абстрактные методы не могут быть объявлены как синхронизированные. Но методы, переопределяющие абстрактные методы, могут быть объявлены как синхронизированные.

абстрактный и частный

Абстрактные методы не могут быть закрытыми. Если абстрактным методам разрешено быть частными, они не будут унаследованы подклассом и не будут расширены.