继承和多态 - 理解

时间:2012-01-17 03:03:30

标签: java inheritance polymorphism

我有一个A类和B类,它扩展了A并且是一个子类。现在我有了

A aObject = new A(); and
A bObject = new B();

现在可以在没有类型转换的情况下使用bObject调用B类中不在A中的方法吗?

如果我们不能在没有类型转换的情况下这样做,那么多态的优势是什么?

感谢。

5 个答案:

答案 0 :(得分:3)

不,你肯定需要将bObject强制转换为B。

这是因为,就编译器而言,bObject属于声明的类A.想象一下,不是使用构造函数,而是从返回类A的函数返回bObject .....怎么可能编译器可能知道它实际上是B类?

因此,在编译器允许您将其用作B类之前,需要执行运行时强制转换或instanceof检查。

答案 1 :(得分:2)

不,你不能。在aObjectbObject对象上,您只能调用为A定义的方法而不使用强制转换。

如果您将bObject定义为B类型,那么您可以,但正如您的代码所示,您只能使用A的方法和成员。

答案 2 :(得分:2)

不,aObject和bObject现在都是A类型。

答案 3 :(得分:2)

不,你不能。避免演员表的唯一方法是你愿意这样做:

B bObject = new B();

那是因为对象的声明类型(变量声明左边的类型)决定了可以调用哪些方法,如果你写的那个类型是A,然后只能调用A中的方法......除非你进行演员表。

答案 4 :(得分:1)

我将使用我以前学习的示例,以便您了解多态性:

你正在创造一个由几种动物组成的游戏。这种动物的一个重要方面是它们如何移动。 然后你定义一个类:

class Animal{
 void move(){}
}

但是青蛙和哺乳动物会以同样的方式移动它们吗?不,他们没有。同样,您无法知道当前正在操纵哪种动物,因为正在创建的动物类型是随机完成的(所以我想,为了游戏的利益)。那么你所拥有的是对动物的参考,你可以得到类型是(反射),但为什么喧嚣? 因此,您为所有可能的动物类型创建动物类的子类,并覆盖它们的移动行为。

class Frog extends Animal{
 void move(){ hop();}
}

class Snake extends Animal{
 void move(){crawl();}
}

现在你的动物管理员会随机生成各种动物:

static Animal createAnimal(){
Animal a = null;
//generate a randomly
return a;
}

现在你可以说

Animal a = AnimalManager.createAnimal();
a.move(); //it may hop or crawl. it just does not matter how it does it. you dont care whether it is a Frog, a Snake, a Man. but it will move. now thats polymorphism!