多态、向上转型、向下转型、动态绑定、静态绑定

多态:

向上转型:(子类对象赋值给父类对象)
在这里插入图片描述

向上转型

向上转型发生的三种情况:

  1. 直接赋值
  2. 方法传参
  3. 方法返回

直接赋值:
在这里插入图片描述
方法传参:
在这里插入图片描述
此时形参 animal 的类型是 Animal (基类), 实际上对应到 Bird (父类) 的实例.

方法返回:
在这里插入图片描述
此时方法 findMyAnimal 返回的是一个 Animal 类型的引用, 但是实际上对应到 Bird 的实例.

动态绑定

当子类和父类中出现同名方法的时候, 再去调用会出现什么情况呢?
对前面的代码稍加修改, 给 Bird 类也加上同名的 eat 方法, 并且在两个 eat 中分别加上不同的日志。

class Animal {
    public String name;

    public Animal(String name) {
        this.name = name;
    }

    public void eat(String food) {
        System.out.println("我是一只小动物");
        System.out.println(this.name + "正在吃" + food);
    }
}

class Bird extends Animal {
    public Bird (String name){
        super(name);
    }
    public void eat(String food) {
        System.out.println("我是一只小鸟");
        System.out.println(this.name + "正在吃" + food);
    }

}

public class Text3 {
    public static void main(String[] args) {
        Animal animal1 = new Animal("圆圆");
        animal1.eat("谷子");
        Animal animal2 = new Bird("扁扁");
        animal2.eat("谷子");
    }

}

在这里插入图片描述
此时, 我们发现:
animal1 和 animal2 虽然都是 Animal 类型的引用, 但是 animal1 指向 Animal 类型的实例, animal2 指向Bird 类型的实例.
针对 animal1 和 animal2 分别调用 eat 方法, 发现 animal1.eat() 实际调用了父类的方法, 而
animal2.eat() 实际调用了子类的方法.
因此, 在 Java 中, 调用某个类的方法, 究竟执行了哪段代码 (是父类方法的代码还是子类方法的代码) , 要看究竟这个引用指向的是父类对象还是子类对象. 这个过程是程序运行时决定的(而不是编译期), 因此称为 动态绑定
注:通过父类的引用,只能访问父类自己的成员

  1. 父类引用 引用子类的对象
  2. 通过这个父类的引用,调用父类和子类***同名的覆盖方法***。
    同名的覆盖方法,也叫 覆写/重写/覆盖(Override).

静态绑定

根据你给的参数的类型 + 个数,推导出你调用哪个函数
在这里插入图片描述
在这里插入图片描述
牛客网考过:在这里插入图片描述
静态绑定:
  静态绑定(前期绑定)是指:在程序运行前就已经知道方法是属于那个类的,在编译的时候就可以连接到类的中,定位到这个方法。在Java中,final、private、static修饰的方法以及构造函数都是静态绑定的,不需程序运行,不需具体的实例对象就可以知道这个方法的具体内容。
  
动态绑定:
  动态绑定(后期绑定)是指:在程序运行过程中,根据具体的实例对象才能具体确定是哪个方法。动态绑定是多态性得以实现的重要因素。

重写:
a. 方法名相同
b. 参数列表相同(个数 + 类型)
c. 返回值相同
d. 父子类的情况下
关于重写的注意事项

  1. 重写和重载完全不一样. 不要混淆

  2. 普通方法可以重写, static 修饰的静态方法不能重写,被final关键字修饰的方法,不能够重写。

  3. 重写中,子类的方法的访问权限不能低于父类的方法访问权限。被private修饰的方法不能够重写。在这里插入图片描述

  4. 重写的方法返回值类型不一定和父类的方法相同(但是建议最好写成相同, 特殊情况除外).在这里插入图片描述

向下转型

向上转型是子类对象转成父类对象, 向下转型就是父类对象转成子类对象. 相比于向上转型来说, 向下转型没那么常见,,但是也有一定的用途。
在这里插入图片描述
在这里插入图片描述
不建议向下转型,不安全,并不是所有的动物都是鸟。
在这里插入图片描述
运行结果会出现,运行转换异常。
在这里插入图片描述
instanceof 可以判定一个引用是否是某个类的实例. 如果是, 则返回 true. 这时再进行向下转型就比较安全了.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值