日期:2014-05-20  浏览次数:20851 次

关于多态的向下转型
package DuotaiDemo;


class A{
public void fun1(){
System.out.println("A--->小三真好!!");
}
public void fun2(){
this.fun1();
}
public void fun8(){
System.out.println("B----->小三再见!!");
}
}
class B extends A{
public void fun5(){
System.out.println("B----->小三你好,小三再见!!");
}
public void fun3(){
System.out.println("B----->小三再见!!");
}
}
public class DuotaiDemo1 {
public static void main(String[] args) {
 A a=new B();
 B b1=(B)a;
 b1.fun1();
 b1.fun2();
 b1.fun3();
------解决方案--------------------
 就好比
List listData = new ArrayList();
ArrayList d = (ArrayList) listData;
转型。


------解决方案--------------------
B继承了A,但是B没有重写A的各个方法,你是想看b1对自身的引用,还是对父类的引用?
------解决方案--------------------
A a=new B();
 B b1=(B)a;
 b1.fun1();
 b1.fun2();
 b1.fun3();
比较好的写法是
A a=new B();
 B b1=(B)a;
 a.fun1();
 a.fun2();
 b1.fun3();
子类调用从父类继承的方法,利用多态可以直接调用。而fun3是子类自己的方法,使用父类定义的对象是没有办法调用的,所以必须 B b1=(B)a;转换定义类型来进行调用。
------解决方案--------------------
		A a = new B();	// 父类引用指向子类对象
B b1 = (B) a; // 强制类型转换

但是你这样写是危险的,因为如果a不是B类的对象而是A类的对象,那么你的程序就会出异常,因为a中压根就没有fun3,强制转换也无法给你的对象多加一个fun3方法,所以出现异常,异常代码如下:
package csdn;

class A {
public void fun1() {
System.out.println("A--->小三真好!!");
}

public void fun2() {
this.fun1();
}

public void fun8() {
System.out.println("B----->小三再见!!");
}
}

class B extends A {
public void fun5() {
System.out.println("B----->小三你好,小三再见!!");
}

public void fun3() {
System.out.println("B----->小三再见!!");
}
}

public class DuotaiDemo1 {
public static void main(String[] args) {
A a = new A(); // 父类引用指向子类对象
B b1 = (B) a; // 强制类型转换
b1.fun1();
b1.fun2();
b1.fun3();
}
}

------解决方案--------------------
你的实例是用A声明的,而B对A进行了扩展,实例化的是B对象。如果想要使用B的独有方法,必须强转成B
------解决方案--------------------
引用:
A a=new B();
 B b1=(B)a;

这个怎么理解啊
这是个比较典型的多态的例子,先说 A a=new B(); 这个的理解是,用A的属性和方法去调用B的同名属性和方法。这里你操作的A中的所有属性和方法,都会由B中同名的属性和方法去实现。正如上面的A中有fun1,fun2,fun8,B中有fun3,fun5。因为A中没有fun3,fun5。所以尽管你实例的是B,但是你却不能调用B中的fun3,fun5。B b1=(B)a; 这是强制类型转换,把A类型的a强转为B类型,强转后,就可以调用B中的fun3,fun5了,因为B是继续A的,当然也能调用A中的fun1,fun2,fun8.
------解决方案--------------------
A a=new B();
 B b1=(B)a;
这儿的问题。。改成
A a=new A();
 B b1=(B)a;
就可以了、。。。