JavaRush /Java Blog /Random-JA /JAVA オブジェクト指向プログラミングの概念
shabnahm
レベル 18

JAVA オブジェクト指向プログラミングの概念

Random-JA グループに公開済み
JAVA はオブジェクト指向プログラミングの概念に基づいており、より高い抽象レベルに移行して、現実的な方法で問題を解決できます。オブジェクト指向のアプローチでは、アプリケーションで再利用しやすい現実世界のオブジェクトという観点から問題の解決策を概念化します。たとえば、Chair(椅子)、Fan(扇風機)、Dog(犬)、Computer(コンピュータ)などです。JAVA では、クラスは、特定のタイプのオブジェクトの一般的な動作を定義するレイアウト、テンプレート、またはプロトタイプです。インスタンスはクラスの個別の実装であり、クラスのすべてのインスタンスは同じプロパティを持ちます。これらのプロパティはクラス定義に記述されています。たとえば、属性として部屋の数を指定して House という名前のクラスを定義し、2 部屋の家、3 部屋の家などのクラスのインスタンスを作成できます。JAVA オブジェクト指向プログラミングの概念 - 1利点: オブジェクト指向ソフトウェア開発のいくつかの利点を以下に示します。
  • ソフトウェア サポート コストが削減されます。これは主にモジュール形式で実行されるためです。
  • 継承などの機能によりコードの再利用が向上し、ソフトウェア開発が迅速化されます。
  • コードの信頼性と柔軟性が向上します。
  • 現実世界のシミュレーションによる理解の容易さ。
  • オブジェクトレベルでの抽象化が向上しました。
  • ある開発フェーズから別の開発フェーズへの移行の複雑さを軽減します。
OOP には 4 つの主な特徴があります。
  • カプセル化
  • 継承
  • ポリモーフィズム
  • 抽象化

カプセル化

カプセル化は、オブジェクトが何を隠すべきか、また他のオブジェクトがアクセスできるように何を開くべきかをオブジェクトに対して取り決める役割を果たします。JAVA では、アクセス修飾子を使用してprivateメソッドを隠し、外部からの変数へのアクセスを制限します。publicJAVA には、さまざまなアクセス修飾子 ( 、default、protected、 )もありprivate、これらはさまざまなレベルで可視性を制限するために使用されます。しかし、最終的な目標は、変更すべきではないものをカプセル化することです。最も効果的なアプローチは、クラスが変更する理由を 1 つだけ持つべきであり、カプセル化によってその「1 つの理由」の設計が現実になります。カプセル化の正しいアプローチは、他のクラスに損傷を与えないように、頻繁に変更されるものを非表示にすることです。 利点: カプセル化の利点の一部を以下に示します。
  • オブジェクトの属性を非表示にすることで、オブジェクトの内部状態を保護できます。
  • これにより、オブジェクトが予期しない方法で相互作用することが防止されるため、コードのモジュール性が向上します。
  • コードの使いやすさが向上します。
  • これは、特定のエンティティの契約関係をサポートします。
  • カプセル化により、ソフトウェアの保守が容易になります。
  • コードへの変更は、それぞれ独立して行うことができます。

ポリモーフィズム

プログラミングにおけるポリモーフィズムとは、異なる基礎となるフォーム (データ型) に同じインターフェイスを提供する機能です。これは、異なる機能を持つクラスが同じインターフェイスを共有し、パラメータを参照渡しすることで動的に呼び出すことができることを意味します。典型的な例は、クラスShape(形状) とそれを継承するすべてのクラスです: square(正方形)、circle(円)、dodecahedron(12 面体)、irregular polygon(不規則な多角形)、splat(ブロブ) など。この例では、各クラスに独自のメソッドがありDraw()、クライアント コードは次のことを行うだけで済みます。
Shape shape = new Shape();
Shape.area()ポリモーフィズムの利点は、異なるクラスを操作するコードが、すべて同じ原理で動作するため、どのクラスを使用しているかを認識する必要がないことです。動的ポリモーフィズムを実装するためにオブジェクト指向プログラミング言語で使用されるプロセスは、動的バインディングと呼ばれます。 注:ポリモーフィズムとは、オブジェクトに応じて、実行するより具体的なメソッドを選択する機能です。ポリモーフィズムは、抽象クラスが関与していない場合に発生します。 利点:
  • 再利用可能なコードを作成します。つまり、クラスを作成、実装、テストすると、実際に何が書かれているかを気にすることなく、自由に使用できるようになります。
  • これにより、より汎用的で疎結合なコードが可能になります。
  • コンパイル時間が短縮され、開発がスピードアップします。
  • 動的リンク。
  • 同じインターフェイスを使用して、異なる実装のメソッドを作成できます。
  • 同じメソッド シグネチャを使用して実装全体を置き換えることができます。
