3

ポリモヒズムの概念について混乱しています。誰でも私を助けてください。ここに簡単なコードがあります

class A {
    int i=2;
    void display() {
        System.out.println("display method of A");
    }
}

class B extends A {
    int i=1;
    void display() {
        System.out.println("display method of B");
    }
}

public class M {
    public static void main(String[] arg) {
        A a=new A();
        System.out.println(a.i);  
        a.display();

        a=new B();
        System.out.println(a.i);
        a.display();
    }
}
オープ: 2
     Aの表示方法
     2
     Bの表示方法

理解した部分: 'A' 型の参照変数 'a' が最初に宣言され、'A' のオブジェクトを参照します。プログラムが「ai」を出力すると、A の変数「i」が出力され、ディスプレイが a.display() として呼び出されると、クラス A のディスプレイが呼び出されます。ここまでは大丈夫

問題の部分: タイプ B の参照変数 'a' オブジェクトを割り当てて ai を出力すると、クラス A (つまり 2) の 'i' 値が出力されます。しかし、表示関数を a.display() として呼び出すと、メソッド 'B' の表示が呼び出されます

私の研究:参照変数を使用してメンバー変数にアクセスするたびに、参照変数のタイプがチェックされてアクセスされます。参照変数オブジェクト型を使用してメソッドを呼び出すと、実行時にオブジェクト型が評価され(これはポリモーフィズムと呼ばれると思います)、オブジェクト型に応じて特定のメソッドが呼び出されます

私は正しいですか、それとも他の概念が関係していますか? また、ポリモーフィズムとは何か、その応用についても詳しく知りたいです。また、OOP と Java の基本概念に関する本を何冊かお勧めいただければ幸いです。

4

2 に答える 2

2

これは、ポリモーフィズムがフィールドではなくインスタンス メソッドにのみ適用されるためです。したがって、a.i(where ais of type ) は、サブクラス オブジェクトを指しているかどうかに関係なく、A常に出力されます。2B

于 2013-07-06T15:28:27.483 に答える
0

継承で何をすべきかについて誤解があります。 extendsは賢明に選択された予約語です。A を拡張する B のポイントは、B が追加の属性を持つ A のサブセットであると言うことです。iB で再定義することは想定されていません。A を処理する必要がありますi。サブクラスで再定義iすることにより、スーパークラスのフィールドを非表示にします(これは、異なる変数タイプを参照するi場合でも当てはまります)。i

    A a=new A();
    a.display();
    System.out.println(a.i);  //2 , since the i field in A is initialized to 2

    a=new B();
    a.display();
    System.out.println(a.i); //2, since the i field in A is initialized to 2

代わりに で再定義display()するとA、次のBようになります。

  void display() 
  {
        System.out.println("Display method A/B: " + i);
  }

    A a=new A();
    a.display();  //Display method of A: 2 , since the i field in A is initialized to 2

    a=new B();
    a.display(); //Display method of B: 1, since the i field in B is initialized to 1

オラクルはポリモーフィズムに関するチュートリアルでかなり良い仕事をしていると思いますが、継承から始めるのが役立つかもしれません。

于 2013-07-06T15:34:02.280 に答える