第5章オブジェクト指向(オン)
-
命名規則
- 意味のある言葉で構成されている必要があります
- クラス名、各単語の最初の文字を大文字にします(学生
- メンバー変数名。単語の最初の文字は小文字で、各単語の最初の文字は大文字です(phoneNumber
- メソッド名、最初の単語は小文字、動詞は始まります(goOut
- 意味のある言葉で構成されている必要があります
-
静的キーワード
- 変更されるのは、クラスによって共有され、クラスを通じて呼び出される汎用メンバー変数とメソッドです。
- 特に、静的メンバー変数は汎用であり、すべてのオブジェクトで共有されます(オブジェクトが静的変数およびメソッドを呼び出すことはお勧めしません)
- したがって、仕様:クラス名を使用してジェネリックメソッドと変数を呼び出す
- それ以外の場合は、オブジェクト(インスタンス変数、インスタンスメソッドと呼ばれます)によって所有されます。
- したがって、静的メソッドは非静的メンバーを直接呼び出したりアクセスしたりすることはできません
- staticの重要な役割は、変数とメソッドがクラスまたはインスタンスオブジェクトのどちらに属しているかを区別することです。
- 変更されるのは、クラスによって共有され、クラスを通じて呼び出される汎用メンバー変数とメソッドです。
-
Person p = new Person()
- 実際、pは、実際のオブジェクトのアドレスを保持するポインター変数(参照変数とも呼ばれます)です。
- p変数はスタックメモリに格納され、オブジェクトはヒープメモリに格納されます
- オブジェクトには、ポインタpを介してのみアクセスできます。
- ヒープメモリ内にオブジェクトを指すポインタ変数がない場合、オブジェクトはJVMのリサイクルメカニズムによってリサイクルされます。
- したがって、オブジェクトを破棄する場合は、オブジェクトを指すポインタ変数をnullに設定するだけで済みます。
-
この
- どのオブジェクトがメソッドを呼び出しているか、これはどのオブジェクトを表しているか
- メンバー関数が別のメンバー関数を呼び出すことはあまりにも一般的であるため、現時点ではこれを省略できます。
- 静的メソッドはこれを使用できません
- これを戻り値として使用して、オブジェクト自体を返すことができます
-
方法
- 構造指向プログラミング言語では、関数が基本単位です
- しかし、Javaでは、クラスはそうです。したがって、メソッドは独立して存在することはできず、クラスにのみ属することができます
- Javaでは、値のみがパラメーターとして渡されます。オブジェクトを渡すときは、ポインタを渡します
-
可変数パラメーター法
- public void test(int a、String…books){
for(String tmp:books){ sout(tmp); } }
-
この時点で複数の本を渡すことができます
-
アクセス制御文字
- privateは、現在のクラス内でのみアクセスできます
- デフォルトデフォルトのパッケージアクセス許可は、同じパッケージ内の他のクラスからアクセスできます
- 保護されたサブクラスのアクセス権。同じパッケージ内の他のクラスだけでなく、異なるパッケージ内のサブクラスからもアクセスできます。
- サブクラスによってのみオーバーライドされたいが、外部から直接呼び出されたくないメソッドに使用されます
- パブリックパブリックアクセス
-
パッケージ
- クラスの名前空間の競合を解決するために使用される、クラスのマルチレベルの名前空間を提供します。クラスファイルの管理など。
- 機能的に関連するクラスの同じグループを同じパッケージに入れて、論理クラスライブラリユニットを形成します
- パッケージ構造
- cn.ac.iie.cloudなど
- kensin.projectname
-
インポート
- パッケージのインポートパッケージをインポートした後、特定のクラスを呼び出すときにパッケージ名のプレフィックスを追加する必要はありません
- import static特定のクラス。インポート後、そのクラスの静的変数とメソッドを直接呼び出すことができます。クラス名は省略できます。
-
コンストラクタ
- this()を使用して、オーバーロードされたコンストラクター内の別のコンストラクターを呼び出すことができますが、コンストラクター本体の最初のステートメントである必要があります
-
クラス継承
- extendsは拡張を意味します。つまり、子クラスは親クラスの拡張ですが、親クラスのメンバーを継承します。
- Javaクラスは、直接の親クラスを1つだけ持つことができますが、短い親クラスを無数に持つことができます。
- すべてのクラスはデフォルトでjava.lang.Objectから継承します
- サブクラスでカバーされている親クラスのメソッドを呼び出すと、サブクラスは親クラスのメソッドをオーバーライドできます:super。
- superは、親クラスから継承されたサブクラスのメンバー変数とメソッドを呼び出すために使用されます
- オーバーロードは同じクラスの同じ名前のメソッドであり、オーバーライドは親クラスの同じ名前のメソッドをオーバーライドするサブクラスです。
- サブクラスのコンストラクターでは、親クラスのコンストラクターを明示的に呼び出すことができますsuper(、)
- 親クラスのコンストラクターは、常に子クラスのコンストラクターの前に実行されます
-
ポリモーフィズム
- 同じタイプの変数は、同じメソッドを呼び出すと、さまざまな異なる動作特性を示します。これはポリモーフィズムです。
- たとえば、基本クラスはprinterprinterです。
- プリンターp1 =新しいCaisePrinter
- プリンターp2 =新しいHeibaiPrinter
- このとき、p1、p2の印刷方法を呼び出して、さまざまな効果、つまりポリモーフィズムを印刷します。
- instanceofは、前のオブジェクトが後者のクラスであるか、そのサブクラスのインスタンスであるインスタンスクラスであるかを判断します
- 通常、強制変換の前に、ClassCastExceptionを回避するために正常に変換できるかどうかを判断します
-
継承と構成
-
カプセル化:クラスは、その内部情報と実装の詳細をカプセル化し、必要なメソッドのみを他のクラスに公開する必要があります。(低結合)
-
しかし、継承は親クラスのカプセル化を破壊し、親クラスのメソッドをオーバーライドすることさえでき、その結果、子クラスと親クラスの間に深刻な結合が生じます。
-
親クラスを設計する原則:
- 親クラスの内部データを非表示にしてみてください。プライベートとして設定し、サブクラスがアクセスできないようにしてください。
- サブクラスが親クラスを変更するメソッドに自由にアクセスできないようにしてください。
- 親クラスの補助メソッドは、サブクラスがオーバーライドされないようにプライベートにする必要があります。
- 親クラスのメソッドは外部から呼び出す必要がありますが、サブクラスを変更したくない場合は、最終変更を使用してください
- 親クラスのメソッドは、サブクラスによってオーバーライドされることを望んでいますが、他のクラスからアクセスされることは望んでいません。保護されたものを使用してください。
- 親クラスのコンストラクターのサブクラスによってオーバーライドされるメソッドを呼び出さないようにしてください
-
新しいサブクラスをいつ派生させる必要がありますか?
- サブクラスには、属性値の変更だけでなく、追加の属性が必要です
- サブカテゴリには、独自の動作を追加する必要があります
-
組み合わせ:古いクラスのオブジェクトを新しいクラスのメンバー変数として組み合わせて、新しいクラスのメソッドを実装します
- ユーザーに新しいクラスのメソッドを表示させたいので、通常はprivateを使用して古いクラスのオブジェクトを変更します
- Personクラスは、armをPersonのメンバー変数として使用できるように、Armクラスのメソッドを再利用する必要があります。
- 構成と継承の間でシステムオーバーヘッドに本質的な違いはありません
-
-
初期化ブロック
- 通常の初期化ブロック、静的初期化ブロック(クラス全体のクラス変数を初期化します)
- 実行シーケンス:初期化ブロック->コンストラクター->メンバー変数の割り当て