ポリモーフィズムの一部としてのメソッドのオーバーライド。オーバーライドは、親クラスのメソッドと派生クラスのメソッドという 2 つのメソッドと対話します。これらのメソッドは同じ名前とシグネチャを持ちます。オーバーライドを使用すると、異なるタイプのオブジェクトに対して異なる方法で同じ操作を実行できます。例えば:
while(it.hasNext()) {
Shape s = (Shape) it.next();
totalArea += s.area(dim); //будет применен полиморфизм и вызван нужный метод для каждого an object.
}
JAVA オブジェクト指向プログラミングの概念 - 2メソッドのオーバーロード、アドホックなポリモーフィズム、または静的ポリモーフィズム オーバーロードは、同じ名前を持つがメソッド シグネチャが異なる同じクラスの複数のメソッドと対話します。リロードを使用すると、同じ操作を異なるデータに対して異なる方法で記述することができます。静的ポリモーフィズムと呼ばれることもありますが、実際にはポリモーフィズムではありません。これは、単に同じ名前を持つ 2 つのメソッドがあり、引数のリストが異なるだけです。再起動は継承やポリモーフィズムとは何の関係もありません。また、オーバーロードされたメソッドは、オーバーライドされたメソッドとまったく同じではありません。 JAVA での生成によるパラメトリック多態性 クラスを宣言するとき、名前フィールドをさまざまな型に関連付けたり、メソッド名をさまざまなパラメータや戻り値の型に関連付けたりできます。JAVA は、ジェネリックスを使用してパラメトリックポリモーフィズムをサポートします。
List<String> list = new ArrayList<String>();
JAVA では静的メソッドをオーバーライドできないのはなぜですか? オーバーライドは、クラスのインスタンスの存在に依存します。ポリモーフィズムの考え方は、サブクラスを作成でき、それらのサブクラスによって実装されたオブジェクトが、親クラスの同じメソッド (サブクラスでオーバーライドされる) に対して異なる動作をするということです。静的メソッドはクラスのどのインスタンスにも関連付けられていないため、それ自体をオーバーライドするという概念は適用できません。JAVA の作成者は、このアプローチに影響を与えた 2 つの考慮事項に基づいて行動しました。まず、コード実行の問題があります。Smalltalk は遅いということで多くの批判があり (ガベージ コレクションとポリモーフィズムがこの問題の一部でした)、JAVA はこれを回避するように設計されています。2 番目の考慮事項は、JAVA の対象ユーザーを C++ 開発者にするという決定でした。静的メソッドをこの方法で動作させることは、C++ プログラマーにとって非常に馴染みのあるものであり、どのメソッドを呼び出すかを判断するためにクラス階層を遡る必要がなくなるため、処理の速度も向上しました。クラスに直接移動して、特定のメソッドを呼び出します。

継承

継承とは、基本クラスの動作 (つまり、メソッド) と状態 (つまり、変数) を派生クラスに組み込んで、その派生クラスで使用できるようにする行為です。継承の主な利点は、コードを再利用するための正式なメカニズムを提供し、重複を回避できることです。継承されたクラスは、親クラスの動作をコピーし、新しい機能を追加することによって、アプリケーションの機能を拡張します。これにより、コードが高度に結合されます。スーパークラスを変更したい場合は、コードを壊さないようにサブクラスの詳細をすべて知っておく必要があります。継承はソフトウェア再利用の一形態であり、既存のクラス (スーパークラス) から新しいクラス (サブクラス) が作成され、その機能を拡張し、スーパークラスのプロパティの一部を使用します。したがって、親クラスがあり、その後に子クラスが出現すると、子は親が持つすべてのものを継承します。 利点:
  • コードの再利用が改善されました。
  • 「is a」(誰か、何か)という論理関係が成立します。例:動物 です。(犬は動物です)。
  • コードのモジュール化。
  • 繰り返しは除外されます。
欠陥:
  • 密結合:サブクラスは親クラスの実装に依存するため、コードは密結合になります。
他に読むべきもの:

Java 開発者グループ:

抽象化

抽象化とは、実装の詳細を考慮せずに、インターフェイスと機能に基づいてクラスを設計することを意味します。抽象クラスは、実際の実装を含まずにインターフェイスを表します。これは、オブジェクトの実装とその動作を区別します。抽象化により、重要でない詳細が非表示になり、コードが簡素化されます。 利点:
  • 抽象化を使用すると、あるタイプにグループ化できるものを分離できます。
  • 頻繁に変更されるプロパティとメソッドを別のタイプにグループ化して、メインのタイプが変更されないようにすることができます。これは、 「コードは拡張に対してオープンであるべきだが、変更に対してはクローズであるべきである」という OOP 原則を強化します。
  • 抽象化により、ドメイン モデルの表現が簡素化されます。
抽象化とカプセル化の違い カプセル化は、抽象化の一部として使用される戦略です。カプセル化とはオブジェクトの構造を指します。オブジェクトはそのプロパティをカプセル化し、外部アクセスから隠します。クラスのユーザーは、そのメソッドを使用してクラスと対話しますが、クラス構造に直接アクセスすることはできません。このようにして、クラスはその設計に関連する実装の詳細を抽象化します。抽象化はより一般的な用語です。これは、特にサブクラスを使用して実現することもできます。たとえば、List標準ライブラリのクラス (リスト) は、リスト内の位置に従ってインデックスが付けられた一連の要素の抽象化です。リストの具体例は、またはListです。リストと対話するコードは、使用するリストの詳細を抽象化します。多くの場合、カプセル化を使用して基礎となる状態を隠蔽しない限り、抽象化は不可能です。クラスが内部構造を公開すると、内部操作を変更できないため、抽象化できません。 抽象クラスと抽象メソッドとは何ですか? 開発中に、基本クラスがその派生クラスへのインターフェイスのみを提供するようにしたい場合があります。つまり、誰にも基本クラスのインスタンスを作成させたくありません。オブジェクトをキャストするだけの方法でインターフェイスを使用する必要があります (これはポリモーフィックな動作を可能にする暗黙的なキャストです)。これは、キーワード を使用してこのクラスを抽象化することで実現されます。このため、抽象クラスのインスタンスを作成できないなどの制限があり、抽象クラスを使用する場合は抽象メソッドを実装する必要があります。これによりポリモーフィズムが保証されます。抽象クラスには、抽象メソッドと具象メソッドの両方を含めることができます。クラス内の少なくとも 1 つのメソッドが抽象として宣言されている場合は、クラス全体も抽象として宣言する必要があります。ただし、逆方向のルールは遵守する必要はありません。クラスが抽象として宣言されている場合、そのクラスには抽象メソッドが含まれていない可能性があります。シグネチャを定義するだけで実装を提供しないメソッドは、抽象メソッドと呼ばれます。実際の実装は、抽象クラスを拡張するサブクラスに委ねられます。抽象メソッドはオブジェクトでは使用できず、別のクラスのみがそれを拡張できます。 抽象クラスを使用する必要があるのはどのような場合ですか? 抽象クラスを使用すると、いくつかのデフォルトの動作を定義し、サブクラスに特定の動作を提供させることができます。例: (list) はインターフェイスであり、リストの基本的な動作を定義します。これはそのまま使用することも、サブクラス (たとえば (リスト配列) 内) で改良することもできます。 ArrayListLinkedListListabstractListAbstractListArrayListインターフェースとは何ですか? インターフェイスの概念は抽象クラスですが、インターフェイス (キーワードによって定義されるinterface) はさらに一歩先を行きます。これにより、メソッドや関数の実装がまったく妨げられます。メソッドまたは関数を宣言することはできますが、その実装を提供することはできません。インターフェイスを実装するクラスは、実際の実装を処理する必要があります。インターフェイスは非常に便利で、OOP で広く使用されています。これらはインターフェイス自体と実装を共有するため、使用すると多くの利点が得られます。
  1. 多重継承
  2. 疎結合。階層化などの操作の抽象化があり、具体的な実装は JDBC、JPA、JTA など何でも構いません。
  3. インターフェースプログラムは実装されていません
  4. 動的バインディング多態性: オブジェクトのプログラミング インターフェイスは、実際の実装を明らかにすることなく公開されます。
  5. 抽象レベル、機能の分離。
