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)当子父类出现一模一样的静态函数时,多态调用,编译和运行都看引用变量所属类中的方法,真正调用静态方法不需要对象,直接通过类名调用
静态方法绑定到类上,成员方法动态绑定到当前对象上