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 }

浙公网安备 33010602011771号