类的多态可以从两方面体现:一是方法的重载,二是类的上下转型。
1)方法的重载
方法的重载就是在同一个类中允许同时存在多个同名方法,只要这些方法的参数个数或类型不同即可。
练习1:
使用方法的重载描述所有的超市都支持现金付款,但大型商超还支持刷卡付款。
public class OverLoadTest { public static String pay(String a){ return a; } public static String pay(String a,String b){ return (a+b); } public static void main(String[] args){ System.out.println("所有的超市都支持"+pay("现金支付")); System.out.println("大型商超支持"+pay("现金支付","刷卡支付")); } }
2)向上转型
把子类对象赋值给父类类型的对象,这种技术被称为"向上转型"。"向上转型"是一个从比较具体的类到较抽象类的转换,向上转型是安全的。在执行"向上转型"操作时,父类的对象无法调用子类独有的属性或者方法。
练习2:对于轿车而言,至少有油门踏板和刹车踏板。模拟自动挡车型的正确驾驶方式,运行结果如下:
class car{ public static void drive(car c){ System.out.println("右脚踩油门踏板!"); System.out.println("右脚踩刹车踏板!"); } } public class Autocar extends car{ int num=0; public static void main(String[] args){ Autocar a=new Autocar(); a.num=2; System.out.println("自动挡汽车有"+a.num +"块踏板。"); car b=new Autocar(); drive(b); } }
3)向下转型
向下转型是将抽象类转换为较具体的类。在做向下转型操作时,将特性范围小的对象转换为特性范围大的对象会出现问题,需要将父类对象强制转换为某个子类对象,这种方式被称为显示类型转换。当使用显式类型转换向下转型时,必须向编译器指明将父类对象转换为哪一种类型的子类对象。
练习3:创建一个旅游胜地类,将其强制转换为九寨沟类,并介绍九寨沟,运行效果如下:
class travel{ public static void introduce(String t){ System.out.println(t+"四季景色都十分迷人。"); System.out.println("春时嫩芽点绿,"+"瀑流轻快;"); System.out.println("夏来绿荫围湖,"+"莺飞燕舞;"); System.out.println("秋至红叶铺山,"+"彩琳满目;"); System.out.println("冬来雪裹山峦,"+"冰瀑如玉;"); System.out.println(t+"是世界闻名的旅游胜地之一。"); } } public class JiuZhaiGou extends travel{ public static void main(String args[]){ System.out.println("中国的旅游胜地有很多:"); travel t=new JiuZhaiGou(); // System.out.println(t); JiuZhaiGou j=(JiuZhaiGou) t; j.introduce("九寨沟"); } }
4)instanceof关键字
当在程序中执行向下转型操作时,如果父类对象不是子类的实例,就会发生ClassCastException异常,所以在执行向下转型之前需要使用instanceof关键字判断父类对象是否为子类的实例。instanceof关键字还可以判断某个类是否实现了某个接口。instanceof关键字的语法格式如下:
myobject instanceof ExampleClass
myobject:某类的对象引用;
ExampleClass:某个类
使用instanceof关键字的表达式返回值为布尔值。如果返回值为true,说明myobject对象为ExampleClass的实例;如果返回值为false,说明myobject对象不是ExampleClass的实例。
练习1:判断"鸡是不是鸟"并阐明依据(鸡是鸟的子类,所以鸡是鸟)。
class Bird{//创建鸟类 } public class Chicken extends Bird{//创建鸟的子类:鸡类 public static void main(String args[]){ //创建鸡类对象 Chicken c=new Chicken(); if(c instanceof Bird){//判断子类鸡类对象是否为鸟类的实例 Bird b=(Bird) c; } // System.out.println(c instanceof Bird); System.out.println("鸡是鸟的子类,所以鸡是鸟。"); } }