0

私は 2 つのプログラムを読みましたが、どちらも多態的なオブジェクト参照をメソッドに渡しています。実行時のメソッドが参照型に依存するのか、実際のオブジェクトに依存するのか混乱しています。

プログラム 1:

class A
{
    public void display()
    {
        System.out.println("A's display method");     
    }
}
class B extends A
{
    public void display()
    {
        System.out.println("In B's display method");
    }
}
class Displayer
{
    public void foo(A ob)
    {
        ob.display();
    }
}
class Tester
{
    public static void main(String ar[])
    {
        B ob=new B();
        Displayer ob1=new Displayer();
        ob1.foo(ob);
    }
}

プログラム 2:

class GameShape
{
    public void displayShape()
    {
        System.out.println("displaying shape);
    }
}
class PlayerPiece extends GameShape
{
    public void movepiece()
    {
        System.out.println("moving game piece");
    }
}
class TilePiece extends GameShape
{
    public void getAdjacent()
    {
        System.out.println("getting adjacent tiles");
    }
}
class TestShapes
{
    public static void main(String ar[])
    {
        PlayerPiece player = new PlayerPiece()
        TilePiece tile = new TilePiece()
        doShapes(player);
        doShapes(tile);
    }
    public static void doShapes(GameShape shape)
    {
        shape.displayShape();
    }
}

プログラム 1 では、メソッドは実際のオブジェクトに基づいて実行されますが、プログラム 2 では、メソッドは参照型に基づいて実行されます。私はそれらの違いを理解できません。

詳細な説明をいただければ幸いです。

4

2 に答える 2

2

2 番目のプログラムでdisplaying shapeは、メソッドの基本実装がdisplayShape()オーバーライドされていないため、出力されます。メソッドはPlayerPieceクラスに実装されていません。したがって、親クラス、つまりGameShape.

2 番目のプログラムを次のように編集して、目的の結果を取得します。

class PlayerPiece extends GameShape
{
    public void movepiece()
    {
        System.out.println("moving game piece");
    }

    public void displayShape()
    {
        System.out.println("Displaying player piece");
    }
}

次に、プログラムは次のように出力します。Displaying player piece

この手法はメソッドのオーバーライドと呼ばれ、親クラスから継承したメソッドの機能を子クラスに実装します。

于 2013-05-23T11:42:23.393 に答える
1

これは、OOP ではメソッド オーバー ライディングと呼ばれます。

  • サブクラスとベースクラスの両方で定義されているメソッドを呼び出すと、渡すオブジェクトに基づいてメソッドが呼び出されます。

  • メソッドが基本クラスでのみ定義されている場合、渡すオブジェクトに関係なく、基本クラスのメソッドが呼び出されます。

与えられた例のprogram1では、displayメソッドは基本クラスとサブクラスの両方で定義されており、サブクラスオブジェクトでそれを呼び出そうとしています。したがって、サブクラスメソッドを呼び出します

この例の program2 では、displayShape メソッドは基本クラスでのみ定義されています。サブクラス オブジェクトで呼び出しても、基本クラスの実装のみが実行されます。

于 2013-05-24T06:38:05.293 に答える