黑马程序员 08 Java基础教学 - 08 - 面向对象(4) 之 多态

               -------android培训java培训、期待与您交流! ----------









一、多态

1、多态的体现

父类的引用指向了自己的子类对象

2、多态的前提

必须是类与类之间的关系。要么继承,要么实现

通常还有一个前提就是:覆盖

3、多态的好处

多态的出现大大的提高了程序的扩展性

4、多态的弊端

提高了扩展性的同时,只能使用父类的引用访问父类中的成员。

5、多态的应用

多态示例一:


abstract class Animal {
	abstract void eat();
}

class Activities {
	void doActivity(Animal a) {
		if (a != null) {
			a.eat();
		}
		if (a instanceof Cat) {
			((Cat) a).catchMouse();
		} else if (a instanceof Dog) {
			((Dog) a).kanJia();
		} else if (a instanceof Pig) {
			((Pig) a).sleep();
		}
	}
}

class Cat extends Animal {
	@Override
	void eat() {
		System.out.println("吃鱼");
	}

	void catchMouse() {
		System.out.println("抓老鼠");
	}
}

class Dog extends Animal {
	@Override
	void eat() {
		System.out.println("吃骨头");
	}

	void kanJia() {
		System.out.println("看家");
	}
}

class Pig extends Animal {
	@Override
	void eat() {
		System.out.println("吃饲料");
	}

	void sleep() {
		System.out.println("老是睡觉");
	}
}

public class DuoTaiDemo1 {
	public static void main(String[] args) {
		
		// new Activities().doActivity(null);
		
		Animal a = new Cat();//类型提升,向上转型
		a.eat();
		//如果想要调用猫的特有方法,如何操作??
		//强制将父类的应用转成子类类型,向下转型
		Cat c = (Cat)a;
		c.catchMouse();
		
		/**
		 * 注意:前往不能将父类对象转成子类类型
		 * Animal a = new Animal();
		 * Cat c = (Cat)a;
		 * 我们能转换的是父类引用执行了自己子类对象是,该应用可以被提升
		 * 多态自始至终都是子类对象在做着变化
		 */
		
		//下面代码是利用Activities类创建对象完成对Cat,Dog,Pig进行的活动
		new Activities().doActivity(new Cat());
		new Activities().doActivity(new Dog());
		new Activities().doActivity(new Pig());
	}
}

多态示例二

/**
 * 需求:电脑运行实例,电脑运行基于主板,提供扩展功能
 * 
 * @author LeeYou
 * 
 */

interface PCI {
	public void open();

	public void close();
}

/**
 * 主板,使用PCI接口
 * 
 */
class MainBoard {
	public void run() {
		System.out.println("mainBoard run...");
	}

	public void userPCI(PCI p) {
		if (p != null) {
			p.open();
			p.close();
		}
	}
}

/**
 * 网卡扩展类,实现PCI接口
 * 
 */
class NetCard implements PCI {

	@Override
	public void open() {
		System.out.println("netcard open...");
	}

	@Override
	public void close() {
		System.out.println("netcard close...");
	}

}

/**
 * 声卡扩展类,实现PCI接口
 * 
 */
class SoundCard implements PCI {

	@Override
	public void open() {
		System.out.println("soundcard open...");
	}

	@Override
	public void close() {
		System.out.println("soundcard close...");
	}

}

class DuoTaiDemo3 {
	public static void main(String[] args) {
		MainBoard mb = new MainBoard();
		mb.run();
		mb.userPCI(new SoundCard());
		mb.userPCI(new NetCard());
	}
}

6、多态的注意事项

6.1在多态中成员函数的特点

6.1.1 在编译时期:参阅引用型变量所属的类是否有调用的方法。如果有,编译通过;如果没有,编译失败。

6.1.2 在运行时期:参阅对象所属的类中是否有调用的方法。

6.2在多态中,成员变量的特点(常用于面试)

无论编译和运行,都参考左边(引用型变量所属的类)

6.3在多态中,静态成员函数的特点(常用于面试)

无论在编译和运行,都参考左边(引用型变量所属的类)

代码如下:

class Father {
	int num = 10;
	void method1() {
		System.out.println("Father method 1");
	}

	void method2() {
		System.out.println("Father method 2");
	}
	static void method4() {
		System.out.println("Father method 4");
	}
}

class Son extends Father {
	int num = 20;
	void method1(){
		System.out.println("Son method 1");
	}
	void method3(){
		System.out.println("Son method 3");
	}
	static void method4() {
		System.out.println("Son method 4");
	}
}

class DuoTaiDemo2 {
	public static void main(String[] args) {
		//演示6.1
		Father f = new Son();
		f.method1();
		f.method2();//对应6.1.2
		//f.method3(); 对应6.1.1
		
		//演示6.2
		System.out.println(f.num);
		
		//演示6.3
		f.method4();
	}
}

结果如下截图:



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值