向上转型,其实说简单点就是把继承的子类转换成基类的过程,举个例子以下(摘自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 }