【发布时间】:2013-02-17 04:12:54
【问题描述】:
假设我们有 A 类作为父类,C 类扩展它。
class A
{
void m()
{
System.out.println("A.m");
}
}
class C extends A
{
@Override
void m()
{
System.out.println("C.m");
}
}
当我们使用引用A a和C c来指向同一个对象类型时,例如A a = new C();和C c = new C();有什么区别?
从这个问题:Java inheritance vs. C# inheritance,看起来a和c指向C的对象类型,使用它们似乎没有区别。
我测试了这段代码,它们都打印出C.m。
class inherit {
void x(A a)
{
a.m();
}
public static void main(String[] args) {
System.out.println("hello");
A a = new C();
C c = new C();
a.m();
c.m();
new inherit().x(a);
new inherit().x(c);
}
}
【问题讨论】:
-
如果
C定义了A中未定义的方法,您将无法通过A引用调用它们。此外,如果方法需要C参数,则不能将A传递给它。在这两种情况下,您都必须将A转换为C。 -
不同之处在于,如果 C 有一个 A 没有的方法,它就不能通过 A a 访问。另一方面,如果您有多个 A 的子类型,并且希望在某个集合中对它们都一视同仁,那么将它们转换为 A 更有意义。
标签: java inheritance