私はthisの答えを見ていました。なぜメソッドが多形であるのかフィールドではないのかという背後にある論理を理解できません。なぜJavaフィールドはポリモーフィックではありませんか?
デフォルトでは、すべてのメンバー関数はJavaで多態的です。つまり、 this.toString()を呼び出すと、Javaは動的バインディングを使用して 呼び出しを解決し、子バージョンを呼び出します。メンバーxにアクセスすると、 メンバーは現在のスコープ(父)のメンバーにアクセスします。メンバー はポリモフィックではないためです。
あなたは、スーパークラスとサブクラスの両方でいくつかのフィールドx
を持っている、とあなたは、基本クラスで次のように呼び出したとき、あなたのサブクラスでtoString
を上書き:
System.out.println(this); //calls the subclass's toString implementation
System.out.println(this.x) //prints the base class's x field
の回答で、このための正当化最初にリンクされた質問に列挙されている質問には、基本クラスが独自のスコープ内にあるときにそのサブクラスについて「認識」していないが、ポリモーフィズムでは同じことだ。スーパークラスはサブクラスが存在するサブクラスメソッドは依然として呼び出されます。だから、Javaが正確に何をしているのでしょうか?サブクラスで動的バインディングを使用する方法と、スーパークラスのスコープを維持する方法の2つの方法が異なります。
編集:明確にするために、this.xが多態性と同じことをする理由につきまして、参照型だけでなくオブジェクトの実際の型を見て、x
フィールドをサブクラスから印刷します。
"クラスメンバー"は "フィールド"を意味しますか?もしそうなら、そうすることは明らかです。メソッドは「メンバー」です。 –
@JonSkeet、ありがとうございます。直した。 – rb612
しかし、アクセサは多相であるため、ゲッターを使用すると、必要な動作を実現できます。 –