まず、関数バインド
静的結合と動的バインドに分けバインドする機能。(バインディングは、呼び出しを指します)
コードが終了すると、てjavap -c Javaの.classファイルを使用することができ、私たちのために生成されたJavaバイトコードコンパイラを表示します。(分解工程)
行うには:エクスプローラでの1を、最初のプログラムの編集画面で、右クリックして、選択した番組生成されたコードファイルが配置されているだろう
カタログを提示します。
2、アドレスバーにプロジェクト名をクリックして、開いているファイルを見つけると、プロジェクト名を見つけます。
3、アドレスバーにアドレスを削除するクラスのバイトコードファイルを見つけ、タイプcmdが入力し、コマンド・エディタが存在します。
4.ファイル名の.classバイトコードファイルが表示されます入力し-cてjavapを入力します。
このバイトコード命令では6行目は、コンストラクタを呼び出すinvokespecia表し
静的メソッドにバインドされている10行目invokestatic命令、関数を呼び出します
動的メソッドにバインドされているライン14 INVOKEVIRTUAL命令、関数を呼び出します
♥静的メソッドは、静的バインドコール、インスタンスメソッドを動的にバインドされているコール
♥静的バインディング、バインディングコンパイル時に参照するには、コンパイラのステージは、このメソッドを呼び出すと良いを決定することであり、決して変更されません
動的バインディング、ここで呼び出すように機能し、コンパイル時、で、つまり、実行時バインディングを指し、不確実です。
1 クラスA { 2が 保護 をint 。 3 プライベート文字列str; 4つの プライベート整数データ。 5 6 公共 A(int型のval){ // 构造函数 7 のSystem.out.println( "A()" )。 8 本 .A = ヴァル。 9 } 10 11 公共 静的 ボイドショー(){ // 静态方法 12 のSystem.out.println( "静的A.show" )。 13 } 14 15 公共 ボイド FUNC(){ // 方法例 16 のSystem.out.println( "A.funcインスタンス" ); 17 } 18は、 // この方法は、上記オーバーロードする方法である 19。 公共 ボイド FUNC(INTデータ){ // 同じだけ異なるパラメータリストの同じメソッド名、戻り型ため 20である のSystem.out.println(「インスタンスA.funcデータ」); 21である } 22である } 23れる 24 クラス B ザが延びる{ 25 26である 公共の B(int型ヴァル)を{ 27 スーパー(ヴァル)。 28 } 29 30 公共 静的 ボイドショー(){ 31である ( "静的B.show"のSystem.out.println ); 32 } 33が 34である // 関係書き換え(上書き)を構成する 35 の公共 ボイド FUNC(){ // 戻り型、メソッド名、パラメータの同じリスト、唯一異なるスコープ 36 のSystem.out.println(「B.funcインスタンス」); 37 } 38れる } 39 40 41は、 42である パブリック クラス{バインド機能 43は パブリック 静的 ボイド(主文字列[]引数){ 44れます // B新しい新B = B(20); // invokespecialコンストラクタ 45 // B.show(); // invokestatic静的メソッド 46である // b.func(); // INVOKEVIRTUAL方法例 47 Aが= 新しい新しい Bを(20である); 48 A.show(); // A.show結合スタティック 49 a.funcを(); // a.func動的バインディングインスタンスB.func 50 }
結果:
コード分析:
新しい新しいオブジェクトは、JVMが自動的にオブジェクトのコンストラクタを呼び出しますので、最初の行があります。
起動するための良い方法を決定するために、コンパイル時に結合する第二のラインA.show()静的、ここで実行した後ので、直接(どのクラス静的メソッド呼び出しを示し、クラスメソッドを呼び出します)。
第三のラインa.funcは()を呼び出すためにどの方法を決定するために実行時に動的バインディングです。A =新しいB(20)は、文タイプを言うことで新たに定義された変数、タイプBの新しい新しいオブジェクト、
a.func()操作の後、マシン識別FUNC()メソッドは、動的方法であって、ここで、変数aにオブジェクト参照、及び、結合ダイナミック必要とし、その後でスタックB上のオブジェクトを探し
そしてその後、オブジェクトBアドレスタイプBメソッドテーブルの方法によるアドレステーブルの終わりを見つけ、クラスが変更されている()メソッドのクラスBのアドレスを継承funcを見出され、内側に見えます。そう
この時、FUNC()メソッドへのアクセスは、クラスBに書き換えることがあります だから、クラスBであるプリントアウト
注意:
1。
-------図I -------------------------------
-------図II -------------------------------
--------------------------------------
図1に示すベースクラス参照は、派生クラスのオブジェクトを参照することができます
図II説明:派生クラスは、ベースクラスのオブジェクト参照を参照することができません
(画像理解:人間の基本クラスと比較して、派生クラスは、教授、A =新しいB(20)と比較し、人が必要とする本明細書の説明は、それが完全に教授に送信することができます。
BのB =新しいA(20)と文のエラー、その人はただの学生かもしれ教授はここで必要とされ、あなたが人に与えるので、
そして、需要を満たすことはできません。)
2 。ベースと派生クラスの継承構造は、しばしば遺伝のトップダウン構造と呼ばれる、変換のみに下部から支持のタイプの継承階層、
トップダウンの変換はサポートされていません。(すなわち、[教授]は基底クラス[人]に変換することができる派生クラスが、ベースクラスは[人]は、派生クラス[教授]に変換することができません。)
拡張:
1、最終的なアプリケーションのシナリオが3以下のとおりです。
1.final intデータ= 10;定数を定義するために使用することができます
2.final密封されたクラスは、クラスが呼び出された修正することができる継承することができません
3.final可以修饰类的实例方法,称作密封方法,表示该方法不能再派生类中重写(覆盖)
2,继承结构中,基类和派生类的方法通常有两种关系:重载和重写
重载:在一个类作用域中,函数名相同,参数列表不同
重写:作用域不同,在基类和派生类中,返回值相同,函数名相同,参数列表也相同
( 重写指的是派生类方法表中,派生类提供的重写方法,把基类相应的方法的地址给重写了(覆盖了))
3,当父类中的成员变量的访问权限为private时,说明子类不能访问该变量,但此时该变量仍会被子类继承
下来,只是不能访问它。对于被继承下来的方法和变量,可直接用 对象 . 方法 或 对象 . 变量 来掉用。