黑马程序员-day08-面向对象(多态)

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

多态
定义:某一类事物的多种存在形态。
1.例:动物中猫,狗。
2.猫这个对象对应的类型是猫类型
  猫 x = new 猫();
3.同时猫也是动物中的一种,也可以把猫称为动物。
  动物  y = new 猫();
  动物是猫和狗具体事物中抽取出来的父类型。
  父类型引用指向了子类对象。

多态的体现
1.父类的引用指向了自己的子类对象。
2.父类的引用也可以接收自己的子类对象。
演示代码
/*
 * 需求:
 * 1.演示多态的体现
 * (1)父类的引用指向了自己的子类对象。
 * (2)父类的引用也可以接收自己的子类对象。
 * 2.怎么更好的调用子类特有方法
 */
//动物类
abstract class Animal{
  //共性方法,但内容不确定
  abstract void eat();
}

//猫
class Cat extends Animal{
	public void eat(){
		System.out.println("猫吃鱼");
	}
	//特有方法
	public void catchMouse(){
		System.out.println("猫抓老鼠");
	}
}

//狗
class Dog extends Animal{
	public void eat(){
		System.out.println("狗吃骨头");
	}
	//特有方法
	public void kanJia(){
		System.out.println("猫看家");
	}
}

//测试类
public class DuoTaiDemo {
	public static void main(String[] args) {
		/*以前的做法
		Cat cat = new Cat();
		cat.eat();
		Dog dog = new Dog();
		dog.eat();
		*/
		//多态的体现
		Animal c = new Cat();
		function(c);
		Animal d = new Dog();
		function(d);
		
		/* 
		 * 说明:
		 * 1.我们能转换的是父类引用指向了自己的子类对象时,该应用可以被提升,也可以被强制转换。
		 * 2.多态自始至终都是子类对象在做着变化。
		 */
		//向上转型(类型提升)。 
		Animal c1 = new Cat();
		System.out.println(c1.getClass());
		//向下转型(强制转换):强制将父类的引用转成子类类型
		Cat c2 = (Cat)c1;
		System.out.println(c2.getClass());
	}
	
	public static void function(Animal a){
		a.eat();
		//调用子类的特用方法;instanceof用于判断对象的类型
		if(a instanceof Cat){
			Cat c = (Cat)a;
			c.catchMouse();
		}else if(a instanceof Dog){
			Dog c = (Dog)a;
			c.kanJia();
		}
	}
}

多态的前提
1.必须是类与类之间有关系。要么继承,要么实现。
2.通常还有一个前提:存在覆盖。

多态的优点和弊端
1.优点:多态的出现大大的提高程序的扩展性和后期可维护性。
2.弊端:提高了扩展性,但是只能使用父类的引用访问父类中的成员。

多态的特点
1.在多态中成员函数的特点:
在编译时期:参阅引用型变量所属的类中是否有调用的方法。如果有,编译通过,如果没有编译失败。
在运行时期:参阅对象所属的类中是否有调用的方法。
简单总结就是:成员函数在多态调用时,编译看左边,运行看右边。
2.在多态中,成员变量的特点:
无论编译和运行,都参考左边(引用型变量所属的类)。
3.在多态中,静态成员的特点:
无论编译和运行,都参考做左边。

instanceof关键字
instanceof是Java的一个二元操作符,和==,>,<是同一类东东。由于它是由字母组成的,所以也是Java的保留关键字。它的作用是测试它左边的对象是否是它右边的类的实例,返回boolean类型的数据。举个例子:
  String s = "I AM an Object!";
  boolean isObject = s instanceof Object;

多态的应用
多态的主板示例
/*
需求:电脑运行实例
接口的出现增加了功能拓展,同时多态的应用提高了程序拓展性
*/
//接口
interface PCI{
	public abstract void open();
	public abstract void close();
}

//主板
class MainBoard{
	public void run(){
		System.out.println("mainboard run");
	}
	//拓展功能,(PCI p)使用多态提高了程序拓展性
	public void usePCI(PCI p){
		if(p!=null){
			p.open();
			p.close();
		}
	}
}

//---------------------------------------------------------
//下面都是拓展功能
//网卡
class NetCard implements PCI{
	public void open(){
		System.out.println("NetCard run");
	}
	public void close(){
		System.out.println("NetCard close");
	}
}

//声卡
class SoundCard implements PCI{
	public void open(){
		System.out.println("SoundCard run");
	}
	public void close(){
		System.out.println("SoundCard close");
	}
}

//测试类
class PCDemo{
	public static void main(String[] args){
		MainBoard mb = new MainBoard();
		mb.run();
		mb.usePCI(new NetCard());
		mb.usePCI(new SoundCard());
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值