java个人学习笔记12(多态)

来源:互联网 发布:网络问政是什么 编辑:程序博客网 时间:2024/04/19 07:54

1.多态

对象多态性在程序中的体现:父类的引用或者接口的引用指向了子类的对象。

多态的好处:提高了代码的扩展性

多态的弊端:不能使用子类的特有方法

多态的前提:必须有继承或实现的关系,通常有覆盖

instanceof:对象类型判断,格式:对象 instanceof 类型,返回true或false

abstract class Appliance{abstract void up();}class Air_condition extends Appliance{public void up(){System.out.println("up air condition");}public void cold(){System.out.println("coiding...");}}class Bulb extends Appliance{public void up(){System.out.println("up bulb");}public void light(){System.out.println("lighting...");}}class DuotaiDemo{public static void main(String[] args) {Appliance a = new Air_condition();//对象的多态性,a既是Air_condition类型,也是Appliance类型Appliance b = new Bulb();//对象的多态性,b既是Bulb类型,也是Appliance类型//向上转型,隐藏了子类型,限定了子类型的特有功能,提高了扩展性up_appliance(a);up_appliance(b);//a.cold();不行,不能使用子类特有的方法if(!(a instanceof Air_condition)){System.out.println("抛异常:类型不匹配");return ;}//判断,防止类型转换出错Air_condition a1 = (Air_condition) a;//向下转型a1.cold();}private static void up_appliance(Appliance a){//利用对象的多态性,使面对Appliance类,方便扩展其他子类a.up();//a.cold();不行,不能使用子类特有的方法}}

2.练习

/**笔记本扩展USB接口功能*/abstract interface USB{ public abstract void open(); public abstract void close();}//定义一个USB接口功能class Notebook{public void run(){System.out.println("notebook run");}public void useUSB(USB usb){if(usb!=null){usb.open();usb.close();}}//定义一个使用USB设备的方法}//定义一个笔记本类class Mouse{private String color = "black";public String getColor(){return color;}public void setColor(String color){this.color = color;}}//定义了一个鼠标类class MouseByUSB extends Mouse implements USB{public void open(){System.out.println("mouse run");}public void close(){System.out.println("mouse close");}}//定义了一个实现USB接口的鼠标类class Keyboard{private String color = "red";public String getColor(){return color;}public void setColor(String color){this.color = color;}}//定义了一个键盘类class KeyboardByUSB extends Keyboard implements USB{public void open(){System.out.println("keyboard run");}public void close(){System.out.println("keyboard close");}}//定义了一个实现USB接口的键盘类class NotebookDemo{public static void main(String[] args) {Notebook b = new Notebook();b.run();USB m = new MouseByUSB();//多态,向上转型b.useUSB(m);USB k = new KeyboardByUSB();//多态,向上转型b.useUSB(k);MouseByUSB m1 = (MouseByUSB) m;//向下转型System.out.println(m1.getColor());KeyboardByUSB k1 = (KeyboardByUSB) k;System.out.println(k1.getColor());}}


3.多态中成员变量和成员函数的调用

1)当子父类出现同名的成员变量时,多态调用只看该成员变量的引用所属的类中的成员变量

即:Father a = new Son();a.num是指父类中的成员变量num

2)当子父类出现一模一样的成员函数时,多态调用,编译时看引用变量所属的类中的方法(与上同);运行时看对象所属的类中的方法

即:Father a = new Son();a.show()编译时看父类中的show(),运行时看子类对象的show()

3)当子父类出现一模一样的静态函数时,多态调用,编译和运行都看引用变量所属类中的方法,真正调用静态方法不需要对象,直接通过类名调用

静态方法绑定到类上,成员方法动态绑定到当前对象上

0 0
原创粉丝点击