我读了两个程序,都将多态对象引用传递给方法。我很困惑运行时的方法是否依赖于引用类型或实际对象。
计划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中,该方法基于引用类型运行。我无法理解它们之间的区别。
详细解释将不胜感激。
答案 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方法仅在基类中定义。虽然用子类对象调用它,但它只运行基类实现。