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,在这里就存在的一个向上转型。

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

对,如果是对于纯粹的privatec成员我们确实是不能转换,但是我们在使用private成员的时候不是常常通过方法访问他么?不然这个私有成员在这里面起什么作用呢?我们根本就没有任何借口去访问他,那么这个定义的这个私有成员就是没有意义的,所以我们根本就不需要考虑这个问题。

 

  向上转型说了,接下来说一下向下转型。由名字就可以知道,向下转型就是把基类对象转换成我的继承子对象,但是这其中又存在很多问题。

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

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

 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

 

转载于:https://www.cnblogs.com/xiaofanguoguo/p/3843351.html

你可能感兴趣的:(JAVA中的向上转型和向下转型)