【发布时间】:2009-01-31 00:10:49
【问题描述】:
关于在 Java 中强制转换引用变量,我有一些不清楚的地方。
我有两个类 A 和 B。A 是 B 的超类。 如果我有这两个对象,然后打印语句:
A a = new A(); //superclass
B b = new B(); //subclass
System.out.println ((A)b);
那么执行 println 方法时究竟发生了什么?
我知道因为 B 是 A 的子类,所以我可以进行以下转换:
A a2 = (A)b;
我还知道,当 println 将引用变量作为参数时,会调用(隐式)创建对象参数的类的 toString() 方法。之所以如此,是因为 println() 方法正在寻找 String 类型的参数,而 toString() 方法将对象表示为字符串。即使我们不写 toString(),该方法也会被隐式调用。所以,下面两条语句是等价的:
System.out.println (b);
System.out.println (b.toString());
所以,我的问题是:当我们有
System.out.println ((A)b);
?
我假设引用变量 b 的类型会自动从 B 更改为 A。该变量应该仍然指向同一个对象 - 用
创建的对象B b = new B();
但现在只更改了 b 的类型。它是否正确? 另一个问题:即使我将 b 的类型更改为超类的类型,是否会调用子类中的覆盖方法,而不是超类的方法?
非常感谢。
问候
【问题讨论】: