多态
一种事物的多种状态
多态的规则(前提):
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("练习刀法");
}
}