展开全部
首先还是给出解决办e5a48de588b662616964757a686964616f31333433643038法吧:
package d;
import c.F;
public class A extends F
{
public static void main(String[] args)
{
A temp = new A();
F f = (F) temp;
if (f instanceof A)
{
A a = (A) f;
System.out.println(a.a());
}
}
输出结果:
你的要求无法实现。因为在你的例子中,f本身并不是由A类型向上转型为F得来的,所以本身是不会带有A的特性的,强制转换为A会失败,因为f在堆中的内容并未包括A类型的特性。即使你强制转换为A,A的新构造函数并不会调用,所有A额外的特性不会在堆中声明,所以会报错。Java中的向下转型是有条件的,你向下转型的对象必须原本在堆中包含了目的类型的内容,也就是说这个对象必须原本就是目的类型或其子类,只不过是通过向上转型现在不是目的类型或其子类罢了(但是堆中还是由该目的类型的特性存在,理解这一点很重要!)
有一个简单的办法验证这一点,就是你向下转型的时候,目的类型的构造函数并不会再一次调用,这样一来也就不会有目的类型的特性了,调用目的类型的特性自然而然就会失败了:
class Parent
{
public Parent()
{
System.out.println("This is Parent");
}
}
public class Child extends Parent
{
public Child()
{
System.out.println("This is Child");
}
public static void print()
{
System.out.println("print()");
}
public static void main(String[] args)
{
Child test1 = new Child();
Parent temp1 = (Parent) test1;
Child target1 = (Child) temp1;
target1.print();
Parent test2 = new Parent();
Child target2 = (Child) test2;
target2.print(); // 报错
}
}
输出结果:
还有不理解可以追问。