インターフェースと抽象クラスの違い。
  • インターフェイスは、このインターフェイスを実装するクラスとの契約関係であり、インターフェイスによって指定された方法で実装が行われることを示します。これはメソッドが宣言された空のシェルです。
  • 抽象クラスは、いくつかの一般的な動作を定義し、そのサブクラスに、そのクラスの非定型または特定の動作を定義するように依頼します。
  • 抽象クラスのメソッドとメンバーは任意のアクセス修飾子で指定できますが、すべてのインターフェイス メソッドはパブリックである必要があります。
  • 抽象クラスを継承する場合、子孫クラスは抽象メソッドを定義する必要がありますが、インターフェイスは必ずしもメソッドを定義しなくても別のインターフェイスを継承できます。
  • 子孫クラスは 1 つの抽象クラスのみを拡張できますが、インターフェイスは拡張したり、クラスが他の多くのインターフェイスを実装したりできます。
  • 子孫クラスは、同じまたはより制限の少ないアクセス修飾子を使用して抽象メソッドを定義できますが、インターフェイスを実装するクラスは、同じレベルの可視性を持つメソッドを定義する必要があります。
  • インターフェイスにはコンストラクターが含まれませんが、抽象クラスにはコンストラクターが含まれます。
  • Java インターフェースで宣言された変数は、デフォルトでは Final です。抽象クラスには、最終的な変数ではない変数を含めることができます。
  • Java インターフェースのすべてのメンバーは ですpublic。抽象クラスのメンバーは、などにすることができますpublicprotected

構成

コードの再利用は、継承と合成の両方を使用して実現できます。ただし、合成を使用すると、バックエンド クラスへの変更が必ずしもフロントエンド クラスに属するコードに影響を与えるわけではないため、継承よりも高いレベルのカプセル化が実現します。構成は、クラス内で「has-a」(has、includes) 関係を使用する設計手法です。Java 継承とオブジェクト合成の両方を使用してコードを再利用できます。構図の本質は、オブジェクト間の「ある」関係を表現することです。椅子について考えてみましょう。椅子には座面が付いています。椅子には背もたれがあります。椅子には一定の数の脚があります。「ある」という表現は、椅子が別の物体を持っているか、少なくともそれを使用している関係を示唆しています。これはまさに「ある」関係であり、構図の基礎となっています。 利点:
  • 可視性の制御
  • 実装は実行時に置き換えることができます
  • インターフェイス クラスが実装に依存しないため、疎結合になります。
合成と継承の違い
いいえ。 構成 (/ が付いています) 継承 (は / です)
1 ポリモーフィズムとコードの再利用をサポートします。 ポリモーフィズムとコードの再利用をサポートします。
2 ランタイム オブジェクトはすでに作成されています。 オブジェクトはコンパイル時に動的に作成されます。
3 実装は実行時に置き換えることができます。 実装はコンパイル時に変更できます。
4 サブクラスは親クラスから独立しているため、(特にインターフェイス制御下で) 疎結合が有利になります。 サブクラスは親クラスの実装に依存しているため、バインディングは強力であると見なされます。
5 用途: 家にはバスルームがあります。家がバスルームだというのは間違いです。 継承は一方向です。家は建物です。しかし、建物は家ではありません。
注:コードを確実に再利用するためだけに継承を使用しないでください。「である」という関係がない場合、これらの目的で合成が使用されます。 合成と集約の違いはオブジェクトの関係にあります。 集約は、1 つのクラスがコレクションに収まる関係です。それは関係全体の一部であり、全体がなくても部分が存在する可能性があります。そのような関係ははるかに弱いです。循環依存性はありません。例: 注文と製品。 構成とは、1 つのクラスがコレクションに収まる関係です。それは関係全体の一部であり、全体がなければ部分は存在できません。全体が破壊されると、その構成要素もすべて破壊されます。それはより強い関係です。例: ポリゴンとその頂点、オーダーとそのコンポーネント。
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION