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

java中为什么要用向下转型?
java中的向上转型可以理解,但是为什么要用向下转型,以及什么时候用向下转型呢?最好能给了例子说明!

------解决方案--------------------
向下转型一般在泛型中使用比较多。
------解决方案--------------------
向下转型是危险的只有当我们确定不会出现类型转换不会出现异常时才进行向下转型
------解决方案--------------------
最大的用处是java的泛型编程,用处很大,java的集合类都是这样的,不过由于是向下转型,所以不是安全的。 下面是向下转型的例子:
子类转型成父类是向上转型,反过来说,父类转型成子类就是向下转型。但是,向下转型可能会带来一些问题:我们可以说麻雀是鸟,但不能说鸟就是麻雀。来看下面的例子: 

A类: 

package a.b; 

public class A { 

void aMthod() { 

System.out.println("A method"); 





A的子类B: 

package a.b; 

public class B extends A { 

void bMethod1() { 

System.out.println("B method 1"); 



void bMethod2() { 

System.out.println("B method 2"); 





C类: 

package a.b; 

public class C { 

public static void main(String[] args) { 

A a1 = new B(); // 向上转型 

a1.aMthod(); // 调用父类aMthod(),a1遗失B类方法bMethod1()、bMethod2() 

B b1 = (B) a1; // 向下转型,编译无错误,运行时无错误 

b1.aMthod(); // 调用父类A方法 

b1.bMethod1(); // 调用B类方法 

b1.bMethod2(); // 调用B类方法 

A a2 = new A(); 

B b2 = (B) a2; // 向下转型,编译无错误,运行时将出错 

b2.aMthod(); 

b2.bMethod1(); 

b2.bMethod2(); 





从上面的代码我们可以得出这样一个结论:向下转型需要使用强制转换。运行C程序,控制台将输出: 

Exception in thread "main" java.lang.ClassCastException: a.b.A cannot be cast to a.b.B at 
a.b.C.main(C.java:14) 

A method 

A method 

B method 1 

B method 2 

其实黑体部分的向下转型代码后的注释已经提示你将发生运行时错误。为什么前一句向下转型代码可以,而后一句代码却出错?这是因为a1指向一个子类B的对象,所以子类B的实例对象b1当然也可以指向a1。而a2是一个父类对象,子类对象b2不能指向父类对象a2。那么如何避免在执行向下转型时发生运行时ClassCastException异常?使用学过的instanceof就可以了。我们修改一下C类的代码: 

A a2 = new A(); 

if (a2 instanceof B) { 

B b2 = (B) a2; 

b2.aMthod(); 

b2.bMethod1(); 

b2.bMethod2(); 



这样处理后,就不用担心类型转换时发生ClassCastException异常了。
------解决方案--------------------
一个人有他爸爸方法,也有他自己的方法,就看你想让他当爸爸还是儿子
------解决方案--------------------
class A{
public void m(){};


class B extends a{
public void m1(){};
}

main...{
A a=new B();
//a.m1(); 这里编译出错
((B)a).m1(); //向下转型才不会错
}