现在的位置: 首页 > 综合 > 正文

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

2018年05月28日 ⁄ 综合 ⁄ 共 2721字 ⁄ 字号 评论关闭

               -------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();
	}
}

结果如下截图:

抱歉!评论已关闭.