第二に、継承
同じ特性とクラスの複数の挙動の存在は、単一のクラスに抽出されたコンテンツは、複数のクラスは、これらの特性および挙動を定義する必要があり、抽出していない場合にのみ、クラスの継承を構成しています。
-
-
改善のコードのスケーラビリティを。
-
クラス間の関係を生成、学習された前提の多型を。
[修飾]親クラス{
...
}
[修飾]はクラスのサブクラスが延び親{
...
}
-
-
が、サブクラスは親クラスプライベート(プライベート)のメンバーを継承しますが、サブクラスがプライベートメンバーに直接アクセスを継承することはできませんし、継承されたのget / setメソッドを介してアクセスすることができます。図示のように:
我々が言うすべての親クラスのメンバ変数は、子クラスのメンバ変数の親は何が起こるかと同じ名前で表示されている場合は、サブクラスに継承されていますか?
結論:
あなたは親クラスのアクセスプライベートメンバ変数にしたい場合は(1)サブクラスで親クラスのメンバ変数の民営化は、直接アクセスすることはできません、それは、同じ名前かどうか、親クラスしか得ることができます/セットには影響を与えません。アクセス方法。
フォーマット:.スーパー親クラスのメンバ変数名
注:私たちはクラスのメンバ変数が、実際の開発として、父と息子の間で同じ名前を区別することができますが、我々はそうすることはお勧めしません。
それを行う方法を、私たちはすべての親クラスのサブクラスが継承することを言うが、この方法は、サブクラスによって継承されている場合、元の親クラスを実装するサブクラスは、サブカテゴリーには適していませんか?
オーバーライド@ 1:有効な権利を検出するための上記の方法で書かれては上書きされません。このコメントはさえ満たしている限り、要件を書き込みませんが、また、適切なアプローチは上書き。予約をお勧め
2.父と息子の間にクラスことを保証しなければならないメソッドと同じ名前、パラメータリストが同じです。
注:戻り値の型は、基本データ型とvoidの場合、それは同じでなければなりません
4. 許可サブクラスのメソッドは、[]親プロセス許可修飾子以上でなければなりません。
5.いくつかの特別な方法を書き換えることはできません
-
静的メソッドをオーバーライドすることはできません
-
他のプライベートサブクラスでは目に見えない方法を書き換えることはできません
-
最終的な方法をオーバーライドすることはできません
ヒント:オーバーライドする場合は、メンバーの方法を表すスーパー親クラスのメンバメソッドは、親クラスを呼び出して使用します。
工法のすべてのタイプでは、クラス間の関係を生成するだけでなく、ときに何も影響を与えますか?
-
だから、サブクラスは継承することができませんでした親クラスのコンストラクタをされています。
-
コンストラクタの役割は、親クラスからすべてのメンバ変数を継承するサブクラスのインスタンス変数を初期化することです
だから、のサブクラスの初期化プロセスを、あなたがしなければならない最初の親クラスの初期化を実行アクションを。デフォルトのサブクラスのコンストラクタ、初期化メソッドの例を表しているが、彼らはサブクラスに使用することができます前に、親クラスのメンバ変数が初期化され、親クラスと呼ばれています。
super()
引数なしで親クラスのコンストラクタがない場合にはどのように行うには?
解決策:スーパーでのサブクラスのコンストラクタ(引数リスト)で、解決するために、親クラスのコンストラクタのパラメータを呼び出して示しました。
結論:
サブクラスのオブジェクトのインスタンス化のプロセスは、親クラスのメンバ変数のインスタンスから継承された初期化を完了する必要があり、このプロセスは、親クラスのインスタンス初期化メソッド呼び出しを介して完了します。
-
スーパーは():引数のインスタンス初期化メソッドは、親クラスを呼び出すないことを示し、親クラスが設定パラメータを持っている必要があります必要とし、省略することができます。
-
スーパー(引数リスト):父が引数なしのコンストラクタがないときに父と呼ばれるパラメータのインスタンスの初期化方法を示し、サブクラスのコンストラクタの最初の行は、明示的に親が持っている呼び出すためにスーパー(引数リスト)書き込む必要があります構成パラメータ(実際には、最初のコンストラクタメソッド呼び出しに対応する例です)
-
スーパー()、スーパー(引数リスト)の最初の行は、サブクラスのコンストラクタで表示されます
それは何のサブクラス、クラスが継承できないことを示していません
2、修飾法
それは、このメソッドはサブクラスでオーバーライドすることができないことを示しています
3、定数声明
最終的な修正とメンバ変数、メソッドが設定されていない、と初期化されなければならない場合(明示的に初期化ブロックで割り当てられ又は割り当てられ、インスタンス変数は、コンストラクタに割り当てることができます)
これが表す現在のオブジェクト参照(アドレス値)、オブジェクトの所有参照を。
-
-
このアプローチの例:そのオブジェクトはこの上を表して呼び出している誰が、ある方法を、コールします。
1、この。メンバ変数名
2、これ。メンバー方法
あなたは現在のオブジェクトのメソッドのメンバーに自分自身を呼び出すとき、「これを。」を追加することができ、これを省略することができ、実際の開発は省略されています
。3、この()または本(引数リスト)
現在の必要性は、他のコンストラクタを呼び出すようにすると、この形態で使用することができます。
要件:
クラスコンストラクタnを宣言した場合、最大nである - 1つのコンストラクタは、そうでなければ無限ループは再帰呼び出しを発生する、「この(引数リスト[])」で使用され
サブクラスで親クラスのメンバ変数、親クラスのメンバ変数のサブクラスと同じ名前を持つ、特にメンバ変数へのアクセス。
(3)スーパー()やスーパー(引数リスト)
サブクラスのコンストラクタ内の最初の行の親クラスのコンストラクタを呼び出すかを示すために、(初期化方法は、本質的にこのような構成の対応の一例です)
スーパー()、これは()コンストラクタの最初の行にする必要があり、それは同時に発生することはできません。
-
そして、これはスーパーではありません
-
コンストラクタで、コードブロック、変数がある場合に使用されている方法、それが現在のブロックで宣言されたローカル変数であるかどうかを最初にチェック、
-
-
現在のクラスが見つからない場合、それは親クラスを検索します(非プライベート、クロス・パッケージがデフォルトすることはできません)
-
-
この:代表現在のオブジェクト参照。
-
現在のクラスのfindで始まる、このメンバ変数とメンバメソッドを見たとき、親は(非プライベートではなく、クロス・パッケージがデフォルトです)のアップ見つかりません。
-
しかし、この()または本(引数リスト)がこのカテゴリーにあります
-
-
スーパー:の親クラスの代わりにストレージ空間識別子(それは彼の父への参照として理解することができます)。
-
スーパーのメンバ変数とメンバメソッドを見たとき、直接の親クラスの空間から検索する(親クラスの継承親クラスが含まれます)
-
スーパー()やスーパー(引数リスト)のみ直接の親から検索します
-
唯一の(非プライベート、クロス・パッケージがデフォルトすることはできません)、スーパーでのサブクラスに表示されている親クラスにアクセスすることができます
-
注:スーパーこれは、静的及び静的コードブロックで発生することができず、これは、スーパーの存在目的で
(1)静的クラスのメンバ変数の明示的な割り当て
(2)ブロック内の静的コードステートメント
クラス全体が一度だけ初期化され、親クラスが初期化されていないことが判明し、サブクラスの初期化、場合、それは最初に親クラスを初期化します。
結論:
各クラスは、クラスの初期化方法有する<clinit> ()メソッド、および、親クラスが初期化され、ロードされていない場合、最初のロード及び親クラスは、ロードおよび初期化サブクラスを初期化することを見出したサブクラスを、初期化します。このクラスは、一度だけ初期化。
方法の例は、4つの部分から構成され、その方法を初期化:
(1)スーパー()やスーパー(引数リスト)ここで)(デフォルトのスーパーがあり、私は書いていない、オリジナルのコンストラクタの最初の行を見ては真実ではない、選択
(2)非静的インスタンス変数表示割り当て
(3)非静的ブロック
(4)コードのコンストラクタに対応
特別注:(2)及び(3)の順序で混合され、前部(4)(1)の定数は、最終的な表面でなければなりません
実行:
-
あなたがオブジェクトを作成すると、それが実装されます、
-
コンストラクタを呼び出すには、対応するインスタンスの初期化方法であり、
-
あなたは、サブクラスのオブジェクトを作成すると、対応する親クラスの初期化のインスタンスは、最初に親クラスの初期化メソッドのどのインスタンスの実装を実行され、スーパー(使用して参照)、またはスーパー(引数リスト)
結論:
クラスの初期化は間違いなく、インスタンスの初期化よりも優先されます。
クラスは一度だけ初期化されます。
インスタンスは、オブジェクトが実行されるべきであるたびに作成されて初期化します。