相信许多学习java的朋友一定会遇到这样的情况,一个被new出来的类对象,赋值给了自己的父类对象,这个是什么情况哪?该如何理解。在java里这个叫向上转型。还有一种情况的向上转型,new出来一个类的对象赋值给了此类实现的一个接口,我称之为瘦身,只不过,接口的向上转型和类的向上转型是有区别的。 在这里,我们只讨论类和接口的转型。同样向下转型也有两种,一种是new出来的类对象赋值给自己的子类对象,另一种情况是接口变量赋值给实现此接口的类对象,我称之为增肥。下面就来通过程序看看这四种转型是怎样操作的以及转型后访问数据的情况。
首先要编写测试程序,按如下的目录结构,创建类。
Animal.java。此类是基类,Cat类继承此类。此类有一个成员变量head和一个成员方法getHead()。方法返回head的值。
Cat.java。此类是Animal的子类,Cat类重新添加了一个成员变量eyes和一个成员方法getEyes()。方法返回eyes的值。
testClass.java。这个是我们的测试类。此时我们就来分析一下类的向上转型和向下转型。向上转型:可以看出把Cat()的对象赋值给naimal时,不再有用getEyes()方法,此方法是Cat中的方法,而Animal类中无此方法。这说明animl对象发生了“瘦身”。向下转型:这里要注意一点,向下转型是你向上转型后才能执行的操作。所以把转型后的animal赋值给cat_s,此时却发现cat_s对象“增肥”了,不仅能访问Animal类成员,还能访问Cat中新增的成员。
编写测试程序IAnimal.java接口。此接口有一个未实现的方法sing();
编写Tiger.java类,实现IAnimal类,并新增成员变量head和成员方法getHead(),方法打印head的值。
编写测试程序testInterface.java。此时我们来分析一下接口的向上转型和向下转型。向上转型:可以看到new出来的Tiger对象赋值给了IAnimal接口变量,此时animal只能访问接口的方法sing(),而不能访问Tiger类中新增的成员方法。向下转型:把animal赋值给了Tiger类对象后,发现tiger既可以访问接口方法,也可以访问Tiger类中新增的方法。
接下来我们来看一下,在接口转型后animal.sing()的输出结果,“老虎在吼叫”,说明,虽然"瘦身"了,但是接口变量animal调用的还是实现了此接口的类(Tiger)的方法。