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

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值