0

我读了两个程序,都将多态对象引用传递给方法。我很困惑运行时的方法是否取决于引用类型或实际对象。

方案一:

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);
    }
}

方案二:

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

在第二个程序中它会打印出来displaying shape,因为该方法的基本实现displayShape()没有被覆盖。该方法未在PlayerPiece类中实现。因此,它继承了其父类的行为,即GameShape.

如下编辑您的第二个程序以获得所需的结果:

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 中称为方法覆盖。

  • 当您调用在子类和基类中定义的方法时,它将根据您传递的对象调用方法。

  • 如果该方法仅在基类中定义,那么无论您传递的对象如何,它都会调用基类方法。

在您给定的示例程序 1 中,显示方法在基类和子类中都定义了,并且您尝试使用子类对象调用它。所以它会调用子类方法

在给定的示例程序 2 中,displayShape 方法仅在基类中定义。尽管您使用子类对象调用它,但它只会运行基类实现。

于 2013-05-24T06:38:05.293 回答