----------- android
培训、java培训、java学习型技术博客、期待与您交流! ------------
多态:可以
理解为事物存在的多种体现形态。
 ①多态的体现
 父类的引用指向了自己的子类对象。父类的引用也可以接收自己的子类对象。
②多态的前提
必须是类与类之间有关系。要么继承,要么实现。通常还有一个前提:存在覆盖。
③多态的好处
多态的出现大大的提高程序的
扩展性。
④多态的弊端:
提高了扩展性,但是只能使用父类的引用访问父类中的成员。
abstract 
class Animal   //定义抽象类Animal(动物)
{
	abstract void eat();  //定义抽象方法eat()
}
class Cat extends Animal  //定义Cat类继承Animal
{
	public void eat()   //重写猫吃的方法
	{
		System.out.println("吃鱼");
	}
	public void catchMouse()   //定义猫的特有的catchMouse方法
	{
		System.out.println("抓老鼠");
	}
}
class Dog extends Animal    //定义Dog类继承Animal类
{
	public void eat()      //重写Dog吃的方法
	{
		System.out.println("吃骨头");
	}
	public void kanJia()   //定义Dog的特有的kanJia方法
	{
		System.out.println("看家");
	}
}
class DuoTaiDemo 
{
	public static void main(String[] args) 
	{
		//Animal c = new Cat();  //类型提升。 向上转型。
		//如果想要调用猫的特有方法时,如何操作?
		//强制将父类的引用。转成子类类型。向下转型。
		///Cat c = (Cat)a;
		//c.catchMouse();
		//千万不要出现这样的操作,就是将父类对象转成子类类型。
	//我们能转换的是父类应用指向了自己的子类对象时,该用可以被提升,也可以被强制转换。
		//多态自始至终都是子类对象在做着变化。
		
function(new Cat());
		function(new Dog());		
	}
	public static void function(Animal a)//Animal a = new Cat();
	{
		a.eat();
		if(a 
instanceof Cat)
		{
			Cat c = (Cat)a;
			c.catchMouse();
		}
		else if(a instanceof Dog)
		{
			Dog c = (Dog)a;
			c.kanJia();
		}
	}
instanceof : 用于判断对象的类型。 对象 intanceof 类型(类类型 
接口类型)  
}	
⑤多态的特点
a .在多态中成员函数的特点:
在编译时期:参阅引用型变量所属的类中是否有调用的方法。如果有,编译通过,如果没有编译失败。
在运行时期:参阅对象所属的类中是否有调用的方法。
简单总结就是:成员函数在多态调用时,编译看左边,运行看右边。
b .在多态中,成员变量的特点:
无论编译和运行,都参考左边(引用型变量所属的类)。
c .在多态中,静态成员函数的特点:
无论编译和运行,都参考做左边。
class Fu
{
	static int num = 5;
	void method1()
	{
		System.out.println("fu method_1");
	}
	void method2()
	{
		System.out.println("fu method_2");
	}
	static void method4()
	{
		System.out.println("fu method_4");
	}
}
class Zi extends Fu
{
	static int num = 8;
	void method1()
	{
		System.out.println("zi method_1");
	}
	void method3()
	{
		System.out.println("zi method_3");
	}
	static void method4()
	{
		System.out.println("zi method_4");
	}
}
class  DuoTaiDemo4
{
	public static void main(String[] args) 
	{
		
/*		Fu f = new Zi();
		f.method1();
a		f.method2()		
		f.method3();
*/
/*		Fu f = new Zi()
		System.out.println(f.num);	
b		Zi z = new Zi();
		System.out.println(z.num);
*/
		Fu f = new Zi();
c		System.out.println(f.num);
		f.method4();
	}
}	
⑥示例:主板的运行
interface PCI   //定义接口PCI (插槽)
{
	public void open();
	public void close();
}
class MainBoard   //定义主板类
{
	public void run()
	{
		System.out.println("mainboard run ");
	}
	public void usePCI(PCI p)//PCI p = new NetCard()//接口型引用指向自己的子类对象。
	{
		if(p!=null)
		{
			p.open();
			p.close();	
		}
	}
}
class NetCard implements PCI    //定义网卡来实现PCI插槽
{
	public void open()
	{
		System.out.println("netcard open");
	}
	public void close()
	{
		System.out.println("netcard close");
		method();
	}	
}
class SoundCard implements PCI  //定义声卡实现PCI插槽
{
	public void open()
	{
		System.out.println("SoundCard open");
	}
	public void close()
	{
		System.out.println("SoundCard close");
	}
}
class DuoTaiDemo5 
{
	public static void main(String[] args) 
	{
		MainBoard mb = new MainBoard();
		mb.run();
		mb.usePCI(null);
		mb.usePCI(new NetCard());
		mb.usePCI(new SoundCard());		
	}
}
----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------