Javaオブジェクト指向の基本的な文法06- - 継承

第二に、継承

同じ特性とクラスの複数の挙動の存在は、単一のクラスに抽出されたコンテンツは、複数のクラスは、これらの特性および挙動を定義する必要があり、抽出していない場合にのみ、クラスの継承を構成しています。

継承のメリット

  • 改善のコードの再利用性を

  • 改善のコードのスケーラビリティを

  • クラス間の関係を生成、学習された前提の多型を

継承形式extends()

[修飾]親クラス{
  ...
}

[修飾]はクラスのサブクラスが延び親{
  ...
}

継承機能:メンバ変数

1、親クラスのメンバ変数の民営化(民間)

  • 親クラスのメンバーは、それが公共(パブリック)または(プライベート)プライベートであるかどうかを、サブクラスによって継承されます。

  • が、サブクラスは親クラスプライベート(プライベート)のメンバーを継承しますが、サブクラスがプライベートメンバーに直接アクセスを継承することはできませんし、継承されたのget / setメソッドを介してアクセスすることができます。図示のように:

同じ名前の2、親子クラスのメンバ変数

我々が言うすべての親クラスのメンバ変数は、子クラスのメンバ変数の親は何が起こるかと同じ名前で表示されている場合は、サブクラスに継承されていますか?

結論:

あなたは親クラスのアクセスプライベートメンバ変数にしたい場合は(1)サブクラスで親クラスのメンバ変数の民営化は、直接アクセスすることはできません、それは、同じ名前かどうか、親クラスしか得ることができます/セットには影響を与えません。アクセス方法。

(2)重複する名前がある場合、サブクラスの親クラスの非独占、ダイレクトアクセスのメンバ変数は、そう、あなたが追加する必要がある場合には、「スーパー」を区別します。

フォーマット:.スーパー親クラスのメンバ変数名

注:私たちはクラスのメンバ変数が、実際の開発として、父と息子の間で同じ名前を区別することができますが、我々はそうすることはお勧めしません。

継承特長II:メンバー・メソッド

それを行う方法を、私たちはすべての親クラスのサブクラスが継承することを言うが、この方法は、サブクラスによって継承されている場合、元の親クラスを実装するサブクラスは、サブカテゴリーには適していませんか?

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

オーバーライド@ 1:有効な権利を検出するための上記の方法で書かれては上書きされません。このコメントはさえ満たしている限り、要件を書き込みませんが、また、適切なアプローチは上書き。予約をお勧め

2.父と息子の間にクラスことを保証しなければならないメソッドと同じ名前、パラメータリストが同じです

前記サブクラスのメソッドの戻り型は、[親]メソッドの戻り型以下でなければならない(例えば、以下そのサブクラスより実際に学生<人)。

:戻り値の型は、基本データ型とvoidの場合、それは同じでなければなりません

4. 許可サブクラスのメソッドは、[]親プロセス許可修飾子以上でなければなりません小さな拡張注:公共>保護>デフォルト>プライベート

5.いくつかの特別な方法を書き換えることはできません

  • 静的メソッドをオーバーライドすることはできません

  • 他のプライベートサブクラスでは目に見えない方法を書き換えることはできません

  • 最終的な方法をオーバーライドすることはできません

ヒント:オーバーライドする場合は、メンバーの方法を表すスーパー親クラスのメンバメソッドは、親クラスを呼び出して使用します。

継承した3つの特徴:コンストラクタ

工法のすべてのタイプでは、クラス間の関係を生成するだけでなく、ときに何も影響を与えますか?

まず、フォーマットを定義する必要がコンストラクタという二つの役割を思い出しました。

  1. コンストラクタ・メソッドの名前は、クラス名と一致しています。

    だから、サブクラスは継承することができませんでした親クラスのコンストラクタをされています。

  2. コンストラクタの役割は、親クラスからすべてのメンバ変数を継承するサブクラスのインスタンス変数を初期化することです

    だから、のサブクラスの初期化プロセスを、あなたがしなければならない最初の親クラスの初期化を実行アクションを。デフォルトのサブクラスのコンストラクタ、初期化メソッドの例を表しているが、彼らはサブクラスに使用することができます前に、親クラスのメンバ変数が初期化され、親クラスと呼ばれています。super()

引数なしで親クラスのコンストラクタがない場合にはどのように行うには?

解決策:スーパーでのサブクラスのコンストラクタ(引数リスト)で、解決するために、親クラスのコンストラクタのパラメータを呼び出して示しました。

結論:

サブクラスのオブジェクトのインスタンス化のプロセスは、親クラスのメンバ変数のインスタンスから継承された初期化を完了する必要があり、このプロセスは、親クラスのインスタンス初期化メソッド呼び出しを介して完了します。

  • スーパーは():引数のインスタンス初期化メソッドは、親クラスを呼び出すないことを示し、親クラスが設定パラメータを持っている必要があります必要とし、省略することができます。

  • スーパー(引数リスト):父が引数なしのコンストラクタがないときに父と呼ばれるパラメータのインスタンスの初期化方法を示し、サブクラスのコンストラクタの最初の行は、明示的に親が持っている呼び出すためにスーパー(引数リスト)書き込む必要があります構成パラメータ(実際には、最初のコンストラクタメソッド呼び出しに対応する例です)

  • スーパー()、スーパー(引数リスト)の最初の行は、サブクラスのコンストラクタで表示されます

継承の特徴4:単一継承の制限

1、Javaは多重継承をサポートしていない、単一継承のみをサポートしています。

2、Javaは多重継承(継承システム)をサポートしています。

トップレベルの親クラスはObjectクラスです。すべてのクラスは親クラスとして、デフォルトのオブジェクトを継承します。

3、サブクラスとスーパークラスは、相対的な概念です。

4、親は同時にサブクラスを持つことができます

finalキーワード

最終:最終的かつ変更することはできません、それがある使用されます。

1、修飾クラス

それは何のサブクラス、クラスが継承できないことを示していません

2、修飾法

それは、このメソッドはサブクラスでオーバーライドすることができないことを示しています

3、定数声明

特定の変数(メンバ変数またはローカル変数)の最終的な修飾は、その値を変更できない定数を表し、定数名は、大文字を使用することを推奨しました。

最終的な修正とメンバ変数、メソッドが設定されていない、と初期化されなければならない場合(明示的に初期化ブロックで割り当てられ又は割り当てられ、インスタンス変数は、コンストラクタに割り当てることができます)

このキーワード

これが表す現在のオブジェクト参照(アドレス値)、オブジェクトの所有参照を。

  • これは、コンストラクタで使用することができます。オブジェクトのインスタンスが作成されていることは、つまり、新しい誰であるか、これはちょうど、誰が表します

  • このアプローチの例:そのオブジェクトはこの上を表して呼び出している誰が、ある方法を、コールします。

このフォーマットを使用します

1、この。メンバ変数名

現在のオブジェクトのメンバ変数と同じ名前のローカル変数は、このメンバ変数の前に追加することができるとき。いいえ名前が重複した場合、これを省略することができます。

2、これ。メンバー方法

あなたは現在のオブジェクトのメソッドのメンバーに自分自身を呼び出すとき、「これを。」を追加することができ、これを省略することができ、実際の開発は省略されています

。3、この()または本(引数リスト)

現在の必要性は、他のコンストラクタを呼び出すようにすると、この形態で使用することができます。

要件:

コンストラクタである必要があります最初の行

クラスコンストラクタnを宣言した場合、最大nである - 1つのコンストラクタは、そうでなければ無限ループは再帰呼び出しを発生する、「この(引数リスト[])」で使用され

superキーワード

親クラス参照の代わりにスーパー

注:サブクラスでスーパーで親クラスのメンバを参照するとき、それは、サブカテゴリーのメンバーは、人権問題修飾子に注意を払うことで、まだ表示されていることを確認する必要があります

(1)スーパー。メンバ変数

サブクラスで親クラスのメンバ変数、親クラスのメンバ変数のサブクラスと同じ名前を持つ、特にメンバ変数へのアクセス。

(2)スーパー。メンバ・メソッド

あなたは、子クラスは親クラスのメンバーをオーバーライドする場合は特に、サブクラスで親クラスのメンバーメソッドを呼び出すと

