『Javaプログラミング思想』ノート——対象とクラス向け

4825 ワード

1、対象向けプログラミングの概要
オブジェクト向けはプログラム設計方法、またはプログラム設計規範であり、その基本思想はオブジェクト、クラス、継承、パッケージ、多態などの基本概念を用いてプログラム設計を行うことである.対象に向かうのは人々の思考習慣に合った思想であり、複雑なことを簡単にし、プログラマーを実行者から指揮者に変えることができる.オブジェクト向けフィーチャー:•カプセル化(encapsulation)•継承(inheritance)•マルチステート(polymorphism)
2.javaシングル継承の利点:C++のマルチ継承に比べて、javaはクラスの単一継承のみをサポートし、java内のすべてのクラスの共通ベースクラスはObjectクラス、Objectクラスjavaクラスツリーの唯一のルートノードであり、この単一継承には以下の利点があります.
  • 単一継承は、すべてのオブジェクトが共通の特性を持っていることを保証します.これにより、JVM仮想マシンがすべてのクラスをシステムレベルで操作するのに便利になり、すべてのjavaオブジェクトがメモリスタックで容易に作成され、パラメータを渡すのに便利になります.
  • javaの単一継承により、JVMがすべてのオブジェクトのタイプ情報を知っていることを保証できるため、ゴミ回収機能の実現が容易になります.

  • 3.マルチステート:
    オブジェクト向けプログラミングでは、子クラスに親と同じメソッドの署名を持つメソッドを子クラスメソッドと呼び、親メソッドを上書きします.子クラスメソッドのアクションを呼び出すと、子クラスの具体的なタイプを明確に知る必要はありません.子クラスタイプを親と見なす参照でメソッドを呼び出すだけで、実行時に、JVMは、参照オブジェクトの特定のサブクラスタイプに基づいて、対応するメソッドを呼び出します.これがマルチステートです.マルチステートは、コードの組織構造と可読性を改善するだけでなく、拡張性のあるプログラムを作成することもできます.
    マルチステートの基礎はjavaがオブジェクト向けにプログラミングする遅いバインドメカニズムである.プログラミングには、次の2つのバインドメカニズムがあります.
  • 前期バインド:一般的に非オブジェクト向けプログラミング言語で使用され、プログラムコンパイル時に特定の呼び出しメソッド体のメモリアドレスが計算される.
  • 動的バインド/ランタイムバインド:オブジェクト向けプログラミング言語でよく使用され、プログラムコンパイル時に特定の呼び出しメソッドのメモリアドレスを計算することができず、メソッドパラメータタイプと戻り値タイプの検証のみを行い、実行時に特定の呼び出しメソッドのメモリアドレスを決定することができる.Javaではstaticメソッドとfinalメソッド以外のすべてのメソッドがポストバインドされています.

  • 4.タイプ変換:
    Javaには、アップタイプ変換(upcast)とダウンタイプ変換(downcast)の2つの一般的なタイプ変換があります.
  • アップタイプ変換(upcast):アップタイプ変換は、サブクラスオブジェクトの強制タイプを親クラスタイプに変換し、古典的な使用法はオブジェクト向けのマルチステート特性です.アップタイプに変換すると、サブクラスオブジェクトのプロパティは表示されず、親から継承されたプロパティのみが表示されます.アップタイプに変換すると、コンパイラはタイプ互換性があるかどうかを自動的にチェックします.通常は安全です.
  • 下向きタイプ変換:下向きタイプ変換は親タイプを強制的にサブクラスタイプに変換し、変換後、親に見えないサブクラスの特性が可視性を回復し、下向きタイプ変換の場合、コンパイラはタイプ互換性があるかどうかを自動的に検出できず、タイプ変換エラーの実行時異常が発生し、通常は安全ではありません.

  • アップグレード時には、任意のフィールドアクセス操作はコンパイラによって解析されるため、マルチステートではありません.
    5.メソッドリロード(overloading)
    メソッドは同名で、パラメータリストが異なることをメソッドリロードと呼びます.メソッドの戻り値のタイプが異なるとメソッドリロードとして使用できないことに注意してください.
    6.組合せと継承の間で選択
  • is-a継承:1つのクラスは類似の機能を持つ別のクラスを継承し、必要に応じて継承されたクラスに基づいて拡張されます.利点:共通のプロパティとメソッドを持つクラスは、共有情報を親クラスに抽象化し、コードの多重性を強化し、マルチステートの基礎にもなります.欠点:サブクラスの拡張部分は親クラスに表示されず、共通性が少ない場合は継承を使用すると冗長コードが増加します.
  • has-a組合せ:has-a組合せは、1つのクラスで別のクラスをメンバー変数として参照します.利点:拡張性と柔軟性が高い.オブジェクトの組合せ関係ではhas-a組合せ関係を優先的に考慮する必要があります.欠点:共通性のあるクラス間には派生関係が見られない.

  • コンビネーション・テクノロジーは、インタフェースではなく、新しいクラスで既存のクラスの機能を使用したい場合に一般的に使用されます.
    7.javaインスタントコンパイル技術(JIT):
    JavaのJITはjust-in-time complier技術で、JIT技術はjavaコードを部分的または全部ローカルマシンコードプログラムに変換し、JVM解釈を必要とせず、実行速度が速い.になるclass」のクラスファイルが見つかった場合、クラスファイルのバイトコードがメモリに呼び出され、JITコンパイラがバイトコードをコンパイルします.JITには2つの不足があります.
  • JITコンパイル変換には、プログラムのライフサイクル全体にわたって時間がかかります.
  • JITは実行可能コードのsizeを増やし、圧縮されたバイトコードよりもJITコードがコードのsizeを拡張し、メモリのページングを引き起こし、プログラムの実行速度を低下させる可能性がある.

  • JITに不足している1つの改良技術は遅延評価(lazy evaluation):その基本原理はバイトコードが直ちにJITコンパイルを行わないことであり、必要がない限り、最近のJDKでは遅延JITのようなHotSpot法を採用して実行するたびに実行されるコードを最適化し、コードの実行回数が多ければ多いほど、速度が速くなる.
    8.finalキーワード
  • staticでfinalであるフィールドは、変更できない記憶領域の一部しか占めていない.オブジェクトの参照にfinalを使用すると、その参照はもう別のオブジェクトを指すことはできませんが、オブジェクト自体は変更できます.
  • finalとして定義されたフィールドは、finalフィールドが使用される前に常に初期化されるように、フィールドの定義または構築方法に付与されなければならない.
  • クラスのすべてのprivateメソッドは、継承クラスがその意味を変更しないようにfinalとして暗黙的に指定されます.
  • finalクラスは継承が禁止されているため、finalクラスのすべてのメソッドはfinalであることを暗黙的に指定します.
  • コンストラクタ内で唯一安全に呼び出すことができる方法はベースクラスのfinalメソッドであり、finalメソッドではない場合、初期化されていないフィールドを使用して例外が発生する可能性があります.

  • 9.抽象クラス
  • 抽象メソッドを含むクラスを抽象クラスと呼ぶが、抽象クラスは必ずしも抽象メソッドを含むとは限らない.抽象クラスに継承されたクラスは、抽象ベースクラスの抽象メソッドを実装する必要があります.そうしないと、クラスも抽象クラスとして定義する必要があります.
  • 抽象クラスでは、オブジェクトをインスタンス化できません.

  • 10.インタフェース
  • は、任意の複数のインタフェースを継承し、各インタフェースが独立したタイプであるため、各インタフェースにアップコンバートすることができる.
  • インタフェースは、互いにネストすることができる.
  • 別のインタフェースにネストされたインタフェースは、privateとして宣言できないpublicに自動的になります.
  • インタフェースを実装する場合、インタフェースをネストする必要はありません.

  • 11.内部クラス
  • 内部クラスは、いくつかの論理的に関連するクラスを一緒に組織し、内部に位置するクラスの可視性を制御することができる.
  • 内部クラスは、その周辺クラスのすべての要素にもアクセスできます.内部クラスオブジェクトを構築する場合は、外部クラスオブジェクトを持つ前に内部クラスオブジェクトを作成することはできません.
  • メソッドと役割ドメイン内で内部クラスを定義することができ、この使用方法でクラス名を削除するのは匿名の内部クラスである.このような内部クラスは、メソッドまたは役割ドメイン外では表示されないため、通常、このようなオブジェクトを参照するようにアップグレードされます.
  • 匿名の内部クラスに名前付きコンストラクタがあるはずがない.匿名内部クラスはクラスを拡張したり,インタフェースを実現したりすることができるが,両者を兼ね備えることはできず,実装インタフェースであれば1つのインタフェースしか実現できない.
  • 内部クラスのコンストラクタは、その周辺クラスオブジェクトへの参照に接続する必要があるため、内部クラスを継承する際にデフォルトのコンストラクタを使用することはできず、周辺クラスオブジェクトへの参照を渡す必要があり、コンストラクタ内でouter.super();
  • を呼び出す必要がある.
    12.ネストされたクラス
  • 内部クラスをstaticと宣言し、ネストクラスと呼ぶ.ネストされたクラスは、周辺クラスのオブジェクトを必要としないため、ネストされたクラスのオブジェクトから非静的な周辺クラスオブジェクトにアクセスできません.
  • 通常の内部クラスのフィールドとメソッドは、クラスの外部階層にしか配置できないため、通常の内部クラスにはstaticデータとstaticフィールドがなく、ネストされたクラスも含まれません.
  • インタフェースの内部のクラスは自動的にネストされたクラスであり、インタフェース内の任意のフィールドメソッドクラスが自動的にpublicとstaticであるためである.インタフェースの内部に配置されたクラスは、その周辺インタフェースを実現することもできます.

  • 継続的に補完します!