假设Horse
类是Animal
类的一个子类。动物之间的区别a =新马()和马c =新马()
A和C都使用方法和实例变量在
Horse
类C可使用来自
Animal
类的方法了。 所以这两个参考变量之间有什么区别。
感谢您的任何答复
假设Horse
类是Animal
类的一个子类。动物之间的区别a =新马()和马c =新马()
A和C都使用方法和实例变量在Horse
类
C可使用来自Animal
类的方法了。 所以这两个参考变量之间有什么区别。
感谢您的任何答复
错误。
a
只能在Horse
类中使用方法,因为a
未声明为Horse
。
其中之一是程序到一个接口,另一个是编程到一个实例。
与第一个:
Animal a = new Horse();
你可以使用这个对象的任何地方需要的动物例如,可以是任何种类的动物。在这种情况下,如果您的Animal类是抽象类(如果方法是抽象的)或接口,则必须提示该方法。
而你对马类的方法,你只能如果您使用Horse h = new Horse();
编程,以最好的界面使用这些方法。
我要回答试图摆脱陈词滥调*动物使声音*的事情,但这个例子和解释是足够好..加1 – MilkyWayJoe
一般来说,你应该总是喜欢与它的用法兼容的最不具体的变量类型,只是为了使它更易于阅读。在实践中,如果您使用List
var而不是ArrayList
,则很明显,您不需要代码中特定于ArrayList
的任何内容。
对象a
不能引用Horse
中的方法/变量,除非它被模型化。
马是从动物遗传的?
如果多数民众赞成的情况下,你叫超。[从动物方法] 和马。
马可以访问所有动物的方法,因为它们是继承, 但动物[从马只有一个方法]不能从马上访问方法,因为它们仅限于马。
这里有两个重要的概念来看看这里:静态类型的一个参考;这是它被宣布的那个;和运行时间类型的一个引用;这是参考在运行时指向的真实类型。
在您的示例中,两个变量都有运行时类型Horse
,但a
的静态类型为Animal
。这会影响您在代码中处理这两个变量的方式,其编译器会强制执行其静态类型;不管它们的运行时类型如何
所以,尽管他们都参考Horse
情况下,只有通过c
可以调用Horse
特异性方法(而无需进行转换或使用a
反射)。
+1正确,除非将'a'强制转换为'Horse':'((Horse)a).methodFormHorseClass();'。 –
这不是'a'了。 – SLaks
iff扩展类不重写抽象方法。如果存在抽象方法或接口,则可以在马类中调用该方法。在这种情况下,Animal也是一个类,但它也可以是一个抽象类。 – DarthVader