(3)スーパー()やスーパー(引数リスト)

サブクラスのコンストラクタ内の最初の行の親クラスのコンストラクタを呼び出すかを示すために、(初期化方法は、本質的にこのような構成の対応の一例です)

スーパー()、これは()コンストラクタの最初の行にする必要があり、それは同時に発生することはできません。

近接原理:複雑な問題を解決するには

  • そして、これはスーパーではありません

    • コンストラクタで、コードブロック、変数がある場合に使用されている方法、それが現在のブロックで宣言されたローカル変数であるかどうかを最初にチェック、

    • それは現在のクラスのメンバ変数を、外出先から始まる、ローカル変数ではない場合

    • 現在のクラスが見つからない場合、それは親クラスを検索します(非プライベート、クロス・パッケージがデフォルトすることはできません)

  • この:代表現在のオブジェクト参照

    • 現在のクラスのfindで始まる、このメンバ変数とメンバメソッドを見たとき、親は(非プライベートではなく、クロス・パッケージがデフォルトです)のアップ見つかりません。

    • しかし、この()または本(引数リスト)がこのカテゴリーにあります

  • スーパー:の親クラスの代わりにストレージ空間識別子(それは彼の父への参照として理解することができます)。

    • スーパーのメンバ変数とメンバメソッドを見たとき、直接の親クラスの空間から検索する(親クラスの継承親クラスが含まれます)

    • スーパー()やスーパー(引数リスト)のみ直接の親から検索します

    • 唯一の(非プライベート、クロス・パッケージがデフォルトすることはできません)、スーパーでのサブクラスに表示されている親クラスにアクセスすることができます

注:スーパーこれは、静的及び静的コードブロックで発生することができず、これは、スーパーの存在目的

継承と初期化

クラスの初期化

実際には、呼の初期化プロセスが基づく場合<clinit> ()メソッドは、この方法は、自動的にコンパイラによって生成されます。コンパイラは、2つの部分はであろう次のすべてのコードは、シーケンス内のクラス初期化子に組み込ま<clinit> ()メソッド本体。

(1)静的クラスのメンバ変数の明示的な割り当て

(2)ブロック内の静的コードステートメント

クラス全体が一度だけ初期化され、親クラスが初期化されていないことが判明し、サブクラスの初期化、場合、それは最初に親クラスを初期化します。

結論:

各クラスは、クラスの初期化方法有する<clinit> ()メソッド、および、親クラスが初期化され、ロードされていない場合、最初のロード及び親クラスは、ロードおよび初期化サブクラスを初期化することを見出したサブクラスを、初期化します。このクラスは、一度だけ初期化。

初期化の例

実際には、コンパイル時に我々のコード、自動的に処理するコードは、一緒にA置く<clinit> )(クラスの初期化メソッドを、だけでなく、一種の一つ以上のうちの<init> (...)インスタンスの初期化方法。クラスの初期化メソッドのいくつかのインスタンスがありますが、このクラスは、いくつかのコンストラクタが決定しています。

方法の例は、4つの部分から構成され、その方法を初期化:

(1)スーパー()やスーパー(引数リスト)ここで)(デフォルトのスーパーがあり、私は書いていない、オリジナルのコンストラクタの最初の行を見ては真実ではない、選択

(2)非静的インスタンス変数表示割り当て

(3)非静的ブロック

(4)コードのコンストラクタに対応

特別注:(2)及び(3)の順序で混合され、前部(4)(1)の定数は、最終的な表面でなければなりません

実行:

  • あなたがオブジェクトを作成すると、それが実装されます、

  • コンストラクタを呼び出すには、対応するインスタンスの初期化方法であり、

  • あなたは、サブクラスのオブジェクトを作成すると、対応する親クラスの初期化のインスタンスは、最初に親クラスの初期化メソッドのどのインスタンスの実装を実行され、スーパー(使用して参照)、またはスーパー(引数リスト)

結論:

クラスの初期化は間違いなく、インスタンスの初期化よりも優先されます。

クラスは一度だけ初期化されます。

インスタンスは、オブジェクトが実行されるべきであるたびに作成されて初期化します。

 

おすすめ

転載: www.cnblogs.com/Open-ing/p/11862774.html