1.多态
定义:一种事物的多种状态
多态的规则(前提):
1.类和类之间要有(继承)关系
2.要有方法的重写
3. (核心)父类的引用(指针) 指向 子类对象(空间)
例子:
需求: 创建 动物类 猫类 狗类
都有一个吃的方法 动物类 动物吃饭
猫 猫吃鱼
狗 狗吃骨头
public static void main(String[] args) {
//本类的引用(指针) 指向本类的对象(空间)
Cat cat=new Cat();
cat.eat();
//多态的对象创建方式
//父类指针指向子类空间
Animal aCat=new Cat();
aCat.eat();
Animal aDog=new Dog();
aDog.eat();
}
}
class Animal{
public void eat() {
System.out.println("动物吃饭");
}
}
class Cat extends Animal{
@Override
public void eat() {
System.out.println("猫吃鱼");
}
}
class Dog extends Animal{
@Override
public void eat() {
System.out.println("狗吃骨头");
}
2.多态访问成员变量和成员方法
成员变量:
编译:
编译时要查看父类中是否有这个属性 没有就编译错误
运行:
运行时 访问的是父类中 这个成员变量
结论 当使用多态形式创建对象时 访问成员变量时 编译和运行都看父类的属性
成员方法:
编译:
编译时需要看父类中是否有该方法 没有就报错 有就编译通过
运行:
运行时 调用的是 子类重写父类的方法
结论:编译看父类 运行看子类
public static void main(String[] args) {
//多态的创建方式
Father fSon=new Son();
fSon.print();
System.out.println(fSon.num);
Son son =new Son();
son.print();
System.out.println(son.num);
}
}
class Father{
int num=10;
public void print() {
System.out.println("父类打印");
}
}
class Son extends Father{
int num=20;
@Override
public void print() {
System.out.println("子类打印");
}
}
访问成员变量图:
访问成员方法图:
3.多态的好处及弊端
好处:
1.减少代码量 提高工作系效率
2.相当于提高了代码的可维护性(指的是继承)
3.核心:提高方法的扩展性
弊端:
当使用多态的方式创建对象时 无法直接调用子类中特有的方法
多态调用子类的特有方法注意:
必须要有 向上转型 才能进行向下转型
例子:
人 聊天
骗子 洗澡(聊天升级)
打人(威胁人)
public static void main(String[] args) {
//多态创建对象
//提升了骗子的逼格(提升了子类对象的类型)
//向上转型
Person p=new PianZi();
p.speak();
//如何调用子类的特有方法
//把装成人的骗子打回原形
//向下转型----强制类型转换
PianZi p2=(PianZi)p;
//调用子类的特有方法
p2.hit();
}
4.多态核心特点
提升方法的扩展性
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.hit();
//判断一下类型
//根据具体的类型进行向下转型
//判断武器是否属于剑这个类的对象
if(wuQi instanceof Jian) {
//该武器是一把剑
//向下转型成剑
Jian j=(Jian)wuQi;
//调用也有的方法
j.lianJian();
}
else if (wuQi instanceof Dao) {
Dao d=(Dao)wuQi;
d.lianDao();
}
}