【发布时间】:2014-07-07 15:46:08
【问题描述】:
我一直在尝试了解 Java 中的强制转换以及它如何影响引用。我想出了这个特殊的例子:
public interface A1{
public void foo();
};
public class A2{
public void bar();
public static void main( String[] args )
{
A2 a = new B();
A1 c = (A1)a;
c.foo();
}
};
public class B extends A2 implements A1{
public void foo(){ System.out.println("This is B"); }
}
它打印“This is B”,但我不知道为什么。这就是我目前的理解:a 是对 A2 类型对象的引用,但在运行时,它指向具有 B 属性的堆对象,但 a 仅“看到”A2 的属性.但是类型已经在编译期间确定了,所以转换尝试将 A2 转换为 A1,但它不能这样做。显然我错了,但我不知道为什么。任何帮助将不胜感激。
【问题讨论】:
-
动态类型与静态类型 - 肯定出现过几次。
-
类型确实是
A1,但是当foo()被调用时,调用对象的foo()是B中的实现 -
方法调用总是使用创建对象的实际类型(“运行时类型”)。您无法更改使用强制转换调用的方法。 但是,数据成员遵循不同的规则。 如果您有一个定义成员字段
m的类A,以及定义其自己的单独成员字段m的子类B( 非常不好的做法),如果您有一个运行时类型为B的对象,您可以通过将对象转换为(A)来访问A中定义的m。跨度>
标签: java inheritance polymorphism