[JavaSE]オブジェクト指向

オブジェクト指向

クラス定義

[修飾子リスト] class クラス名 { // クラス本体 = 属性 + メソッド// 属性はコード上で「メンバ変数」の形で存在します(状態を記述します)// メソッドはアクション/動作を記述します}注:




  1. 修飾子のリストは省略できます。
  2. オブジェクト、新しいクラス名をインスタンス化します();
  3. 変数はアクセスする前に宣言する必要があります。メンバー変数が手動で割り当てられていない場合、システムによってデフォルトで割り当てられます。

施工方法

コンストラクターとは

構築メソッドは、オブジェクトの作成とインスタンス変数の初期化を完了できる特別なメソッドです。言い換えれば、構築メソッドはオブジェクトを作成するために使用され、同時にオブジェクトのプロパティに値を割り当てます。

デフォルトの引数なしのコンストラクター

クラスがコンストラクターを提供しない場合、システムはデフォルトでパラメーターなしのコンストラクターを提供します。(そして、このコンストラクターはデフォルト コンストラクターと呼ばれます)

コンストラクターの文法構造

【修飾子リスト】 クラス名(仮パラメータリスト) { 構築メソッド本体通常は構築メソッド本体内の属性に値を代入して属性の初期化を完了します。}


知らせ:

  1. 修飾子リストは現在、一律に public と書かれています。public static、シングルトンモード – private は決して書かないでください。
  2. コンストラクター名はクラス名と一致している必要があります。
  3. コンストラクターは戻り値の型を指定する必要がなく、void を記述することもできません。
  4. コンストラクターはメソッドのオーバーロードをサポートします。

呼び出しコンストラクター

新しいコンストラクター名 (実際のパラメーター リスト)。

カプセル化

パッケージングの役割

  1. 内部構造の安全性を確保します。
  2. マスキングは複雑ですが、露出は簡単です。

コードの観点から見ると、クラス本体内のデータがカプセル化された後、コードの呼び出し元はコードの複雑な実装を気にする必要がなく、単純なエントリを通じてのみコードにアクセスできます。また、クラス本体内のセキュリティレベルの高いデータはカプセル化されており、外部担当者が自由にアクセスできないようにすることで、データのセキュリティを確保しています。

カプセル化を実装する

  1. 属性のプライベート化 (private キーワードで変更)。
  2. これは、外部への単純な操作エントリを提供します。これは、set メソッドによって変更でき、get メソッドによって読み取ることができます。

静的キーワード

  1. 使用される静的キーワードはすべてクラス関連およびクラス レベルです。
  2. 使用される静的変更はすべて「クラス名」によってアクセスされます。
  3. 静的変更変数: 静的変数;
  4. 静的に変更されたメソッド: 静的メソッド。

静的ブロック

文法形式

静的 { Java ステートメント; Java ステートメント}


実行時間

クラスがロードされるとき、main メソッドが実行される前に、1 回だけ実行されます。

効果

  1. 静的コード ブロックはあまり一般的には使用されません。
  2. それは、Sun 社が私たち Java プログラマーに与えた特別な瞬間/機会、つまりクラスのロードのタイミングです。

コードブロックの例

文法形式

{ Java ステートメント; Java ステートメント; Java ステートメント; }



実行時間

構築メソッドが実行される限り、構築メソッドが実行される前に、「サンプル ステートメント ブロック」内のコードが自動的に実行される必要があります。実際、これは SUN が Java プログラマー向けに用意した、オブジェクト構築機会と呼ばれる特別な機会でもあります。

静的メソッド呼び出しインスタンスのメンバー

できません!

  1. 静的メソッドはクラスに属し、クラスがロードされるときにメモリが割り当てられ、クラス名を通じて直接アクセスできます。非静的メンバーはインスタンス オブジェクトに属し、オブジェクトがインスタンス化された後にのみ存在し、クラスのインスタンス オブジェクトを通じてアクセスする必要があります。
  2. クラスの非静的メンバーが存在しない場合、静的メンバーはすでに存在します。現時点では、メモリに存在しない非静的メンバーを呼び出すことは不正な操作です。

注: 静的メソッドがこのクラスのメンバーにアクセスする場合、静的メンバー (つまり、静的メンバー変数と静的メソッド) へのアクセスのみが許可され、インスタンス メンバー (つまり、インスタンス メンバー変数とインスタンス メソッド) へのアクセスは許可されません。一方、インスタンス メソッドにはこの制限はありません。

このキーワード

  1. これは 1 つのオブジェクトです。これは変数、参照です。これにより、現在のオブジェクトのメモリ アドレスが保存され、それ自体を指します。
  2. これはオブジェクト内のヒープ メモリに保存されます。
  3. これはインスタンス メソッドでのみ使用できます。誰がこのインスタンス メソッドを呼び出しても、それがその人です。コンストラクター内で、this は現在のオブジェクトを指します。
  4. ほとんどの場合、これは省略できます。インスタンスメソッドや構築メソッドでは、ローカル変数とインスタンス変数を区別するため、「this.」を省略することはできません。
  5. 新しい構文: 現在のコンストラクターを通じてこのクラスの別のコンストラクターを呼び出すには、次の構文形式を使用できます:
    this (実際のパラメーター リスト);
    this() の呼び出しはコンストラクターの最初の行にのみ表示できます。

スーパーキーワード

  1. super はインスタンス メソッドとコンストラクターに出現できます。
  2. super の構文は次のとおりです: super., super();
  3. super は静的メソッドでは使用できません。
  4. super. ほとんどの場合は省略できます。
  5. ローカル変数とインスタンス変数を区別する場合、super. を省略することはできません。
  6. super() は構築メソッドの最初の行にのみ現れ、現在の構築メソッドを通じて「親クラス」の構築メソッドを呼び出すことができます。目的は: サブクラス オブジェクトを作成するときに、最初に親クラスの特性を初期化することです。 。

知らせ:

  • this() と super() は共存できません。構築メソッドの最初の行にのみ使用できます。
  • 構築メソッドの最初の行に this() も super() もない場合、デフォルトで super() が存在します。
  • 親クラスと同じ名前の属性がサブクラス オブジェクトに出現する場合、サブクラス オブジェクトの「親クラスの機能」にアクセスするために super. を省略することはできません。
  • super は参照ではなく、メモリ アドレスを保持せず、オブジェクトを指しません。super は、
    現在のオブジェクト内の親タイプの機能のみを表します。super を使用する場合は、その後に「ドット」を続ける必要があります。つまりsuper.、 。

通話形式:

  • super.property 名 [親クラスのプロパティにアクセス]
  • super.メソッド名 [親クラスにアクセスするメソッド]
  • super (実パラメータ) [親クラスのコンストラクタを呼び出す]

継承する

継承の役割

  • 基本機能: サブクラスは親クラスを継承し、コードは再利用できます。
  • 主な役割: 継承関係により、後のメソッド カバレッジとポリモーフィズム メカニズムが存在します。

継承されたプロパティ

  1. クラス B がクラス A を継承する場合、クラス A はスーパークラス、親クラス、基底クラスと呼ばれ、
    クラス B はサブクラス、派生クラス、拡張クラスと呼ばれます。
    クラス A{}
    クラス B は A を拡張します{}
  2. Java の継承は単一継承のみをサポートし、多重継承はサポートしません。C++ は多重
    継承をサポートします
  3. Java では多重継承はサポートされていませんが、場合によっては間接継承の効果が生じることがあります。たとえば
    、クラス C は B を拡張し、クラス B は A を拡張します。つまり、C は B を直接継承しますが、C は
    間接的に A も継承します。
  4. Javaでは、サブクラスは親クラスを継承することが規定されていますが、継承できない構築メソッドを除き、残りは継承できます。
    ただし、プライベート プロパティにはサブクラスで直接アクセスできません。
  5. Java のクラスが明示的にクラスを継承していない場合、デフォルトで Object クラスを継承します。Object クラスは、
    Java 言語によって提供されるルート クラス (スーパー親クラス) です。つまり、オブジェクトは、
    すべてのクラスを継承して生成されます。オブジェクトタイプの特性。
  6. 継承には、サブクラスと親クラス間の結合度が高いという問題など、いくつかの欠点もあります。

メソッドのオーバーライド

書き換えは実行時に行われ、サブクラスは親クラスのアクセスが許可されたメソッドの実装プロセスを書き換えます。

いつ書き直すか?

サブクラスが親クラスを継承した後、継承したメソッドが現在のサブクラスのビジネスニーズを満たせない場合、サブクラスはメソッドを書き換える権利を持ち、「メソッドを上書きする」必要があります。

注: サブクラスが親クラスから継承したメソッドに対して「メソッドの書き換え」を実行した後、サブクラス オブジェクトがそのメソッドを呼び出すときに、書き換えられたメソッドを実行する必要があります。

オーバーライドされた条件

  1. 2 つのクラスには継承関係が必要です。
  2. メソッド名とパラメータリストは同じである必要があります。
  3. サブクラス メソッドの戻り値の型は、親クラス メソッドの戻り値の型と同じかそれより小さい必要があります。
  4. スローされる例外の範囲は親クラス以下です。
  5. 親クラス以上のアクセス修飾子のスコープ

知らせ:

  • コンストラクターは継承できないため、オーバーライドできません。
  • 装飾private/final/staticされたメソッドをオーバーライドすることはできませんが、static装飾されたメソッドを再度宣言することはできます。

多態性

上方変換と下方変換

上方変換: 子 —> 親 (アップキャスト)、自動型変換とも呼ばれる: Animal a = new Cat();
下方変換: 親 —> 子 (ダウンキャスト)、強制型変換とも呼ばれる: Cat c = (Cat) a;

下方変換が必要になるのはどのような場合ですか?

サブクラス オブジェクトに固有のメソッドを呼び出すか実行する必要があり、呼び出す前にメソッドをキャストダウンする必要があります。

下方転換リスク

ClassCastException (型変換例外) が発生しやすい

このリスクを回避するにはどうすればよいでしょうか?

instanceofこの演算子は、プログラムの実行フェーズ中に、参照が指すオブジェクトが特定の型であるかどうかを動的に判断できます。

ポリモーフィズムとは何ですか?

複数のフォーム、複数の状態、コンパイルと実行には 2 つの異なる状態があります。

  • コンパイル時の静的バインディング
  • 実行時に動的バインディングを実行します。
//编译的时候编译器发现a的类型是Animal,所以编译器会去Animal类中找move()方法
//找到了,绑定,编译通过。但是运行的时候和底层堆内存当中的实际对象有关
Animal a = new Cat();

//真正执行的时候会自动调用“堆内存中真实对象”的相关方法。
a.move();

典型的なポリモーフィック コード:親クラスの参照はサブクラス オブジェクトを指します

開発におけるポリモーフィズムの役割

プログラムの結合度を下げ、プログラムのスケーラビリティを向上させます。

最後のキーワード

「final」は不変の意味を意味し、

  1. 最終的に変更されたクラスは継承できません。
  2. 最終的に変更されたメソッドはオーバーライドできません。
  3. 最終的に変更された変数は変更できません。
  4. 最終的に変更された変数は明示的に初期化する必要があり、最終的に変更されたインスタンス変数は通常、静的な変更で追加され、静的な最終ジョイント変更変数は「定数」と呼ばれます。
  5. 最終的に変更された参照はオブジェクトのみを指すことができます。つまり、参照を再割り当てすることはできませんが、指定されたオブジェクトは変更できます。
  6. 構築メソッドをfinalで変更することはできません。
  7. これは Java クラスの初期化に影響します。final で定義された静的定数は、呼び出されたときに Java クラス初期化メソッドを実行しません。

静的型付け、動的型付け、静的バインディング、動的バインディング

参照変数には次の 2 つのタイプがあります。

  1. 静的型、つまり参照変数を定義する型。
  2. 動的タイプ、つまり参照が実際に指すオブジェクトのタイプ。

たとえば、2 つのクラス A と B の場合、次のようになります。A a=new B();このとき、a を参照する静的型は A、動的型は B です。

静的バインディング: 静的型に依存してメソッドをそのメソッドが属するクラスに関連付けるアクションはすべて静的バインディングです。静的バインディングはプログラムの実行前に発生するため、早期バインディングとも呼ばれます。

動的バインディング: メソッドを、そのメソッドが存在するクラスに関連付けるために動的タイプに依存するすべてのアクションは、動的バインディングです。動的バインディングはプログラムの実行時に RTTI を通じて実装されるため、遅延バインディングとも呼ばれます。

注: Java のクラスのプロパティ (変数) はすべて静的にバインドされます。

メソッドのオーバーライド、メソッドの非表示

  1. すべてのメンバー変数 (静的か非静的かに関係なく) は静的にのみバインドされます。
  2. 静的メソッドの場合、静的バインディングのみが実行されます。
  3. 非静的メソッドの場合、動的バインディングが発生します。

メソッドの隠蔽: 1 と 2 の 2 つのケースでは、サブクラスが親クラスを継承した後、親クラスのプロパティと静的メソッドはサブクラスによって消去されず、対応する参照を通じてアクセスできます。ただし、サブクラスでは明示的に見ることができません。これを非表示と呼びます。

メソッド カバレッジ: 3 の場合、サブクラスが親クラスを継承した後、親クラスの非静的メソッドはサブクラスによって上書きされ、対応する参照を通じてアクセスできなくなります (親クラスのオブジェクトが作成されない限り)。電話)。この状況をカバレッジと呼びます。

クラスの初期化プロセス

  1. クラスのインスタンスを作成するには、まずクラスをロードして初期化する必要があります。メイン メソッドが配置されているクラスを最初にロードして初期化する必要があります。
  2. サブクラスを初期化するには、まず親クラスを初期化する必要があります。
  3. クラスは () メソッドを実行することによって初期化されます。() メソッドは自動的に生成され、バイトコード内で検出されます。静的クラス変数には代入コードが表示されます静的ブロック合成。2 つのうちのどちらが最初に実行され、1 回だけ実行されます。

インスタンスの初期化プロセス

  1. インスタンスの初期化は、() メソッドを実行することです。() メソッドには複数のオーバーロードがある場合があり、複数の構築メソッドがある場合は複数の () があります。
  2. () メソッドには以下が含まれます非静的クラス インスタンス変数には割り当てコードが表示されます非静的コードブロック対応するコンストラクターコード合成では、最初の 2 つが最初に実行され、コンストラクター コードが最後に実行されます
  3. サブクラスのコンストラクターの最初の行が super() であるため、インスタンスが作成されるたびに対応する () メソッドが呼び出され、親クラスの () メソッドが毎回呼び出されます。

抽象クラス

抽象クラスとは何ですか?

クラスとクラスの間には共通の特徴があり、これらの共通の特徴が抽出されて抽象クラスが形成されます。

抽象クラスとはどのような型ですか?

参照データ型

定義構文

[修飾子リスト] 抽象クラス クラス名 {          クラス本体; }

特性

  1. 抽象クラスはインスタンス化できず、オブジェクトを作成できないため、抽象クラスはサブクラスによって継承されるために使用されます。
  2. Final と abstract を組み合わせて使用​​することはできません。final によって変更されたクラスは継承できないため、これら 2 つのキーワードは逆になります。
  3. 抽象クラスのサブクラスは、抽象クラスまたは非抽象クラスのいずれかになります。
  4. 抽象クラスはインスタンス化できませんが、抽象クラスにはサブクラスによって呼び出されるコンストラクターがあります。
  5. 抽象クラスには抽象メソッドが存在しない可能性がありますが、抽象メソッドは抽象クラス内に出現する必要があります。
  6. 抽象クラスを継承する非抽象クラスは、抽象クラスの抽象メソッドを書き換え、オーバーライドし、実装する必要があります。

抽象メソッド

抽象メソッドとは、メソッド本体のない、実装のないメソッドを意味します。

フォーマットを定義する

public abstract void doSome();

特徴

  • メソッド本体はなく、セミコロンで終わります。
  • 修飾子のリストには、abstract キーワードが含まれています。

インターフェース

  1. インターフェイスは「参照データ型」です。
  2. インターフェースは完全に抽象的です。
  3. インターフェイスは多重継承をサポートします。
  4. インターフェイスには定数と抽象メソッドのみがあります。
  5. インターフェース内のすべての要素がpublic変更されます。
  6. インターフェース内の抽象メソッドはpublic abstract省略できます。
  7. インターフェイス内の定数はpublic static final省略できます。
  8. インターフェイス内のメソッドはメソッド本体を持つことができません。
  9. 非抽象クラスがインターフェイスを実装する場合、インターフェイス内のすべてのメソッドを実装する必要があります。
  10. クラスは複数のインターフェイスを実装できます。
  11. 拡張と実装は共存できます。最初に拡張し、その後に実装します。
  12. インターフェイスを使用すると、コードを記述するときにポリモーフィズムを使用できます (スーパータイプ参照はサブタイプ オブジェクトを指します)。

フォーマットを定義する

[修飾子リスト] インターフェース インターフェース名 {         定数;         抽象メソッド; }


開発におけるインターフェースの役割

インターフェイス指向プログラミングは、プログラムの結合度を減らし、プログラムのスケーラビリティを向上させることができ、これは OCP 開発原則に沿ったものです。インターフェイスの使用は、ポリモーフィック メカニズムと切り離すことができません。(インターフェース + ポリモーフィズムにより結合を軽減できます)

インターフェイスは分離でき、どのインターフェイスにも呼び出し側と実装側があります。インターフェイスは呼び出し元を実装者から切り離すことができます。呼び出し元はインターフェイスを呼び出し、実装者はインターフェイスの実装を作成します。

クラスとクラス間の関係

is a(继承):
	凡是能够满足is a的表示“继承关系“
	A extends B

has a(关联):
	凡是能够满足has a关系的表示“关联关系”
	关联关系通常以“属性”的形式存在。
	A{
	      B  b
	}

like a(实现):
	凡是能够满足like a关系的表示“实现关系”
	实现关系通常是:类实现接口。
	A implements B

抽象クラスとインターフェースの違い

  1. 抽象クラスは半抽象であり、インターフェイスは完全に抽象です。

  2. 抽象クラスにはコンストラクターがありますが、インターフェイスにはコンストラクターがありません。

  3. インターフェイス間では複数の継承がサポートされますが、クラス間では単一の継承のみがサポートされます。

  4. クラスは同時に複数のインターフェイスを実装できますが、抽象クラスは 1 つのクラスからのみ継承できます。

  5. インターフェイスでは定数と抽象メソッドのみが許可されます。

おすすめ

転載: blog.csdn.net/LogosTR_/article/details/126239073