JAVA中的向上转型和向下转型

  向上转型,其实说简单点就是把继承的子类转换成基类的过程,举个例子以下(摘自JAVA编程思想第四版 T139):编程

class Instrument{ 
    public void play(){ System.out.println("I'm playing!~");}
    static void tune(Instrument i){ i.play();}
}

public class Wind extends Instrument{
    public static void main(String[] args){
        Wind wind = new Wind();
        Instrument.tune(wind);
    }
}

输出的是:I‘m playing!~,注意这里的形式参数是Instrument,而咱们实际传入的参数是Wind,在这里就存在的一个向上转型。ide

ok,某些人可能会有疑问了,若是我基类中有个人private成员怎么办,这样的话不就转换不了了么?spa

对,若是是对于纯粹的privatec成员咱们确实是不能转换,可是咱们在使用private成员的时候不是经常经过方法访问他么?否则这个私有成员在这里面起什么做用呢?咱们根本就没有任何借口去访问他,那么这个定义的这个私有成员就是没有意义的,因此咱们根本就不须要考虑这个问题。code

 

  向上转型说了,接下来讲一下向下转型。由名字就能够知道,向下转型就是把基类对象转换成个人继承子对象,可是这其中又存在不少问题。对象

  向上转型会丢失个人类型信息,而咱们能不能经过向下转型来得到个人类型信息呢?答案是不必定,这其中存在必定的限制条件,那就是你向下转型的对象必须是由继承对象赋值或初始化得来的,不然的话向下转型不成功,会抛出一个ClassCastException异常。  blog

  下面也给一个向下转型的例子,代码以下`继承

 1 class Useful{
 2     public void f(){}
 3     public void g(){}
 4 }
 5 
 6 class MoreUseful extends Useful{
 7     public void f(){}
 8     public void g(){}
 9     public void u(){}
10 }
11 
12 public Class RTTI{
13     public static void main(String[] args){
14         Useful [] x = { new Useful(),new MoreUseful()};
15         x[0].f();
16         x[1].g();
17         //Error:x[1].u();
18         ((MoreUseful)x[1]).u();   //向下转型成功
19         //((MoreUseful)x[0]).u();  抛出classCastException
20     }
21 }
View Code
相关文章
相关标签/搜索