Myjava.java
class A
{
public void func1()
{
System.out.println("A.func1");
}
}
class B extends A
{
public void func1()
{
System.out.println("B.func1");
}
}
class C
{
public static void main(String[] args)
{
System.out.println("强制类型转换A->B后的调用效果:");
A a = new A();
B b = (B)a;
b.func1();
}
}
调试的时候 会报一个异常,无法转换。我在网上查阅了很多资料,都说父类无法强制转换为子类。但是在Structs里面ActionFrom为什么可以转换为子类,它是如何做到的呢,恳请高手解惑,谢谢啦。
class A
{
public void func1()
{
System.out.println("A.func1");
}
}
class B extends A
{
public void func1()
{
System.out.println("B.func1");
}
}
class C
{
public static void main(String[] args)
{
System.out.println("强制类型转换A->B后的调用效果:");
A a = new A();
B b = (B)a;
b.func1();
}
}
调试的时候 会报一个异常,无法转换。我在网上查阅了很多资料,都说父类无法强制转换为子类。但是在Structs里面ActionFrom为什么可以转换为子类,它是如何做到的呢,恳请高手解惑,谢谢啦。
B b = (B)a;
这样就可以。
Structs里面的ActionFrom是用配置文件和对应的后台类转换的。
在Struts-config.xml文件中指定的都是具体的ActionFrom的子类.
STRUTS在生成对象的时候,是生成对应ActionFrom子类的实例的.
传递给ACTION的时候,用的是ActionFrom这个类.这就是面向对象开发方法中的多态的用法.
但是B b = (B)a 我只有在Struts框架中看到 对它为什么这样做很迷惑,还请大虾们多多指教!
报异常是因为b.func1();不知道你要调哪个func1
因为B类里面有一个,A类里面也有一个而B继承了A所以b.func1();会找到两个func1();以至于JVM不知道调哪个而报错
A时父类
B继承A是子类
你把A的对象a转换成B类肯定转不了啦 。。
举个例子
A为水果类。
B为苹果类
你可以把苹果称作水果
但是你可以把水果称作苹果吗??
那是不能的。
你说的Structs中的转化问题:那是父类的应用指向子类的实例。然后再转成子类的引用。
就相当于我们想把水果的引用指向一个苹果。
然后再把水果转换成苹果。这样是没问题的。因为水果指向的本来就是苹果
这样说不知道是否明白
现在你想将父类的对象转换成子类的对象,这是不可能的,在每个类中都有一个Class类,来存放每个类的具体信息,这样保证类在上传和下传时都能找到最原始的类。
Structs里面ActionFrom中真正传入的是子类的对象,只是把它上传给了一个父类的引用,所以这个对象的Class类存放的是子类的信息,强制转换成子类,当然是可以的。就像是:Father a = new Son();Son b = (Son)a;
而lz你现在是想把Father a = new Father();Son b = (Son)a;这是完全不同的,前者Class中存放的是子类的信息(包括一些方法、变量和块),后者存放的是父类的信息。
不知道这样说lz明白吗?
Struts中的ActionForm也是这样做的ActionForm form = new 你自己定义的实现类
这样你就可以向下转换了。
B b = (B)a;
A a = new B();
B b = (B)a;这里的new B()本身就是子类的对象,只是使用了父类的引用a指向它!
子类可以以父类的身份出现( A a=new B();)但做事情时还是按自己的方法做:a.func1()输出的结果是"B.func1"
父类不可以以子类身份出现(B b=new A();),因为会报向下转型异常