Javaオブジェクト指向:ここでは、オブジェクト指向の基本的な知識を整理して、誰もが学び、理解できるようにします。私はそれが皆を助けることができることを願っています。会社のインタビュー情報に基づいて編集された関連する知識は次のとおりです。
過負荷とオーバーライドの違い。過負荷のメソッドは、返品値のタイプを変更できますか?
過負荷は過負荷を意味し、オーバーライドは上書き、つまり書き換えます。過負荷の過負荷とは、同じクラスに同じ名前の複数のメソッドがあることを意味しますが、これらのメソッドのパラメーターリストは異なります(つまり、パラメーターの数またはタイプは異なります)。
オーバーライドの書き換えは、サブクラスのメソッドが親クラスのメソッドの名前とパラメーターとまったく同じであることを意味します。このメソッドがサブクラスによって作成されたインスタンスオブジェクトを介して呼び出されると、サブクラスの定義メソッドが呼び出されます。これは、親クラスで定義されたまったく同じメソッドを上書きするのと同等です。これは、オブジェクト指向プログラミングの多型の現れでもあります。
オーバーライドは、オーバーライドとして翻訳できます。文字通り知っているように、さまざまな機能を達成するために、メソッドを無効にし、書き換えています。私たちにとって最も馴染みのあるオーバーライドは、インターフェイスメソッドの実装です。インターフェイスでは、メソッドは一般に宣言されており、実装すると、すべてのインターフェイス宣言を実装する必要があります。この典型的な使用に加えて、継承の親クラスのメソッドをオーバーライドすることもあります。次のポイントは、カバレッジ中に注意する必要があります。
1.オーバーレイ法のロゴは、オーバーレイの効果を実現するために、オーバーレイメソッドのロゴと正確に一致する必要があります。
2。上書き方法の返品値は、上書き方法の返品と一致する必要があります。
3.上書き方法によってスローされる例外は、上書きの方法によってスローされる例外と一致する必要があります。そうしないと、サブクラスです。
4.上書きの方法はプライベートではありません。そうしないと、新しい方法のみがサブクラスで定義されており、上書きされません。
過負荷は過負荷として翻訳することができます。つまり、同じ名前でいくつかのメソッドを定義し、異なる入力パラメーターを定義することでこれらのメソッドを区別し、呼び出されると、VMは異なるパラメータースタイルに従って実行する適切なメソッドを選択します。オーバーロードを使用する場合は、次のポイントに注意してください。
1.オーバーロードを使用する場合、異なるパラメータースタイルのみを渡すことができます。たとえば、異なるパラメータータイプ、異なるパラメーター数、異なるパラメーターの順序(もちろん、同じ方法のいくつかのパラメータータイプは異なる必要があります。
2。アクセス権限、返品タイプ、およびスローされた例外を介して過負荷にすることはできません。
3.例外タイプとメソッドの数は、過負荷に影響しません。
4.継承の場合、メソッドが親クラスにアクセス権を持ち、Priavteである場合、サブクラスで過負荷にすることはできません。定義されている場合、新しい方法のみを定義し、過負荷の効果を達成しません。
複数の過負荷のメソッドのパラメーターリストが異なる場合、リターナータイプが異なる場合があります。 2つのメソッドのパラメーターリストがまったく同じ場合、異なる返品値では過負荷の過負荷を達成することはできません。この問題を説明するために、逆の証明方法を使用できます。たとえば、map.remove(key)メソッドを呼び出すと、削除メソッドには戻り値がありますが、通常、返品結果を受信する変数を定義しません。現時点では、このクラスにはまったく同じ名前とパラメーターリストを持つ2つのメソッドがあると仮定すると、リターンタイプが異なるからといって、Javaはプログラマーがどの方法を呼び出したいかを決定できません。
コンストラクターはオーバーライドできますか?
コンストラクターコンストラクターを継承することはできないため、オーバーライドをオーバーライドすることはできませんが、過負荷を過負荷にすることができます。
インターフェイスを継承できますか?抽象クラスはインターフェイスを実装できますか?抽象クラスはコンクリートクラスを継承できますか?抽象クラスは存在できますか?抽象クラスは、抽象クラスに静的なメインメソッドを持つことができますか?
インターフェイスはインターフェイスを継承できます。要約クラスは、インターフェイスを実装(実装)できます。抽象クラスには静的なメインメソッドがあります。
抽象クラスと通常のクラスの唯一の違いは、インスタンスオブジェクトを作成して抽象的なメソッドを許可できないことです。
clone()メソッドを作成するとき、通常、コードの行があります。それは何ですか?
clone()メソッドはクローンであり、オブジェクトをコピーすることを意味します。つまり、A aにはいくつかの有効な値が含まれているが、オブジェクトAが既にありますが、オブジェクトBを持ちたい場合、およびBの変更はAの値に影響しませんが、Bは新しいオブジェクトではありません。
コピー:copyコピーオブジェクトは、参照ではなく新しいオブジェクトを返します。 copyオブジェクトをコピーすることと新しい演算子に返されるオブジェクトをコピーすることの違いは、コピーにはオブジェクトの初期情報ではなく、元のオブジェクトの情報が既に含まれていることです。
クローンにはデフォルトの動作がありますsuper.clone();最初に、親クラスのメンバーを所定の位置にコピーし、次にそのメンバーがコピーされる必要があるためです。
オブジェクト指向の機能の側面は何ですか
オブジェクト指向のプログラミング言語には、カプセル化、継承、抽象化、および多型の4つの主な機能が含まれます。
1パッケージ:
パッケージングは、ソフトウェアコンポーネントが優れたモジュール性を確保するための基礎です。パッケージングの目標は、プログラムの相互依存によって引き起こされる変更を防ぐために、ソフトウェアコンポーネントの「高い結束と低カップリング」を達成することです。オブジェクト指向のプログラミング言語では、オブジェクトはカプセル化の最も基本的な単位であり、オブジェクト指向のカプセル化は、従来の言語のカプセル化よりも明確で強力です。オブジェクト指向のカプセル化は、「モジュール」、つまりクラス内のオブジェクトのプロパティと動作を記述するコードをカプセル化することです。プロパティは変数によって定義され、動作はメソッドで定義されます。このメソッドは、同じオブジェクトのプロパティに直接アクセスできます。一般的に言えば、この変数にアクセスする変数と方法を一緒に配置し、クラス内のすべてのメンバー変数をプライベートとして定義することを忘れないでください。クラス独自のメソッドのみがこれらのメンバー変数にアクセスできます。原則を把握する:同じクラスで同じもので動作する方法と関連する方法を置き、同じクラスで動作するメソッドとデータを配置します。
2。要約:
抽象化は、いくつかのことの類似性と共通性を見つけてから、これらのものの類似性と共通性のみを考慮し、現在のトピックと目標に関連していない側面を無視し、現在の目標に関連する側面に焦点を当てるクラスに分類することです。たとえば、アリと象を見ると、それらがどのようなものか想像できます。それは抽象化です。抽象化には、行動の抽象化と状態抽象化の2つの側面が含まれます。たとえば、次のように個人のクラスを定義します。
class person {string name; int age; }人間はもともと非常に複雑なものであり、多くの側面を持っていますが、現在のシステムは人の名前と年齢を理解する必要があるため、上記のクラスには名前と年齢の属性のみが含まれています。これは抽象化です。抽象化を使用すると、目標に関連していない詳細を考慮しないでください。
3。継承:
クラスを定義および実装する場合、既存のクラスに基づいて実行でき、既存のクラスで定義されたコンテンツは独自のコンテンツとして取得され、いくつかの新しいコンテンツを追加するか、元のメソッドを変更して特別なニーズに合ったものにすることができます。これは継承です。継承は、サブクラスが親クラスのデータと方法を自動的に共有するメカニズムです。これはクラス間の関係であり、ソフトウェアの再利用性とスケーラビリティを向上させます。
4つの多型:
多型とは、プログラムで定義された参照変数によって指摘された特定のタイプを指し、参照変数を介して発行されたメソッド呼び出しはプログラミング中に決定されませんが、プログラムの実行中に決定されます。つまり、どのクラスインスタンスオブジェクトが指すか、参照変数によって発行されるクラスメソッド呼び出しは、プログラムの実行中にのみ決定されるかを実装できます。特定のクラスはプログラムが実行されているときにのみ決定されるため、参照変数はソースプログラムコードを変更せずにさまざまな異なるクラスの実装にバインドできます。つまり、プログラムコードを変更せずにプログラムにバインドされている特定のコードは、プログラムが多型である複数の実行状態を選択できるようにします。多型は、ソフトウェアの柔軟性とスケーラビリティを向上させます。たとえば、次のコードのuserdaoは、参照変数userdaoによって指すインスタンスオブジェクトを定義し、実行時にdaofactory.getdao()によって返されるインターフェイスです。 userjdbcdaoの実装を指す場合があり、場合によってはuserhibernatedaoの実装を指します。このようにして、ソースコードを変更せずにuserdaoが指す特定のクラスの実装を変更すると、userdao.insertuser()メソッドの特定のコードもそれに応じて変更されます。つまり、userjdbcdaoのinsertuserメソッドと呼ばれることもあり、時にはuserhibernatedaoのinsertuserメソッドと呼ばれることもあります。
userdao userdao = daofactory.getdao(); userdao.insertuser(user);
Javaに多型を実装するメカニズムは何ですか?
親クラスまたはインターフェイスによって定義された参照変数は、サブクラスまたはコンクリート実装クラスのインスタンスオブジェクトを指すことができ、プログラムで呼び出される方法は、実行時に動的にバインドされます。これは、変数によって指された特定のインスタンスオブジェクト、つまり、参照変数のタイプで定義されたメソッドではなく、メモリ内で実行されているオブジェクトのメソッドを指す方法です。
抽象クラスとインターフェイスの違いは何ですか?
抽象修飾子を含むクラスは、抽象クラスである抽象クラスであり、抽象クラスでは作成できないインスタンスオブジェクトです。抽象的なメソッドを含むクラスは、抽象クラスとして定義する必要があり、抽象クラスのメソッドは抽象的である必要はありません。抽象クラスクラスの抽象的なメソッドの定義は、具体的なサブクラスに実装する必要があるため、抽象コンストラクターや抽象的な静的メソッドを存在することはできません。サブクラスが抽象親クラスにすべての抽象的なメソッドを実装していない場合、サブクラスも抽象型として定義する必要があります。
インターフェイスは抽象クラスの特殊なケースであると言えます。また、インターフェイス内のすべてのメソッドは抽象的でなければなりません。インターフェイスのメソッド定義はパブリックアブストラクトタイプにデフォルトであり、インターフェイスのメンバー変数タイプはパブリックスタティックファイナルにデフォルトです。
2つの文法的な違い:
1。要約クラスには、構造方法を持つことができますが、インターフェイスにはありません。
2。抽象クラスには通常のメンバー変数がありますが、インターフェイスには通常のメンバー変数はありません。
3。抽象クラスには、非抽象的な通常の方法を含めることができます。インターフェイス内のすべてのメソッドは抽象的でなければならず、通常のメソッドを補償しないことはできません。
4.抽象クラスの抽象的なメソッドのアクセスタイプは、公開され、保護されており、デフォルトのタイプです(日食にエラーはありませんが、機能しないはずです)が、インターフェイスの抽象的なメソッドはパブリックタイプのみであり、デフォルトはパブリック抽象タイプです。
5。要約クラスには静的メソッドを含めることができますが、インターフェイスには静的メソッドを含めることはできません。
6.抽象クラスとインターフェイスの両方に、静的なメンバー変数を含めることができます。抽象クラスの静的メンバー変数のアクセスタイプは任意になる可能性がありますが、インターフェイスで定義されている変数はパブリック静的な最終型のみであり、デフォルトはpublic static finalタイプです。
7.クラスは複数のインターフェイスを実装できますが、1つの抽象クラスのみを継承できます。
アプリケーションの2つの違い:
インターフェイスは、主にモジュール間の通信契約を定義するために使用されるシステムアーキテクチャ設計方法で役割を果たします。抽象クラスはコード実装に役割を果たし、コードの再利用を実現できます。たとえば、テンプレートメソッド設計パターンは、抽象クラスの典型的なアプリケーションです。特定のプロジェクトのすべてのサーブレットクラスが同じ方法を使用して許可判断を下し、アクセスログを記録し、例外を処理する必要があると仮定すると、抽象的なベースクラスを定義できるため、すべてのサーブレットがこの抽象的なベースクラスを継承し、アクセスログを記録し、抽象的なベースクラスのサービス方法の例外を処理でき、それぞれのビジネスロジックコードのみを完了します。擬似コードは次のとおりです。
パブリックアブストラクトクラスBaseServletは、httpservlet {public final void service(httpservletrequest request、httpservletresponse応答)を拡張します。 doservice(httpservletrequest request、httpservletresponse応答)は、ioexcetion、servletexceptionをスローします。 //アクセス許可は保護されていると定義されていることに注意してください。これは、プロフェッショナルで厳格であると思われます。なぜなら、パブリッククラスMyServlet1はBaseServletを拡張するため、保護されたvoid doservice(httpservletrequestリクエスト、httpservletresponse応答)をスローします。親クラスの方法の中央にある特定のコードは不確かなので、サブクラスに任せているので、テンプレートメソッドを使用してパターンを設計します。
抽象的なメソッドは同時に静的にすることができますが、同時にネイティブにすることができ、同時に同期することができますか?
抽象的なメソッドはサブクラスで実装する必要があり、staticはサブクラスとは何の関係もないため、抽象の方法は静的にすることはできません。
ネイティブ方法は、メソッドを別のプラットフォーム依存プログラミング言語で実装する必要があり、サブクラスの実装に問題はないため、抽象化することはできず、抽象と混合することはできません。たとえば、FileOutputSteamクラスはハードウェアに対処する必要があり、基礎となる実装ではオペレーティングシステム関連のAPI実装を使用します。たとえば、WindowsのC言語で実装されています。したがって、JDKのソースコードを見ると、FileOutputStreamのオープン方法の定義は次のとおりであることがわかります。
Javaを使用して、他の人によって書かれたC言語関数を呼び出す場合は、直接呼び出すことはできません。 Javaの要件に従ってC言語関数を記述する必要があり、C言語関数は他の人のC言語関数を呼び出します。 c言語関数はJavaの要件に従って記述されているため、C言語関数はJavaに接続できます。 Javaのドッキング方法は、C関数に対応するメソッドを定義することです。 Javaの対応するメソッドは特定のコードを記述する必要はありませんが、ネイティブを以前に宣言する必要があります。
同期した場合、メソッドで同期した同期によって使用される同期ロックオブジェクトはこれであり、抽象的なメソッドはこれが何であるかを決定できません。
内部クラスとは何ですか?静的ネストされたクラスは、内部クラスとは異なります。
内部クラスは、クラス内で定義されたクラスです。静的メンバーは、内部クラスで定義することはできません。静的メンバーはオブジェクトの特性ではありません。彼らはただ住む場所を見つける必要があるので、彼らはクラスに配置する必要があります。内部クラスは、外部クラスのメンバー変数に直接アクセスできます。以下に示すように、内部クラスは、外部クラスのメソッドまたは外部クラスのメソッド本体の外側で定義できます。
パブリッククラスの外側{int out_x = 0; public void method(){inner1 inner1 = new inner1();パブリッククラスInner2 //メソッドボディ内で定義された内部クラス{public method(){out_x = 3; }} inner2 inner2 = new inner2(); } public class inner1 //メソッドボディの外側で定義された内部クラス{}}メソッド本体の外側で定義された内部クラスのアクセスタイプは、公開され、保護され、デフォルトのプライベートにすることができます。これは、クラスで定義されているメンバー変数が4つのアクセスタイプを持っているようなもので、インナークラスの定義が他のクラスに表示されるかどうかを決定します。この場合、外部の内側クラスのインスタンスオブジェクトを作成することもできます。内部クラスのインスタンスオブジェクトを作成するときは、最初に外側クラスのインスタンスオブジェクトを作成し、次に外側クラスのインスタンスオブジェクトを使用して、内側クラスのインスタンスオブジェクトを作成する必要があります。コードは次のとおりです。
外側の外側= new outer();
outer.inner1 inner1 = outer.new innner1();
メソッドで定義されているローカル変数と同様に、メソッド内で定義される内部クラスの前にアクセスタイプ修飾子を存在することはできませんが、最終的または抽象的な修飾子を内部クラスの前に使用できます。この内側のクラスは他のクラスには見えず、この内部クラスを参照することはできませんが、この内部クラスによって作成されたインスタンスオブジェクトは、アクセスするために他のクラスに渡すことができます。この種の内部クラスを最初に定義し、次に使用する必要があります。つまり、クラスを使用する前に内部クラスの定義コードが表示される必要があります。これは、メソッドのローカル変数を最初に定義し、次に使用する必要があるという原則と同じです。この内部クラスは、メソッド本体のローカル変数にアクセスできますが、最終的な修飾子はローカル変数の前に追加する必要があります。
メソッド本体では、次の構文を使用して匿名の内側クラスを作成できます。つまり、クラスの特定のインターフェイスまたはサブクラスを定義しながら、サブクラスのインスタンスオブジェクトも作成されます。
public class outer {public void start(){new Stread(new runable(){public void run(){};})。start(); }}最後に、静的キーワードを静的ネストクラスに追加するために、メソッドの外側に定義されている内部クラスをプレフィックスできます。内側のクラスの特性はもうありません。すべて、狭い意味では、内側のクラスではありません。静的ネストされたクラスは、実行時の通常のクラスの動作と機能に違いはありませんが、参照をプログラミングする際の構文にはいくつかの違いがあります。公開、保護、デフォルト、プライベート、その他のタイプとして定義できますが、通常のクラスはパブリックおよびデフォルトのタイプとしてのみ定義できます。外部の静的ネストクラスクラスの名前は「外部クラス名。インナークラス名」です。外部の外部クラスのインスタンスオブジェクトを作成せずに、静的ネストクラスを直接作成できます。たとえば、内側が外側のクラスで定義された静的ネストクラスである場合、次のステートメントを使用してインナークラスを作成できます。
outer.inner inner = new outer.inner();
静的ネストされたクラスは、外部クラスのインスタンスオブジェクトに依存していないため、静的ネストクラスは外部クラスの非静的なメンバー変数にアクセスできます。外部クラスで静的ネストクラスにアクセスする場合、外部クラスの名前を追加せずに静的ネストクラスの名前を直接使用できます。静的ネストクラスでは、外部クラスの名前を追加せずに、外部クラスの静的メンバー変数を直接参照することもできます。
静的メソッドで定義されている内部クラスは、静的ネストクラスでもあります。現時点では、クラスの前に静的キーワードを追加することはできません。静的メソッドの静的ネストクラスは、通常の方法での内部クラスのアプリケーション方法と非常に似ています。外部クラスの静的メンバー変数に直接アクセスすることに加えて、静的メソッドのローカル変数にアクセスすることもできます。ただし、最終的な修飾子をローカル変数の前に追加する必要があります。
内側のクラスは、含まれるクラスのメンバーを参照できますか?制限はありますか?
まったく大丈夫です。静的な内部クラスでない場合、制限はありません!
静的ネストされたクラスを内部クラスの特別なケースとして扱う場合、この場合、外側クラスの通常のメンバー変数にアクセスすることはできませんが、外側クラスの静的メンバーのみにアクセスすることはできません。たとえば、次のコード:
クラスアウター{static int x;静的クラス内側{void test(){syso(x); }}}}匿名の内部クラス(匿名の内部クラス)は、他のクラスを拡張(継承する)ことができ、インターフェイス(インターフェイス)を実装(実装)することができますか?
他のクラスを継承するか、他のインターフェイスを実装できます。できるだけでなく、しなければならない!
例えば:
Import Java.util.date; public class test extends date {public static void main(string [] args){new test()。test(); } public void test(){system.out.println(super.getClass()。getName()); }}結果はテストです
テスト方法では、getClass()。getName()メソッドが直接呼び出され、テストクラス名が返されます。 getClass()はオブジェクトクラスの最終として定義されるため、サブクラスはメソッドを上書きすることはできません。したがって、テストメソッドのgetClass()。getName()メソッドを呼び出すことは、実際には親クラスから継承されたgetClass()メソッドを呼び出します。したがって、super.getClass()。getName()メソッドもテストを返す必要があります。親クラスの名前を取得したい場合は、次のコードを使用する必要があります。
getClass()。getSuperClass()。getName();
オブジェクト指向とプロセス指向の違いは何ですか
1出発点は異なります。オブジェクト指向のアプローチは、従来の思考に適合する方法で、客観的な世界の問題に対処することです。問題ドメインの重要なポイントは、オブジェクト間のインターフェイスに直接言及されていることを強調しています。プロセス指向のアプローチは、プロセスの抽象化とモジュール性を強調します。これは、プロセス中心の構造または客観的な世界の問題への対処です。
2。オブジェクト指向の方法は、コンピューターロジックを使用して客観的な世界の物理的存在をシミュレートし、オブジェクトコレクションクラスを問題の処理の基本ユニットとして使用して、コンピューターの世界を可能な限り客観的な世界に近づけ、問題をより直接的かつ明確にするようにします。オブジェクト指向のメソッドはクラス階層を使用してクラス間の継承と開発を反映しますが、オブジェクト指向のプロセスメソッドは、プロセスを明確かつ正確に表現するモジュールを使用するモジュールを使用し、モジュールまたはモジュール間の関係と機能を要約するモジュール階層を使用するモジュールを可能にする基本ユニットとの問題を処理し、客観的な世界のプロセスを使用します。
3データ処理方法は、制御プログラム方法とは異なります。オブジェクト指向のメソッドは、データと対応するコード全体をカプセル化します。原則として、他のオブジェクトはデータを直接変更することはできません。つまり、オブジェクトの変更は独自のメンバー関数によってのみ完了することができます。制御プログラム方法は、「イベント駆動型」を介してプログラムをアクティブにして実行することです。オブジェクト指向のプロセスは、プログラムを通じてデータを直接処理し、処理結果が処理が完了した後に表示されます。プログラムを制御するという点では、プログラムは設計に従ってプログラムに呼び出されるか、プログラムに返され、ナビゲーションにすることはできません。モジュール、コントロールとコントロールの間には、コールとコールの間に関係があります。
4分析設計とエンコード変換方法は異なります。ソフトウェアライフサイクル全体のオブジェクト指向アプローチの分析。設計とコーディングでは、スムーズなプロセスです。分析から設計、次にコーディングまで、一貫したモデルを使用して表示します。つまり、シームレスな接続です。オブジェクト指向のプロセス方法は、ルールに従って分析設計とコーディングの間の変換を強調し、ソフトウェアのライフサイクル全体で分析と設計とコーディングが達成されます。
オブジェクト指向の開発の利点は何ですか
1より高い開発効率。オブジェクト指向の開発を使用すると、実際のものを抽象化し、実際のプラクティスを開発されたオブジェクトに直接マッピングできます。
2ソフトウェアの堅牢性を確保します。それはまさに、オブジェクト指向の開発方法が高い再利用性を持っているからです。開発プロセス中、関連分野でテストされた既存のコードが再利用されました。したがって、それは自然にソフトウェアの堅牢性を促進する上で良い役割を果たします。
3ソフトウェアの高いメンテナンスを確保します。オブジェクト指向の開発方法により、コードは非常によく読みやすいです。同時に、オブジェクト指向の設計パターンにより、コード構造がより明確になります。同時に、オブジェクト指向の開発モデルには、すでに非常に成熟したデザインパターンがすでにあります。これらの設計パターンにより、プログラムは需要の変化に直面しているときにいくつかのモジュールのみを変更できます。これは、メンテナンスがより便利であるためです。
これとスーパーの違いは何ですか
Java言語では、これは現在のインスタンスオブジェクトを指します。その非常に重要な機能の1つは、オブジェクトのメンバー変数をメソッドの正式なパラメーターと区別することです(メソッドの名前がメンバー変数に参加すると、メンバー変数が上書きされます)。
Superを使用して、親クラスのメソッドまたはメンバー変数にアクセスできます。子クラスのメソッドまたはメンバー変数が親クラスと同じ名前を持っている場合、親クラスのメソッドまたはメンバー変数も上書きされます。親クラスのメソッドまたはメンバー変数にアクセスする場合は、スーパーキーワードを介してのみアクセスできます。
親クラスのクラス名を取得する方法
Java言語は、クラス名を取得する方法を提供します:getClass()。getName()。開発者はこの方法を呼び出してクラス名を取得できます。ただし、継承の場合、親クラス()を呼び出すことで、親クラスのクラス名を取得することはできません。
クラスA {}パブリッククラステストは{public void test(){system.out.println(super.getClass()。getName());} public static void main(string [])args){new test.test();}}}プログラムの実行結果はテストです。その理由は、Java言語のクラスがオブジェクトクラスから継承するためです。 GetClassメソッドは、オブジェクトクラスの最終ネイティブとして定義されます。サブクラスはこの方法を無効にすることはできません。したがって、this.getClass()およびsuper.getClass()は、最後にオブジェクトクラスのgetClass()メソッドを呼び出します。オブジェクトクラスのgetClass()メソッドの定義は次のとおりです。このオブジェクトのランタイムクラスを返します。親クラスの名前コードは、次のようにJavaの反射メカニズムを介してサブクラスで取得できます。
クラスA {}パブリッククラステストは{public void test(){system.out.println(this.getClass()。getSuperClass()。getName()。組み合わせと継承の違いは何ですか
構成と継承は、オブジェクト指向のコードを再利用する2つの方法です。組み合わせとは、新しいクラスで元のクラスのオブジェクトを作成し、既存のクラスの機能を再利用することを指します。継承は、オブジェクト指向の主な機能の1つであり、デザイナーは他のクラスの実装に基づいてクラスの実装を定義できます。構成と継承の両方により、構成が表示されることを除いて、新しいクラスで子オブジェクトを設定することができますが、継承は暗黙的です。組み合わせと継承の間には対応があります。構成のクラス全体は、継承のサブクラスに対応し、構成のローカルクラスは継承の親クラスに対応します。それを使用するときは、次の2つの原則に従ってください。
1 2つのクラス間に「IS-A」の関係がない限り、継承を過度に使用するとコードの保守性が破壊されるため、継承を簡単に使用しないでください。親クラスが変更されると、それから継承されたすべてのサブクラスに影響します。
2.多型を達成するためだけに継承を使用しないでください。クラス間の関係が「IS-A」の関係ではない場合、インターフェイスと組み合わせを実装することで同じ目的を達成できます。
Java言語は単一の継承のみをサポートするため、2つ以上のクラスを同時に継承したい場合、Javaで直接実装することはできません。同時に、Java言語では、あまりにも多くの継承が達成されると、クラスのコンテンツが肥大化します。したがって、Java言語では、組み合わせを使用できる場合は、継承を使用しないようにしてください。
読んでくれてありがとう、私はそれがあなたを助けることができることを願っています。このサイトへのご支援ありがとうございます!