JavaRush /Java Blog /Random-JA /ジャワ。インタビュー リファレンス ガイド - パート 1 (記事の翻訳)
dah4uk
レベル 23

ジャワ。インタビュー リファレンス ガイド - パート 1 (記事の翻訳)

Random-JA グループに公開済み
元の記事は次のとおりです: http://www.javacodegeeks.com/2014/02/java-interview-reference-guide-part-1.html 投稿者: Nitin Kumar、Core Java、2014 年 2 月 3 日

ジャワ。オブジェクト指向の概念。

Java はオブジェクト指向の概念に基づいており、あらゆる問題を実際の方法で解決するためのより高いレベルの抽象化を実現します。オブジェクト指向のアプローチは、アプリケーションで再利用しやすい現実世界のオブジェクトの問題の解決策を概念化します。例: 椅子、扇風機、犬、コンピューターなど。Java では、クラスは、同じ種類のオブジェクトの一般的な動作を定義するドキュメント、テンプレート、またはプロトタイプです。インスタンスは特定のクラスの実装であり、クラスのすべてのインスタンスは、クラスの説明で示されているのと同様のプロパティを持ちます。たとえば、部屋の数を属性として持つ House というクラスを定義し、部屋が 2 つある家、部屋が 3 つある家などのオブジェクトを作成できます。
利点:
オブジェクト指向ソフトウェア開発の利点をいくつか以下に示します。
  • 主にモジュール化により、メンテナンスコストが削減されます。
  • 継承などの機能によりコードの再利用が容易になり、結果的に開発がスピードアップします。
  • コードの信頼性と柔軟性が向上します。
  • コードは現実世界をシミュレートしているため、理解しやすくなっています。
  • オブジェクトレベルでの抽象化が向上しました。
  • ある開発段階から別の開発段階への移行の複雑さを軽減します。
OOP には 4 つの主な概念があります。
  • カプセル化
  • 継承
  • ポリモーフィズム
  • 抽象化
カプセル化:
カプセル化は、どの要素が非表示になり、どの要素が他のオブジェクトに公開されるかを示す、他のオブジェクトのルールを表します。Java では、private アクセス修飾子を使用してメソッドを非表示にし、外部環境からの変数へのアクセスを制限します。Java には、デフォルトの public、protected、private などのさまざまなアクセス修飾子も用意されており、これらはさまざまなレベルで可視性を制限するために使用されますが、カプセル化の最終的な目標は、変更すべきでない要素を非表示にすることです。実際には、クラスが変更する理由が 1 つだけであり、カプセル化がその「1 つの理由」の設計原則を実装する場合が最適です。実際には、カプセル化は他のクラスの中断を避けるためにメソッドを非表示にすることになっています。
利点:
カプセル化の利点をいくつか以下に示します。
  • オブジェクトの属性を非表示にすることで、オブジェクトの内部状態を保護できます。
  • これにより、コードのモジュール性が高まり、予期しない方法でのオブジェクト間の相互作用が防止されます。
  • 使いやすさが高まります。
  • オブジェクト固有の条件がサポートされています。
  • カプセル化によりソフトウェアの保守が容易になります
  • Изменения codeа могут быть независимыми
Полиморфизм:
Полиморфизм - это способность (в программировании) представить тот же интерфейс для различных форм (типов данных), лежащих в основе. Это означает, что классы имеют различную функциональность, несмотря на то, что используют общий интерфейс и могут быть вызваны динамически через специальную ссылку класса. Классическим примером является класс Shape (фигура), и все классы, которые могут наследоваться от него (квадрат, круг, додекаэдр, неправильный многоугольник, знак и т.д.). В этом примере, каждый класс будет иметь свою собственную функцию Draw() и клиентский code может выполнять следующие действия: Shape shape = new Square(); Shape.area() чтобы получить корректное поведение для любой формы. Прелесть полиморфизма в том что code работает с различными классами и нет необходимости знать Howой класс его использует, т.к. все они работают по одному принципу. Процесс, используемый Объектно-Ориентированными языками программирования, реализующий динамический полиморфизм, называется динамическим связыванием. Примечание: Полиморфизм - это возможность выбора более специализированных методов в зависимости от выполнения вызванного an object. Полиморфизм так же может использоваться без участия Howих-либо абстрактных классов.
Преимущества:
  • Создается code, используемый повторно: это значит, что если однажды созданы классы, реализованы и протестированы, то они могут быть легко использованы, не заботясь о том, что написано в классе.
  • Это обеспечивает более общий и слабосвязанный code.
  • Время компиляции значительно уменьшается, а разработка становится быстрее.
  • Динамическое связывание: Один и тот же интерфейс может быть использован для создания методов с различными реализациями.
  • Полная реализация может быть заменена с помощью сигнатуры метода.
