一、类的向上转型和向下转型
首先要编写测试程序,按如下的目录结构,创建类。
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)的方法。