java学习之多态

多态

一种事物的多种状态

多态的规则(前提):

  1.类和类之间必须要有关系(继承关系)

  2.必须要有方法的重写(多态没有意义)

  3.(核心)父类的引用指向子类的对象(空间)


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

  多态如何使用成员变量

  父类应用只能访问子类空间中 属于父类的那块空间

  编译:编译时要查看父类中是否有这个属性 没有就编译错误

  运行:访问时父类中这个成员变量

  结论:当使用多态形式创建对象的时候

  访问成员变量时 编译和运行 都是看父类中的属性



 

  多态调用成员方法

  编译:编译时需要看父类中 是否有该方法 没有就报错

  有 就编译通过

  运行:运行时调用是子类重写父类的方法

  结论:编译看父类 运行看子类



多态的好处:

  1.减少代码量 提高工作效率 复用性强

  相当于提高了代码的可维护性(指的是继承)

  2.(核心)提高方法的扩展性

  多态的弊端:

  当使用多态的方式创建对象时

  无法直接调用子类中特有的方法


  多态调用子类的特有方法注意:

  必须要先有向上转型才能进行向下转型

public class Demo03{
	public static void main(String[] args) {
		//多态创建对象
		//提升骗子的逼格
		//提升子类对象类型---向上转型
		Person p=new PianZi();
		//如何调用子类的特有方法
		//把装成人的骗子 打回原形
		//向下转型--强制类型转换
		PianZi pZ=(PianZi)p;
		//调用子类的特有方法
		pZ.hit();
	}
}

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


多态的核心特点:提升方法的扩展性


public class Demo04 {
	public static void main(String[] args) {
		//测试方法是否扩展
		Jian jian=new Jian();
		fun(jian);
		Dao dao =new Dao();
		fun(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;
			Dao.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 static void lianDao() {
		System.out.println("练习刀法");
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值