JAVAの知識の概要(3):継承とアクセス修飾子

今日、いくつかの乗馬の時間がありますが、簡潔に最後の延滞の継承やポリモーフィズムにおけるオブジェクト指向プログラミングの三の大特性の遺産を説明します。この部分は非常に重要であり、慎重に検討する必要があります。

継承

継承:それはベースとして既存のクラスを使用して、新しいクラスを作成するには、クラスとクラス間の関係です。ここで、既存のクラスは親クラス(または基底クラス)と呼ばれ、新しいクラスが子クラス(または派生クラス)と呼ばれる確立します。最も簡単なのは、サブクラスの継承にプロパティと親クラスの非プライベートな方法です。

新たに定義されたクラスは、それ自身の親クラスの機能を使用するか、新しいデータや新しい機能を追加していくことを選択することに留意すべきであるが、選択的に親クラスを継承することはできません(どちらかがすべてを継承します(非プライベートの前提)、または継承されていません)

であれば満足継承の形「AはBである」の関係は、遺伝コードにより達成されるキーワードに延びています。

特記事項:Javaだけで(ある、単一継承)親クラスを継承し、サブクラスがスーパークラスの非privateメンバにアクセスすることができます。これは同じではなく、Pythonは、Pythonは柔軟継承することができます。

我々はサブクラスは親クラスを継承知った後、あなたはスーパークラスのプライベートメンバーにアクセスすることができます。しかし、親クラスのプライベートメンバー、サブクラスまたは直接アクセスすることはできません。我々はそれをアクセスしたい場合は?これは、親クラスの暴露のパブリックメソッドを介して間接的に達成することができます。

親が独自のサブクラスのメンバー(でも、パブリックメンバー)にアクセスすることはできませんが、親クラスのオブジェクトサブクラスの特定のメソッドやプロパティにアクセスすることができません

オーバーロード

オーバーロードの方法は、以下の条件を満たしている必要があります。

  1. 同じクラス;;
  2. 同じメソッド名、異なるパラメータ(パラメータの順序、数、タイプ)のリスト。
  3. この方法は、値、任意のアクセス修飾子を返します。
  4. かかわらず、パラメータ名の方法の。
public void printinfo() {
    System.out.println("方法重载1");
};

public void printinfo(String name) {

    System.out.println("方法重载2");
};

public String printinfo(String name, int age) {
    return "方法重载3";
};

public String printinfo(String age, String name) {
    return "方法重载4";
};

public String printinfo(int age, String name) {
    return "方法重载5";
};

 // 与方法的参数名无关,加上下面的代码会和上面的 printinfo(int age, String name)造成重复而报错:
public String printinfo(int size, String name) {
    return "方法重载5";
};

リライト

書き換えの方法はまた、以下の基準を満たさなければならない:
1、サブクラス継承関係を満たす;
;、2同じ(パラメータの順序、数、タイプ)パラメータリストの同じメソッド名を
メソッドの戻り値が同じサブクラスであり、3またはタイプ(ただし、Object型の、それまで、下位互換性があってもよいことは不可能である);
4、アクセス修飾子がより大きいまたは範囲継承されたメソッドを制限することに等しいです。
(アクセス修飾子サブクラス親以上の範囲を限定する、大小2;戻り型と例外が少ない親サブクラスを必要とする)
注:サブクラスで同じ名前の親クラスで定義することができますプロパティが、そのプロパティを書き換えることができることを意味するものではありません。

アクセス修飾子

:Javaのこれはつまり、アクセス修飾子の4種類の合計が含まれているでは
プライベート、1:;プライベート
2、デフォルト;
3、保護:保護;
4、公共:公共。

ここで、プライベート:アクセスは、このクラスのスコープ内でのみ許可され、クラスが現在のアクセスを残すことはできません。

デフォルト:バンズクラス/非子クラスで、現在のクラスを可能にしますが、クロスバンズクラス/非子クラスが許可されていない呼び出すことができます。

保護された:それは同じパッケージ/非子クラスのサブクラスは、クロスバンズだけでなく、クラスを呼び出すことができ、現在のクラスを可能にします。非子クラス・コールのクロスパッケージは許可されていません。

国民は:アクセスどこでもすることができます。

上から下へ、前の順、アクセス範囲の増加に従って、ボトムアップ、成長能力を制限:

(非子クラスとパンと同じパケットタイプなど;クラス含むサブクラスを有するパンクロスパン等)

オーバーライドされたメソッドのアクセス修飾子に影響を与えます

サブクラスオーバーライド親クラスのメソッドのアクセス修飾子を変化させると、それが必要とされる:アクセス範囲サブクラスは、親クラスのアクセス範囲に等しいより大きくなければなりません。親クラスのアクセス修飾子が公開されている場合は、この手段は、そのサブクラスのアクセス修飾子は、パブリック、他の類似していなければならないということ。

継承され初期化シーケンス

次のように相続の初期化シーケンスの後、次のとおりです。

親クラスの静的メンバ- >サブクラスの静的メンバ- >親オブジェクトのコンストラクタ- >コンストラクタオブジェクト
コンストラクタ>親クラス- (親クラスの静的メンバ- >サブクラスの静的メンバ- >親オブジェクトのコンストラクタ- >コンストラクタクラスオブジェクト- >コンストラクタサブクラス)

一つの問題:アクセス修飾子は、ロード・シーケンスのメンバーは静的メンバーの静的コード・ブロックの実行よりも優先されます影響を与えます?

アクセス修飾子はについて書くの位置と、ロード・シーケンスのメンバーには影響を与えません。静的変数の前に書かれたコードの静的ブロックした場合、それは静的なコードブロックを実行します。

superキーワード

サブクラスの継承とオーバーライド親クラスならば、我々は通常、サブクラスのメソッドが書き換えられていることを呼び出します。あなたが親クラスのメソッドを呼び出す必要がある場合、我々は使用することができsuper.方法、この目的を達成するために。

もちろん、それを使用することも可能でsuper.属性親クラスの非独占的財産へのアクセスの目的を達成するために。

親クラスのアクセス修飾子のコンストラクタが公開されているが、それはサブクラスに継承してオーバーライドすることはできません。

それは2ではありませんが、その存在が必要であるが、サブクラスのインスタンスが生成されるので、オブジェクトのコンストラクタは、親クラスのオブジェクト(デフォルトなし参照またはコンストラクタの引数)に依存します。

サブクラスのコンストラクタは、彼らが持っている引数を呼び出し、親クラスがパラメータを定義し、コンストラクタにパラメータがない場合は、プログラムはまだ引数なしで親クラスのコンストラクタを呼び出しています。言い換えれば、私たちは、明示的にサブクラスのコンストラクタで述べていない、パラメータなしのデフォルトのコンストラクタは、親クラスを呼び出すために、親クラスのように、引数なしのコンストラクタが非常に重要であり、それ以外の場合は、サブクラスに影響を与えます、書き込んでくださいオブジェクトをインスタンス化します。

サブクラスのコンストラクタは、どちらも明示的に引数なしで親クラスのコンストラクタを標識していない場合は、コンパイルエラーが発生します。

我々は使用することができsuper(参数)、親クラスのコンストラクタを呼び出すためにこのフォームを(コンストラクタは、サブクラス化しなければなりません(他のすべてが失敗した)他の方法がアクセスすることを可能にするが、今回はスーパー()最初の行のサブクラス有効なコードのコンストラクタに配置する必要があります最初の行(他の大丈夫))。

その親クラスは、である(デフォルトコンストラクタは、引数なしを呼び出したときに(このケースではあなたは、コンストラクタが可能である無引数を定義しません)インスタンス化されていますが、サブクラスは、オブジェクトがインスタンス化された時間の兆候を示さない場合デフォルトコンストラクタは、スーパークラスの引数なし)を呼び出しますが、引数なしのコンストラクタが存在しない親が実際にこの時間は、それはコンパイルエラーがトリガされます。

このスーパーの比較

これ:このクラスのオブジェクト参照:
1、現在のクラスのメソッドアクセス部材;
2、現在のアクセス・クラス・メンバーの特性、
図3に示すように、現在のクラスのコンストラクタへのアクセス;
4、静的方法で使用することができない;
****
スーパー。親クラス・オブジェクト参照:
1、親クラスのメソッドへのアクセスのメンバー;
2、親クラス属性へのアクセスのメンバー;
3、親クラスのコンストラクタへのアクセス;
4、静的方法で使用することができない;
****
注:コールコンストラクタは、これは(最初の行は、前記の前に必要とされるどちらも)同時に、超存在することができない場合。

Objectクラス

Objectクラスは、この基本クラスオブジェクトから継承するすべてのPythonのクラスである、ほとんどPythonで実際にはすべてのクラスの親であり、この。ビューダイレクトAPIのこのポイント:javase8api

クラスが明示的に使用するキーワードを識別しません(配列を含む)Objectクラス継承デフォルトでは、継承を拡張します。

Class Object is the root of the class hierarchy.
Every class has Object as a superclass. 
All objects, including arrays, implement the methods of this class.

java.langパッケージに格納されているオブジェクトクラスは、このパッケージは、デフォルトでは、私たちに直接ロードされます。

使い方に等しいです

サブクラスは、オブジェクト・クラスのメソッドに等しい書き換えない場合、比較は、2つの参照が同じアドレスを指しているかどうかであり、比較は、文字列の値が等しくなるようにStringクラスは、オブジェクトクラスのメソッドに等しいオーバーライド。(含意、サブクラスは、比較の内容を変更、equalsメソッドフォームをオーバーライドすることができます)

我々は2つのオブジェクトがアドレスとの比較、または参照の値と等しいことを言うことはできませんが、私たちはその「==」の比較を言うことができますが、それは、2つのオブジェクトのアドレスを参照する必要があります。

toStringの使用状況

APIこれまで:(パッケージ名に最後にリターンをToStringメソッド、教えてください。クラス名@メモリハッシュコード)

 getClass().getName() + '@' + Integer.toHexString(hashCode())

同様に、サブクラスのメソッドToStringオブジェクトクラスがオーバーライドしない場合、出力ハッシュコードはメモリで印刷され、クラスの文字列toStringメソッド書き直しオブジェクトクラス、および印刷出力それらの真の値。(含意、サブクラスは、出力の内容を変更、toStringメソッドフォームをオーバーライドすることができます)

また、出力されることに留意すべきである对象对象.toString効果は、直接、出力対象が実際にオブジェクト.toStringメソッドが呼び出されたときと同じです。

finalキーワード

私たちは、あるクラスが継承されたくない場合は、いくつかの方法が上書きされたり、一部のデータが変更され、あなたは、この目的のために、最終的なキーワードを使用することができます。

クラスが最終変更された場合、そのクラスが継承することができない、クラスがあれば、それはクラスの前に配置することができるように、サブクラス、パブリック最終クラス/最終のパブリッククラスことができませんがあることを示しています。

この方法は、最終的な変更の場合は、メソッドがオーバーライドすることはできませんが、(最後のコンストラクタが変更することはできません)継承コールにそれをサブクラスには影響を与えないことを示しています。

ローカル変数は、最終的な変更がある場合、我々はすぐに同じ時間割り当てで宣言することはできませんが、割り当ては変更することはできません一度、使用前に割り当てる必要があります。

(方法の範囲内のローカル変数は、ラインからブレース端に開始、クラスのメンバ変数のスコープは、その前面アクセス修飾子に依存します)。

メンバ変数が最終変更がある場合は、割り当ての後、すぐに我々はまた、宣言する必要はありません同じ時間に割り当てられていたが、使用前に割り当てられなければならない、とだけコンストラクタまたはクラスのコードブロック(ブロック構造)に割り当てることができますこれは変更することができない、三つの方法を有することができ、クラスメンバーが割り当てられている属性:1.直接初期化の定義は、2コンストラクタ; 3.構成ブロック(クラス・コード・ブロック)。

注:コンストラクタの内部で割り当てのために選択されたメンバー変数は、あなたがすべてのコンストラクタ内の値を割り当てる必要がある場合は、複数のコンストラクタ、最後のキーワードが変更されているが、異なる施工方法が異なる値を割り当てることができた場合

データの種類の最終影響

私たちは、そのJavaデータ型は、基本データ型(バイト、ショート、int型、長い、フロート、ダブル、文字、ブール値)と基準データのタイプに分けている知っている(配列、文字列、インターフェイス、カスタムクラス...)

基本的に直接割り当てることができるデータのタイプが、参照型、それらがその標的に割り当てることができる前に、クラスのオブジェクトをインスタンス化する必要がある(これはかなり特殊である文字列、2つの形式が可能です)

私たちは、データそのものであり、メモリに格納されている参照データの型がオブジェクト参照アドレスでメモリに格納されたデータの基本的なタイプを知っています。

次の例では、最終修正その参照アドレスを変更してはなりませんが、プロパティが可能であることを教えてくれる:

final Test test=new Test("hello");  
//      test=new Test ();
        Test.key="world";

一度初期値を変更することができない変数の基本的なデータタイプを、そして参照型変数の初期化が別のオブジェクトを指し示すことができないだけ後に、そのオブジェクトの内容が可変である:それはこれに帰着します。

従って静的最終とは、修飾法および変数のために使用すること。典型的には、(そのような情報のニーズが一度だけロードされ、後で変更する必要はなくなるように)設定情報を変更するために使用されます。最終修正を使用する含意は、パフォーマンスを向上させるが、拡張性を低減することができます。

共通コード・ブロック、コードブロックタイプ、ブロック構造、静的コードブロックの間の差

コードブロックは中括弧{}のペアがコンテンツを囲まれています。

共通コード・ブロックは、中括弧{}のみクラスメソッドに存在する、コンテンツを囲まれた一対のです。

クラスコードブロックとコードブロックは、事を構成され、直接クラスに定義されている、以前に静的に変更することはありません。コードブロックは、オブジェクトが作成されるときに毎回、オブジェクトを作成するために呼び出されると呼ばれるように構成されており、優先クラスのコンストラクタのコードブロック構造の実行順序れます。

静的上記のコードブロックは、任意のインビボ方法に存在しない静的キーワードを変更した、あなたが直接アクセスする例必要によりオブジェクト・クラスのインスタンス変数とインスタンスメソッドにアクセスすることができません。

そのような初期化シーケンスを通過するために通常、私たちの新しいオブジェクト、JVM:静的ブロック親クラス>サブクラスの静的ブロック>親属性>親クラスのコンストラクタ>子プロパティ>サブクラスのコンストラクタ、このシリーズは、作業の多くを消費しますメモリとCPU。

具体的な研究はここで見ることができます:コードブロックのjavaの4種類の説明を

Javaアノテーションで

JDK1.5アノテーションが導入特性リリースであり、それはこれらの要素がパッケージ内等、クラス、プロパティ、メソッド、ローカル変数、パラメータ、上記、役割注釈の方法を説明することを宣言することができます。

操作機構に従って分類

ノートオペレーティングメカニズム:分割するには、三つの部分に分けることができ、ソース・ノート、コンパイル時の注釈、メモランタイム。

ソース注:バイトコードの.classファイルにコンパイルされたソース.javaファイルにのみ存在は、存在しません。

注釈コンパイル:.javaファイルは、ソースコードやバイト.classファイル内に存在しています。

メモは、実行時:また、運用段階での役割を果たし、さらにはノートのロジックの動作に影響を与えます。(依存性注入@Autowiredスプリングフレームような注釈は、それが自動的にアノテーションのプログラム論理の動作に影響を与えることができる操作の一種である着信外部メッセージ、にロードされたプログラムを実行するプロセスで達成されます。)

点の情報源によると

応じてノートソース:分割するには、3つの部分に分けることができるJDK注釈、サードパーティの注釈、カスタム注釈。

メタ注釈は、注釈付きのノートでもあります。

単語や超高速4000の単語、最後のオブジェクト指向機能を読んで、読んで、ダイ:多型が、私は言わなかった、次回、運動今日は離れて圧延しました。ツアーをお読みいただきありがとうございました。

おすすめ

転載: www.cnblogs.com/envythink/p/11871385.html