黑马程序员:面向对象三大特征之一:多态的介绍

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

多态:面向对象的第三个特征,前两个特征为封装、继承

可以理解为事物存在的多种体现形态
动物:猫 狗


猫 m = new 猫();
动物 m = new 猫();


1.多态的体现
父类的引用指向了自己的子类对象  Animal a = new Cat(); //类型提升,向上转型
2.多态的前提
必须是类与类之间有关系,要么继承(extends),要么实现(implements)
通常还有一个前提:存在重写
3.多态的好处与弊端
好处:多态的出现提高了程序的扩展性
弊端:虽然提高了扩展性,但是只能使用父类的引用访问父类中的成员
4.多态的应用




Animal a = new Cat(); //类型提升,向上转型
//如果想要调用猫的特有方法时,如何操作?
强制将父类的引用,转成子类类型:
Cat c = (Cat)a;  //向下转型 与基本数据的强制转化方式一样,千万别出现父类对象转成子类类型

c.catchMouse();

public static void function(Animal a)
{
	a.eat();
	if (a instanceof Cat)  //instanceof关键字 a引用的实例。 这整句话的意思:判断a引用的对象是否是Cat对象
	{
		Cat c = (Cat)a;
		c.catchMouse();
	}
	else if (a instanceof Dog)
	{
		Dog d = (Dog)a;
		d.kanJia();
	}
}

多态中成员函数(非静态)的特点  Fu f = new Zi();  f是引用型变量
在编译时期:参阅引用型变量所属的类中是否有调用的方法,如果有则编译通过,反之则编译失败
在运行时期:参阅对象所属的类中是否有调用的方法  new Zi()为堆内存中的对象
总结: 成员函数在多态调用时,编译看左边,运行看右边
注(面试中可能会遇到):
多态中成员变量的特点是无论编译和运行,都参考左边(引用型变量所属的类)

多态中静态成员函数的特点是无论编译和运行,都参考左边。静态绑定

静态绑定:
静态方法在哪个类就用哪个类中的该静态方法


示例:

class Fu
{
	int num = 5;
	void method1()
	{
		System.out.println("fu_method_1");
	}
	void method2()
	{
		System.out.println("fu_method_2");
	}
	static void methodStatic(){
		System.out.println("fu_method_static");	
	}
}
class Zi extends Fu
{
	int num = 3;
	void method1()
	{
		System.out.println("zi_method_1~~"+num);
	}
	void method3()
	{
		System.out.println("zi_method_3");
	}
	static void methodStatic(){
		System.out.println("zi_method_static");	
	}
}
class Demo
{
	public static void main(String[] args)
	{
		Fu f = new Zi();
		f.method1(); //输出zi_method_1~~3 重写了Fu类中的method1方法
		f.method2(); //输出fu_method_2
		//f.method3(); 这句语句要写上的话编译就会出错,因为引用型变量f所属的类为Fu,而Fu类中并没有method3方法
		f.methodStatic(); //fu_method_static
		System.out.println(f.num); //5
	}
}

静态绑定示例:
class Base {
	static int i;

	Base() {
		add(1);
		System.out.println(i+"Base()");
	}

	static void add(int v) {
		i += v;
		System.out.println(i+"Base().add");
	}

	void print() {
		System.out.println(i);
	}
}

class MyBase extends Base {
	MyBase() {
		//super(); 隐式语句
		add(2); //add方法被静态绑定,所以用MyBase中的add方法
	}

	static void add(int v) {
		i += v * 2;
		System.out.println(i);
	}
}

public class Demo {
	public static void main(String[] args) {
		go(new MyBase());
		// System.out.println();
	}

	static void go(Base b) {
		b.add(8);  //是引用b类型的add方法,即Base的add方法
		// b.print();}
	}
}
结果:
1Base().add
1Base()
5MyBase().add
13Base().add


多态的应用:主板

/*define board interface standard*/
interface PCI
{
	public abstract void open();
	public abstract void close();
}

/*create a MainBoard*/
class MainBoard
{
	void run()
	{
		System.out.println("mainboard run");
	}
	void usePCI(PCI p)  //PCI p = new NetCard(); 多态的应用
	{
		if (p!=null)
		{
			p.open();
			p.close();
		}
	}
}

/*create a net card implements pci*/
class NetCard implements PCI
{
	public void open()
	{
		System.out.println("网卡打开");
	}
	public void close()
	{
		System.out.println("网卡关闭");
	}
}

/*create a sound card implements pci*/
class SoundCard implements PCI
{
	public void open()
	{
		System.out.println("声卡打开");
	}
	public void close()
	{
		System.out.println("声卡关闭");
	}
}

class MainBoardDemo
{
	public static void main(String[] args)
	{
		MainBoard m = new MainBoard();
		m.run();
		m.usePCI(null);
		m.usePCI(new NetCard());
		m.usePCI(new SoundCard());
	}
}


---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------详细请查看: http://edu.csdn.net
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值