对象和引用类型之间真的很困惑

时间:2013-05-23 11:10:13

标签: java object types reference

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

计划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中,该方法基于引用类型运行。我无法理解它们之间的区别。

详细解释将不胜感激。

2 个答案:

答案 0 :(得分: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

此技术称为方法覆盖,您可以在其中实现从子类中的父类继承的方法的功能。

答案 1 :(得分:1)

这被称为在OOP中骑行的方法。

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

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

在给定的示例program1中,display方法在基类和子类中定义,并且您尝试使用子类对象调用它。所以它将调用子类方法

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