Переопределение метода для достижения Полиморфизма: Переопределение интерфейсов с двумя методами: Один в родительском классе, а другой в дочернем классе с такими же именами и сигнатурами. Переопределение позволяет определить ту же самую операцию по-разному для разных типов данных Например: while(it.hasNext()) { Shape s = (Shape) it.next(); totalArea += s.area(dim); //полиморфический вызов метода. Будет вызван правильный an object. } ジャワ。 インタビュー リファレンス ガイド - パート 1. (記事の翻訳) - 1
Перегрузка метода or Специальный полиморфизм or статический полиморфизм:
Перегрузка интерфейсов с несколькими методами в том же классе с тем же именем, но с другим телом метода. Перегрузка метода позволяет определить ту же операцию по-разному для различных данных. Какое-то время она называлась статическим полиморфизмом, но на самом деле это не полиморфизм. Перегрузка методов является не более чем двумя методами, с одинаковыми именами, но различными списками аргументов. Она не имеет ничего общего с наследованием и полиморфизмом. Перегруженный метод, это не то же самое, что и переопределенный метод. [Глава первая Java]
Параметрический полиморфизм с использованием дженериков в Java:
При объявлении класса, Name поля можно связать с различными типами и Name метода так же можно ассоциировать с различными параметрами и возвращаемыми типами. Java поддерживает параметрический полиморфизм с использованием дженериков. Примером является список, который может принимать тип данных, содержащих дженереки. List list = new ArrayList ();
Почему мы не можем переопределить статический метод в Java?
Переопределение зависит от наличия экземпляра класса. Смысл полиморфизма заключается в том, что вы можете создать подкласс класса и an object реализует этот подкласс, будет разное поведение одних и тех же методов, определенных в суперклассе (or переопределенных в подклассе). Статический метод не связан с Howим-либо экземпляром класса, так что это понятие к нему не применяется. Ранее выдвигались две основные идеи, продвижения разработки на Java, которые повлияли на неё. Одна из них - это отношение к производительности: было много критики со стороны Smalltalk о том, что JVM работала слишком медленно (из-за сбора мусора и полиморфных вызовов, которые были частью этой причины) и разработчики Java были вынуждены исправить это. Другая состояла в том, что целевая аудитория для Java - это были разработчики C++. Вызов статических методов устроен знакомым для программистов C++ образом и работает так же быстро, потому что нет пути вверх по иерархии классов, и чтобы выяснить, Howой метод нужно вызвать, ты отправляешься прямо в класс и вызываешь указанный метод. [Stack overflow]
Наследование:
Оно включает поведения (т.е. методы) и состояния (т.е. переменные) базового класса в производный класс, таким образом, чтобы они были доступны в этом производном классе. Ключевое преимущество наследования состоит в том, что оно обеспечивает формальный механизм повторного использования codeа и позволяет избежать дублирования. Унаследованный класс расширяет функциональность applications, повторно используя родительское поведение и добавляя новую функциональность. Это сделает проектирование плотно связанным, потому что если вы хотите изменить суперкласс, вы должны знать все детали подклассов, чтобы избежать поломки applications. Это форма повторного использования ПО, когда новый класс (подкласс) создается из уже существующего класса (суперкласса) и расширяет свою функциональность, при этом используя некоторые свойства суперкласса. Итак, если у вас есть класс-родитель, а потом у вас появляется класс-наследник, то наследник наследует все сущности, которыми обладает родитель.
Преимущества:
  • Легче повторно использовать code
  • Устанавливается логическое отношение "Является кем-то", Например: Собака является животным.
  • Код становится модульным
  • Позволяет избегать дублирования
Недостатки:
  • Тесная связь: подкласс зависит от реализации родительского класса, что делает code тесно связанным.
Абстракция:
Абстракция представляет собой разработку класса из условий интерфейсов и их функциональности, не учитывая детали их реализации. Абстрактный класс включает интерфейсы без фактической реализации. Он отделяет реализацию an object от поведения or реализации. Абстракция упрощает разработку, скрывая несущественные детали.
Преимущества:
  • При использовании абстракции, мы можем выделить an objectы, которые могут быть сгруппированы в другой тип.
  • Часто изменения свойств or методов могут быть сгруппированы в отдельный тип, причем главный тип останется без изменений. Это усorвает принцип Объектно-Ориентированного Анализа и Дизайна - "Код должен быть открыт для расширения, но закрыт для модификации".
  • Упрощает представление моделей предметной области.
Различия между абстракцией и инкапсуляцией
Инкапсуляция - это стратегия, используемая в рамках абстракции. Инкапсуляция относится к состоянию an objectов - an objectы инкапсулируют свое состояние и скрывают его от доступа извне; снаружи пользователи класса могут взаимодействовать с его методами, но не могут получить доступ к составляющим класса напрямую. Таким образом класс абстрагирует детали реализации, относящиеся к его состоянию. Абстракция - это более общий термин; ее так же можно достигнуть путем использования подклассов (среди прочих). Например, список классов в стандартной библиотеке - это абстракция для последовательности элементов, проиндексированных по их позиции, конкретными примерами List'а будут ArrayList or LinkedList. Код, который взаимодействует со списком абстракций более детален, чем вид используемого списка. [Stack overflow] Абстракция часто невозможна, без скрытия инкапсуляцией деталей, лежащих в основе - если класс предоставляет свое внутреннее состояние, он не может изменить свою внутреннюю работу, и, следовательно, не может абстрагироваться.
What такое абстрактный класс и абстрактный метод?
В проектировании, вы хотите, чтобы базовый класс представлял только интерфейс для своих производных классов. Это значит, вы не хотите, чтобы кто-нибудь создавал экземпляр an object этого класса. Вы только хотите, чтобы было приведение к типу (неявное приведение к базовому типу, которое дает вам полиморфное поведение), так что этот интерфейс может быть использован. Это достигается путем указания класса абстрактным, при этом используется ключевое слово abstract. Существуют некоторые ограничения: нельзя создать экземпляр абстрактного класса, следует использовать только тот класс, который реализует абстрактные методы. И обеспечивает полиморфизм. Абстрактный класс может содержать How абстрактные методы, так и конкретные методы. В классе, если один метод объявлен абстрактным, класс должен быть объявлен абстрактным. Однако, обратное не всегда верно. Если класс объявлен How абстрактный, он может не иметь абстрактных методов в нем. Если метод не обеспечивает фактическую реализацию, но обеспечивает сигнатуру метода, он называется абстрактным методом. Фактическая реализация возлагается на подклассы, которые расширяют абстрактный класс. Абстрактный метод не может быть реализован; только другой класс может наследоваться от него.
Когда используется абстрактный класс?
Абстрактные классы помогают определить некоторые типы поведения по умолчанию и обеспечить подклассам Howое-то конкретное поведение. Например: List - это интерфейс, в то время How AbstractList реализует поведение по умолчанию List'а, который может быть использован How есть or может быть реализован в подклассе, например How ArrayList.
What такое Интерфейс?
Ключевое слово interface перенимает концепцию абстрактного класса дальше, препятствуя реализации любого метода or функции для всех. Вы можете только объявить метод or функцию, но не обеспечить реализацию. Класс, который реализует интерфейс, должен обеспечивать фактическую реализацию. Интерфейс является крайне эффективным и широко используемым аспектом в Объектно-Ориентированном проектировании, так How он обеспечивает разделение интерфейса и реализации, и позволяет:
Преимущества интерфейсов:
  • Множественное наследование
  • Свободные парно-определенные абстракции операций, How отдельный тип реализации, могут быть чем угодно: JDBC, JPA, JTA, и т.д.
  • Интерфейс программы не реализуется.
  • Полиморфизм с динамическим связыванием - выявляет an object программного интерфейса, не раскрывая его фактической реализации.
  • Абстрактный уровень: Проблемы разделения
Difference между интерфейсом и абстрактным классом:
  • Интерфейс представляет собой соглашение, по которому опрашиваются классы, реализующие интерфейс, How они определяют этот интерфейс. Это пустая оболочка с объявлением метода.
  • Абстрактный класс определяет некоторое общее поведение и задает подклассу свойство определить редкое or специфичное поведение для этого класса.
  • Методы и члены абстрактного класса могут быть определены с любым типом видимости, в то время How все методы интерфейсов должны быть определены How public.
  • При наследовании от абстрактного класса, дочерний класс должен определить абстрактные методы, в то время How интерфейс может расширять другой интерфейс и методы не должны быть определены.
  • Дочерний класс может наследоваться только от одного абстрактного (or любого другого) класса, в то время How интерфейс or класс может наследоваться от нескольких других интерфейсов.
  • Дочерний класс может реализовать абстрактные методы с тем же самым or менее ограниченным уровнем видимости, в то время How класс, реализующий интерфейс должен определить методы с тем же уровнем видимости.
  • Интерфейс не может содержать конструкторы, в отличии от Абстрактного класса.
  • Переменные, объявленные в интерфейсе Java по умолчанию имеют модификатор доступа final. Абстрактный класс может содержать переменные не только с модификатором final.
  • Методы интерфейса в Java имеют модификатор доступа public по умолчанию. Абстрактный класс в Java может иметь обычные модификаторы доступа, такие How private, protected и т.д.
Композиция:
Возможность многократного использования codeа может быть достигнута благодаря реализации наследования or композиции, но композиционный подход к повторному использованию codeа обеспечивает более сильную инкапсуляцию, чем наследование, потому что изменение back-end класса не должно разрушить code, который полагается только на front-end класс. Композиция - это методика проектирования для реализации существующих связей в классах. Мы можем использовать наследование Java or композицию для повторного использования codeа. Композиция выражает связи между an objectми. Например, представьте стул. Стул имеет сиденье. Стул имеет спинку. И имеет набор ножек. Фраза "имеет" подразумевает отношения, где стул владеет чем-либо, or How минимум, он использует другой предмет. Именно такие отношения вида "Имеет" и являются основой для составления композиции.
Преимущества:
Композиция (иметь) Наследование (являться)
1 Поддерживает полиморфизм и повторное использование codeа Поддерживает полиморфизм и повторное использование codeа
2 Объект создается во время работы Объект создается динамически во время компиляции
3 Реализация может быть изменена во время выполнения Реализация может быть изменена во время выполнения
4 Подкласс не зависит от родительского класса, что способствует ослаблению связей (в частности, в интерфейсе управления) Подкласс зависит от реализации родительского класса, поэтому они плотно связаны
5 Используется, например, когда в Доме есть Ванная. Некорректно говорить, что Дом - это Ванная. Наследование является однонаправленным. Например: Дом это Здание. Но Здание не обязательно является Домом.
Примечание: Не используйте наследование только для того, чтобы получить возможность повторно использовать code. Если нет отношения типа "являться" между классами, то нужно использовать композиция для повторного использования codeа.
Различия между Композицией и Агрегацией в отношениях an objectов
集約:集約は、1 つのクラスがコレクションに属する共用体です。全体がなくても部分が存在できる関係において、彼は全体の一部です。これは弱い関係です。循環依存性はありません。例: 注文と製品。 構成:構成は、1 つのクラスがコレクションに属する結合です。それは全体の一部であり、全体がなければ部分は存在できません。全体を削除すると、部分もすべて削除されます。この関係はより強いものになります。例としては、ポリゴンとポイント、順序付けと順序付けの手順などがあります。
リンク:
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION