Javaに関する知識の上書き、再ロード、非表示

3388 ワード

オーバーライド(Override)
子クラスと親クラスの間で発生します.子クラスで親クラスと同じメソッド名、パラメータリスト、戻り値、アクセス権などを宣言する方法、すなわち、子クラスでメソッド実装を再記述する機能です.オーバーライドを構成するには、次の条件を満たす必要があります.
  • 親クラスのstaticメソッドは上書きできません.
  • 親クラスのfinalメソッドは上書きできません.
  • メソッドの署名、パラメータの個数、およびパラメータのタイプは同じである.戻りタイプについて説明する2点:1.戻りタイプが参照タイプである場合、上書きメソッドの戻りタイプは、親メソッドが宣言した戻りタイプのサブタイプとして宣言できます.2.戻りタイプが基本タイプの場合、上書きメソッドの戻りタイプは親メソッドの戻りタイプと同じである必要があります.
  • サブクラスメソッドのアクセス権は、親と等しいアクセス権よりも大きい.
  • サブクラスメソッドは、synchronized、native、strictfpなどのいくつかのメソッド修飾子を変更することができる.
  • サブクラスメソッドのthrows句は、親メソッドとは異なり、リストされた各例外タイプは、親クラスの例外タイプと同じまたは親クラスの例外タイプのサブクラスであるべきである.

  • じゅうか
    非表示
    非表示現象は、子と親の間で発生します.非表示は、親のメンバー変数、静的メソッド、およびメンバーの内部クラスについて発生します.子クラスが親クラスのメンバー変数と同じ変数名を持つ変数を宣言すると、親クラスのメンバー変数の非表示が実現されます.子クラスが親クラスの静的メンバーメソッドと同じメソッド名、パラメータリスト、および同じ戻り値を持つことを宣言すると、親クラスの静的メソッドの非表示が実現されます.
    インスタンス変数の非表示
        public static class Parent{
            int i = 0;
        }
    
        public static class Child extends Parent{
            int i = 1;
        }
    
        Parent p = new Child();
        Log.e("Test","p.i = "+p.i);

    出力結果:p.i=0の上のコードでは、ParentとChildで変数iが定義されています.mainメソッドでは、ParentでChildオブジェクトを参照します.インスタンス変数がメソッドと同じで上書きが許可されている場合、印刷の結果は1になりますが、実際の結果は0です.しかし、Childのメソッドで直接iを使用すると、Childオブジェクトが定義したインスタンス変数iが使用されます.これが非表示です.ChildオブジェクトのiはParentオブジェクトのiを非表示にします.このルールは静的変数にも適用されます.
    静的メソッド非表示
        public static class Parent{
            public static void fun() {
                Log.e("Test","Parent.fun()");
            }
        }
    
        public static class Child extends Parent{
            public static void fun() {
                Log.e("Test","Child.fun()");
            }
        }
        Parent p = new Child();
        p.fun();

    出力結果:Parent.fun()という現象を隠蔽とも呼ぶ.親クラスの静的メソッドfun()は書き換えられません.staticメソッドでは、マルチステートのような動的割り当てメカニズムはまったく存在せず、JVMはオブジェクト参照の実際のタイプに応じて対応する書き換えメソッドを呼び出すことはありません.オブジェクト参照でstaticメソッドにアクセスすることは避けたほうがいいです.