IT彭于晏带你学java之多态

1.多态

多态:一种事物的多种状态
 * 青蛙卵 ---> 蝌蚪  --->青蛙 --->食物 --->屎

2.多态的规则

 多态的规则(前提)
 * 1.类和类之间  必须要有关系(继承关系)
 * 2.必须要有方法的重写(否则多态没有意义)
 * 3.(核心)父类的引用(指针) 指向 子类的对象(子类的对象)
/* 需求: 创建 动物类 猫类 狗类
* 都有一个吃的方法 动物类 动物吃饭
* 				 猫   猫吃鱼
* 				 狗   狗吃骨头
*/

class Animal {
	public void eat() {
		System.out.println("我在吃饭");
	}
}

class Cat extends Animal {
	public void eat() {
		System.out.println("猫在吃鱼");
	}
}

class Dog extends Animal {
	public void eat() {
		System.out.println("狗在啃骨头");
	}
}

public static void main(String[] args) {
			//本类的引用(指针) 指向 本类的对象(空间)
			Cat cat = new Cat();		
			cat.eat();
			
			//多态的对象创建方式
			//父类指针指向子类空间
			Animal aCat = new Cat();
			aCat.eat();
			
			Animal aDog = new Dog();
			aDog.eat();
		}

3.多态成员变量的使用与成员方法的使用

多态 如何使用成员变量?
 * 父类的引用 只能 访问 子类空间中 属于父类的那块空间
 * 编译:
 * 编译时 要查看 父类中是否有这个属性 没有就编译错误
 * 		
 * 运行: 
 * 运行时 访问的是父类中 这个成员变量
 * 结论:当使用多态形式创建对象时访问成员变量时 编译和运行都是看父类的属性(记)
 * 
 * 多态 调用成员方法
 * 编译:编译时 需要看父类中 是否有该方法 没有就报错
 * 有就编译通过
 * 运行:调用的是 子类重写父类的方法
 * 结论:编译看父类 运行看子类(记)

4.多态的好处与弊端

多态的好处:
 * 1.减少代码量 提高工作效率 复用性强
 * 		相当于提高了代码 可维护性(指的是继承)
 * 2.(核心)提高方法的扩展性
 * 
 * 多态的弊端:
 * 当使用多态的方式创建对象时
 * 无法直接调用 子类中 特有的方法
 * 
多态调用子类的特有方法注意:
 * 必须先有 向上转转型 才能向下转型     
public static void main(String[] args) {
		//多态创建对象
		//提升了骗子的逼格
		//提升子类对象类型 ---向上转型
		Person p = new Pianzi();
		p.speak();
		//如何调用子类的特有方法
		//把装成人的骗子 打回原形
		//向下转型 ---强制类型转换
		Pianzi pZ =(Pianzi) p;
		//调用子类的特有方法
		pZ.hit();
		
	}

}

class Person{
	public void speak(){
		System.out.println("聊天");
	}
}
class Pianzi extends Person{
	public void speak(){
		System.out.println("洗脑");
	}
	//特有方法
	public void hit(){
		System.out.println("打人 威胁人");
	}
}




5.多态的核心提升扩展性

武器 --打
 * 剑 --- 舞 --- 练剑
 * 刀 --- 砍 --- 练刀
 * 杖 --- 抡
 * 枪 --- 射
 * 手里剑 --- 扔
 * 捡装备的方法(武器类)
 * (重写的方法)
 * (每个装备特有的方法)
 * 
 * 武器类 武器 = 剑
 * 武器.重写方法();
 * 
 * 判断一下 传进来的参数 是什么类型
 * 剑 --->剑类型
 * 
 */
public class Demo04 {
	public static void main(String[] args) {
		//测试方法是否扩展
		Jian jian = new Jian();
		fun(jian);
		Dao dao = new Dao();
		fun(new Dao());//匿名对象
		
	}
	//使用多态的方法
	public static void fun(WuQi wuQi){
		//WuQi wuQi = jian   向上转型
		//调用 子类中重写的方法
		wuQi.hit();
		/*多态调用子类的特有方法注意:
         必须先有 向上转转型 才能向下转型 */  
		//判断一下类型
		//根据具体类型 进行 向下转型
		//判断 wuQi是否属于 Jian(类名)这个类的对象
		if (wuQi instanceof Jian){
			//该武器 就是一把剑
			//向下转型
			Jian j = (Jian)wuQi;
			//调用 特有方法
			j.lianJian();
		}else if(wuQi instanceof Dao){
			Dao d = (Dao)wuQi;
			d.lianDao();
		}
		
	}

}

class WuQi{
	// 打
	public void hit(){
		System.out.println("武器打");
	}
}
class Jian extends WuQi{
	@Override
	public void hit() {
		System.out.println("剑----舞一下");
	}
	//特有的方法
	public void lianJian(){
		System.out.println("练习剑法");
	}
}
class Dao extends WuQi{
	@Override
	public void hit() {
		System.out.println("刀---砍人");
	}
	public void lianDao(){
		System.out.println("练习刀法");
	}
}





猜你喜欢

转载自blog.csdn.net/weixin_42120532/article/details/80302150