まず第一に、その 3 つの主要な機能の定義について簡単に説明します:
カプセル化: オブジェクトのプロパティと実装の詳細を非表示にし、インターフェースのみを外部に公開し、読み取りと変更のアクセス レベルを制御します。プログラム内のプロパティ。抽象化されたデータと動作 (または関数) を組み合わせて有機的な全体を形成します。つまり、データとそのデータを操作するソース コードを有機的に組み合わせて、データと関数の両方がクラスのメンバーである「クラス」を形成します。カプセル化の目的は、セキュリティを強化し、プログラミングを簡素化することです。ユーザーは特定の実装の詳細を理解する必要はなく、外部インターフェイスと特定のアクセス許可を通じてクラスのメンバーを使用するだけで済みます。カプセル化の基本要件は、すべてのプロパティをプライベート化し、各プロパティにゲッター メソッドとセッター メソッドを提供することです。パラメーターを持つコンストラクターがある場合は、パラメーターのないコンストラクターを作成する必要があります。開発中は、作成されたクラスをテストする必要があることが多いため、toString メソッドがオーバーライドされることがありますが、これは必須ではありません。
継承: コードの再利用は継承によって実現されます。 Java のすべてのクラスは、java.lang.Object クラスを直接的または間接的に継承することによって取得されます。継承されたクラスをサブクラス、継承されたクラスを親クラスと呼びます。サブクラスは、親クラスのプライベート アクセス権を持つメンバー変数およびメソッドを継承できません。サブクラスは親クラスのメソッドをオーバーライドし、メンバー変数に親クラスと同じ名前を付けることができます。ただし、Java は、複数のスーパークラスから派生するクラスの機能である多重継承をサポートしていません。プログラムの結合を減らすために、開発中は継承関係をできる限り減らすようにしてください。
ポリモーフィズム: ポリモーフィズムは、設計時ポリモーフィズムと実行時ポリモーフィズムに分けられます。たとえば、オーバーライドまたは継承されるメソッドの場合、JAVA ランタイム システムは、メソッドを呼び出すメソッドに依存します。どのメソッドを呼び出すかを決定するインスタンスのタイプは、ランタイムポリモーフィズムと呼ばれます。全体として、オブジェクト指向設計の典型的な特徴は継承、カプセル化、およびポリモーフィズムです。これらの特徴は、オブジェクト指向が人気がある理由の鍵でもあります。
カプセル化
Java のクラスの属性のアクセス権のデフォルト値はプライベートではありません。この属性のメソッドを非表示にしたい場合は、private 修飾子を追加してクラス内のみにアクセスを制限できます。
クラス内のプライベート属性の場合、プライベート属性の操作とセキュリティを確保するために、プライベート属性にアクセスするためのメソッドのペア (getXXX、setXXX()) を提供する必要があります。
メソッドのカプセル化、公開すべきもの、隠すべきものは隠すべきです。
Javaの継承
継承とは、共通の特性を持つ複数の型のものを1つのクラスに抽象化することです。
Java の継承では extends キーワードを使用する必要があり、Java では単一継承が許可されます。つまり、クラスは親クラスを 1 つだけ持つことができます。
コンストラクターメソッドは継承できません。
Javaメソッドでのオーバーライド
親クラスでアクセス可能な同名、同じパラメータリストのメソッドがサブクラス内に存在する場合、親クラスから継承したメソッドが上書きされます。
super() キーワード
super() は、サブクラスのコンストラクターが親クラスのコンストラクターを呼び出すとき、super() はコンストラクターの最初の文にのみ存在できることを意味します。
Java のポリモーフィズム
コンパイル時ポリモーフィズムと実行時ポリモーフィズムの 2 つのポリモーフィック メカニズムがあります
1. メソッドのオーバーロード: オーバーロードとは、同じクラス内に同じ名前の複数のメソッドがあることを意味しますが、これらのメソッドは異なるパラメータ。なので、コンパイル時にどのメソッドを呼び出すかを決定できます。これは、コンパイル時のポリモーフィズムの一種です。
2. メソッドの適用範囲: サブクラスは親クラスのメソッドをオーバーライドできるため、同じメソッドでも親クラスとサブクラスでは異なる式が存在します。 Java 言語では、基本クラスの参照変数は、基本クラスのインスタンス オブジェクトだけでなく、サブクラスのインスタンス オブジェクトも指すことができます。同様に、インターフェイス内の参照変数もインスタンス オブジェクトを指すことができます。その実装クラスの。
public class A { public String show(D obj) { return ("A and D"); } public String show(A obj) { return ("A and A"); } } public class B extends A{ public String show(B obj){ return ("B and B"); } public String show(A obj){ return ("B and A"); } } public class C extends B{ } public class D extends B{ } public class Test { public static void main(String[] args) { A a1 = new A(); A a2 = new B(); B b = new B(); C c = new C(); D d = new D(); System.out.println("1--" + a1.show(b)); System.out.println("2--" + a1.show(c)); System.out.println("3--" + a1.show(d)); System.out.println("4--" + a2.show(b)); System.out.println("5--" + a2.show(c)); System.out.println("6--" + a2.show(d)); System.out.println("7--" + b.show(b)); System.out.println("8--" + b.show(c)); System.out.println("9--" + b.show(d)); } } 1--A and A 2--A and A 3--A and D 4--B and A 5--B and A 6--A and D 7--B and B 8--B and B 9--A and D
スーパークラスのオブジェクト参照変数がサブクラス オブジェクトを参照する場合、参照変数の型ではなく、参照されるオブジェクトの型によって、どのメンバー メソッドが呼び出されるかが決まりますが、呼び出されるメソッドはスーパークラスで定義されている必要があります。 、サブクラスによってオーバーライドされるメソッド。
ここで、この文の意味を説明するために例を使用します: a2.show(b);
ここで、a2 はタイプ A の参照変数です。これは B オブジェクトを参照するため、上記に従って文 B がどのメソッドを呼び出すかを決定するということなので、a2.show(b) は B で show(B obj) を呼び出し、結果は「B と B」になるはずですが、なぜ前の操作と異なるのですか?違いはありますか?ここで、「ただし、ここで呼び出されるメソッドはスーパークラスで定義する必要があります」という文を無視すると、show(B obj)はクラスAに存在しますか?それは存在しません!では、この文はここでは当てはまらないのでしょうか?では、この文は間違っているのでしょうか?いいえ!実際、この文は次の文も暗示しています。継承チェーン内の呼び出しメソッドの優先順位に従って確認する必要があります。そのため、クラス A で show(A obj) が見つかります。同時に、B がこのメソッドを書き換えたため、クラス B のメソッドを呼び出します。それ以外の場合は、クラス A のメソッドを呼び出します。
上記は、編集者が紹介した Java のカプセル化、継承、ポリモーフィズムの 3 つの主要な特徴についての理解です。ご質問があれば、メッセージを残してください。編集者が返信します。間に合うようにあなたに。また、PHP 中国語 Web サイトをサポートしていただきありがとうございます。
Java のカプセル化、継承、ポリモーフィズムの 3 つの主要な特性の理解に関連するその他の記事については、PHP 中国語 Web サイトに注目してください。