Loading

Java基础之——多态的基本使用

多态的定义

  • 同一方法可以根据发送对象的不同而采用多重不同的行为方式
  • 一个对象的实际类型是确定的,但可以指向对象的引用类型有很多
  • 多态就是同一个接口,使用不同的实例而执行不同操作
  • 一个对象拥有多种形态,这就是:对象的多态性(Multi)

研究的问题:对象的不同形态

多态的优点

  • 消除类型之间的耦合关系

  • 可替换性

  • 可扩充性

  • 接口性

  • 灵活性

  • 简化性

  • 提高了程序的扩展性

    • 具体体现:定义方法的时候,使用父类型作为参数,将来在使用的时候,使用具体的子类型参与操作
  • 弊端:不能使用子类的特有功能

多态存在的条件

  • 存在继承关系
  • 子类重写父类方法
  • 父类引用指向子类对象

比如:Parent p = new Child();

当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。

class Animal {
    public void eat() {
        System.out.println("动物吃东西");
    }
}
class Cat extends Animal {
    @Override
    public void eat() {
        System.out.println("猫吃鱼");
    }
}
public class Demo {
 	public static void main(String[] args) {
        Animal a = new Cat();
    }   
}

成员方法/方法的访问特点

看new的是谁,就优先用谁,没有则向上找

  • 父子都有,优先用子
  • 子类没有,父类有,向上找到父类
Fu o = new Zi();
编译看左边,左边是Fu,Fu中没有methodZi方法,编译报错
o.methodZi(); //报错
运行看右边,运行子类的

多态中的转型

  • 对象的向上转型:其实就是多态的写法,从小范围转向了大范围
  • 对象的向下转型:对象一旦向上转型,那么就无法调用子类的特有方法
    • 是一个还原动作:通过向下转型可以使用子类的特有方法
    • 可能会丢失本来的方法

类型之间的转换:父与子之间

低类型转换为高类型,不需要强转,例如:Person obj= new Student()

高类型转化为低类型:Student s = (Student) obj

格式:

子类名称 对象名 = (子类名称) 父类对象;
Animal a = new Cat();
Cat c = (Cat) a;

instanceof操作符

如何才能知道一个父类引用的对象,本来是什么子类,这里使用instanceof判断

  • X instanceof Y:如果Y是X的子类,则返回true
对象 instanceof 类型
//如果希望调用子类特有方法,需要向下转型
//判断前面的对象能不能当作后面类型的实例
if(p instanceof Dog) {
    Dog dog = (Dog) p;
    dog.watch();
}
posted @ 2021-03-24 19:23  qinuna  阅读(125)  评论(0编辑  收藏  举报