2012-05-07 40 views

回答

10

错误。
a只能在Horse类中使用方法,因为a未声明为Horse

+0

+1正确,除非将'a'强制转换为'Horse':'((Horse)a).methodFormHorseClass();'。 –

+1

这不是'a'了。 – SLaks

+0

iff扩展类不重写抽象方法。如果存在抽象方法或接口,则可以在马类中调用该方法。在这种情况下,Animal也是一个类,但它也可以是一个抽象类。 – DarthVader

2

其中之一是程序到一个接口,另一个是编程到一个实例。

与第一个:

Animal a = new Horse(); 

你可以使用这个对象的任何地方需要的动物例如,可以是任何种类的动物。在这种情况下,如果您的Animal类是抽象类(如果方法是抽象的)或接口,则必须提示该方法。

而你对马类的方法,你只能如果您使用Horse h = new Horse();

编程,以最好的界面使用这些方法。

+1

我要回答试图摆脱陈词滥调*动物使声音*的事情,但这个例子和解释是足够好..加1 – MilkyWayJoe

1

一般来说,你应该总是喜欢与它的用法兼容的最不具体的变量类型,只是为了使它更易于阅读。在实践中,如果您使用List var而不是ArrayList,则很明显,您不需要代码中特定于ArrayList的任何内容。

0

对象a不能引用Horse中的方法/变量,除非它被模型化。

0

马是从动物遗传的?

如果多数民众赞成的情况下,你叫超。[从动物方法] 和马。

马可以访问所有动物的方法,因为它们是继承, 但动物[从马只有一个方法]不能从马上访问方法,因为它们仅限于马。

0

这里有两个重要的概念来看看这里:静态类型的一个参考;这是它被宣布的那个;和运行时间类型的一个引用;这是参考在运行时指向的真实类型。

在您的示例中,两个变量都有运行时类型Horse,但a的静态类型为Animal。这会影响您在代码中处理这两个变量的方式,其编译器会强制执行其静态类型;不管它们的运行时类型如何

所以,尽管他们都参考Horse情况下,只有通过c可以调用Horse特异性方法(而无需进行转换或使用a反射)。