この記事では、Javaオブジェクト指向の概念フィールドの隠れ(非表示のメンバー変数)の基本概念について説明します
この問題を議論する前に、非常に簡単なコードを見てみましょう。メソッドのデータ結果は何ですか?
/*** @Author Hollis 17/9/27。 */ public class fieldoverriding {public static void main(string [] args){sub c1 = new sub(); System.out.println( "c1.s:" + c1.s); System.out.println( "c1.s:" + c1.s); System.out.println( "c1.say:" + c1.say()); Super C2 = new Sub(); System.out.println( "c2.s:" + c2.s); System.out.println( "c2.s:" + c2.s); }} class super {string s = "super"; string sais(){"hello super"; }} class sub extends super {string s = "sub"; string sais(){return "hello sub"; }}出力結果:
c1.s:sub c1.say:hello sub c2.s:super c2.say:hello sub
それはあなたが思うと同じですか?同じ場合は、読み続ける必要はありません。これは難しくないので、それを知っているだけです。
Javaで書き直します
Javaでの書き換えと過負荷に関する深い理解の中で、紹介しました。
Javaと親クラスのサブクラスに同じ名前とパラメーターリストの2つのメソッドがある場合。それらは同じメソッド署名を持っているため、サブクラスの新しい方法は、親クラスの元のメソッドをオーバーライドします。
以前は、Javaが継承の方法を書き直したため、これはJavaの動的な多型も反映しています。
メンバー変数はJavaで書き直すことができますか?
上記のJava書き換えの紹介では、書き換えがこの方法を指すことを明確に述べています。メンバー変数は言及されていません。上記の例を介して、実際にメンバー変数が書き換えられていないことがわかります。
したがって、Javaでは、メンバー変数は書き直されません。これが別の言葉です:非表示。
Javaのメンバー変数の非表示
Javaドキュメントの非表示ドメインの定義:
クラス内では、スーパークラスのフィールドと同じ名前を持つフィールドは、たとえタイプが異なっていても、スーパークラスのフィールドを隠します。サブクラス内では、スーパークラスのフィールドをその単純な名前で参照することはできません。代わりに、フィールドにスーパーからアクセスする必要があります。一般的に言えば、コードの読み取りが難しくなるため、フィールドを隠すことはお勧めしません。
中国語に翻訳:
クラスでは、サブクラスのメンバー変数が親クラスのメンバー変数と同じ名前を持っている場合、たとえ異なるタイプを持っていても、同じ名前しか持っていません。親クラスのメンバー変数が隠されています。サブクラスでは、親クラスのメンバー変数に単純に参照してアクセスすることはできません。代わりに、親クラスによって隠されたメンバー変数は、親クラスへの参照から取得する必要があります。一般的に言えば、これによりコードの読み取りが難しくなるため、メンバー変数を隠すことはお勧めしません。
実際、簡単に言えば、サブクラスは親クラスを上書きするメンバー変数を上書きしないため、メソッドのような多型を使用してメンバー変数へのアクセスにアクセスできません。
非表示のメンバー変数にアクセスする方法
実際、以前の例とメンバー変数の紹介を今すぐに、隠されたメンバー変数にアクセスする方法を既に知っています。親クラスの参照を使用してSuper c2 = new Sub(); System.out.println(" c2.s : " + c2.s);。またはSystem.out.println(((Super)c1).s); 。
要約します
上記は、Javaの方法の書き換えと、編集者が紹介したメンバー変数の隠蔽です。それがあなたに役立つことを願っています。ご質問がある場合は、メッセージを残してください。編集者は時間内に返信します。 wulin.comのウェブサイトへのご支援ありがとうございます!