Java 遗传和多态性-理解

Java 遗传和多态性-理解,java,inheritance,polymorphism,Java,Inheritance,Polymorphism,我有一个类a和类B,它们扩展了a,是一个子类。现在我有 A aObject = new A(); and A bObject = new B(); 现在我可以调用类B中的方法了吗?它不在不使用类型转换的using BobObject中 如果没有类型转换我们就无法做到这一点,那么多态性的优势是什么呢 谢谢。不,你不能。在两个对象aoobject和boobject上,您只能调用为A定义的方法,而无需使用强制转换 如果您将bObject定义为B类型,那么您可以,但是按照您的代码,您只能使用A的方法和

我有一个类a和类B,它们扩展了a,是一个子类。现在我有

A aObject = new A(); and
A bObject = new B();
现在我可以调用类B中的方法了吗?它不在不使用类型转换的using BobObject中

如果没有类型转换我们就无法做到这一点,那么多态性的优势是什么呢


谢谢。

不,你不能。在两个对象
aoobject
boobject
上,您只能调用为
A
定义的方法,而无需使用强制转换


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

否,aObject和bObject现在都是A型。

否,您肯定需要将bObject强制转换为B

这是因为,就编译器而言,bObject属于声明的类A。假设您没有使用构造函数,而是从返回类A的函数返回了bObject。。。。。编译器怎么可能知道它实际上是B类的呢


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

不,您不能。避免演员阵容的唯一方法是,如果你愿意:

B bObject = new B();

这是因为对象的声明类型(变量声明左侧的类型)决定了可以调用哪些方法,如果您编写的类型是
A
,则只能调用
A
中的方法。。。除非你做一个演员。

我将使用我以前学习的例子,以便你理解多态性:

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

class Animal{
 void move(){}
}
但是青蛙和哺乳动物移动它们的方式一样吗?不,他们没有。再说一次,你无法知道目前正在操纵哪种动物,因为被创造的动物类型是随机进行的(所以我想,为了游戏的利益)。那么你有一个关于动物的参考,你可以得到类型是的(反射),但是为什么这么匆忙呢? 因此,您可以为所有可能的动物类型划分animal类的子类,并覆盖它们的移动行为

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!

在什么情况下,您发现自己需要调用特定于B的方法,即使您通过a持有引用?你只是想学习,还是出于某种原因你真的需要这个功能?@Anthony Pegram,谢谢。在这种情况下,多态性的优势是什么?@ynwa,一条评论没有足够的空间来谈论多态性的优势。但一般来说,试着认为对于在超类(通过其API)上定义的任何功能,都可以在子类上进一步专门化或重写该行为。向API中添加内容远远不止这些。简单化的例子。动物发出噪音。然而,猫在喵喵叫。狗吠。如果在动物超类中定义了
void speak()
,则可以在子类中创建特定的正确行为。因此,根据我的理解,如果超类方法被子类重写,那么方法调用将基于对象中存在的实例?例如,如果A有speak()方法,而B重写speak()。A对象=新B();speak()将调用重写的方法,并且aObject=new A();aObject.speak()将调用A中的方法。我说得对吗?@ynwa,在您的示例中,您没有以多态方式使用类,但我认为您掌握了正确的想法。考虑<代码>动物A =新的猫();动物b=新狗();a、 说();b、 说()。这两个变量都是Animal类型,实际对象是子类。如果这些子类重写了
speak()
,您将获得它们更专门的行为。猫会喵喵叫,狗会吠叫。@Anthony Pengram谢谢。所以,如果我有像动物a=新狗()这样的东西;我只能调用Animal类中的方法和Dog类中被重写的方法。我说的对吗?即使在检查了
实例之后,如果你想找到
B
的一个成员,你也需要进行一次类型转换。所以类型转换是唯一的方法吗?这是一个好的编程实践吗?