多态学习

多态产生的前提 :

1》必须具有继承关系
2》在子类中,必须有方法的重写。

创建子类对象时不会创建父类对象

多态的分类:

1》 多态的向上转型

父类的引用指向子类对象。
①里氏代换原则 :任何基类可以出现的地方,子类一定可以出现
②弊端:

发生了向上转型的父类引用, 只能调用继承父类的方法或者子类重写父类的方法,不能调用子类特有的方法。

在向上转型中:

1 如果父类中的属性和子类的属性同名的时候, 父类对象认为认为子类的属性是特有的 , 父类定义的对象只调用自己的属性。
2.即是当父类属性和子类属性同名时, 父类对象名 调用的就是 父类的属性,子类的对象名 调用的就是 子类的属性。
3 如果父类的方法和子类方法同名时,在上转型关系中,父类的引用指向子类的实体 ,父类的对象调用的是子类的方法。但是要注意,此时父类的对象名不能调用子类特有的方法,如果要调用,则需要下转型。

2》 多态的向下转型

① 为了解决多态向上转型带来的弊端(子类特有的方法不能使用),需要通过向下转型解决。
② 多态的向下转型,实质是强制类型转换。
格式 :
(要转换成的类型) 父类引用
③ 向下转型引发的问题 :
如果父类引用中 存储的就是本类对象或者不是要转换的类型的对象,就会报ClassCastException 类型转换异常。
Animal a = new Animal(); Cat c = (Cat)a; //ClassCastException 转换异常,编译报错
要先向上转型之后才可以向下转型
④ 为了解决类型转换异常的问题:
1》 instanceof
格式 :
对象的名称 instanceof 类名
该格式 判断是 对象是否为类名所在类的对象,如果是 返回true ,如果不是 返回false。
注意: 类名 必须精确到要转换的内个类型,其父类类型也会返回true。并且必须是在同一棵家族树上的

方法绑定

  • 方法的绑定:
    ① 绑定 :绑定是指一个方法的调用和该方法所属的类(所在的类)相关联
    ② 绑定分类:

  • 1》 静态绑定: 编译期绑定

    对于属性无论是静态属性还是非静态属性,都是静态绑定
    对于静态方法来说 也是静态绑定。
    静态绑定只看对象的数据类型,是哪个类就去哪个类中查找。

  • 2》 动态绑定: 运行期绑定

    对于非静态方法来说,属于动态绑定。
    动态绑定首先需要看对象的数据类型,去该类中查找对应的方法,
    并且需要看赋值符号右侧的对象,如果对象是该类,直接执行,如果对象是子类,
    去子类中查找该子类是否重写了父类的方法,如果重写了,就执行重写的子类方法。

**总结 :

属性和静态方法看赋值符号左侧,左侧是哪个类型就去哪个类中查找,
非静态方法除了看赋值符号左侧,还需要看右侧的对象,是哪个类,就去哪个类查找。**
非静态属性,静态属性和静态方法都是 [编译看左边,运行看左边]
非静态方法,[编译看左边,运行看右边].

(可以这么记:重写的功能是:"重写"后子类的优先级要高于父类的优先级,但是“隐藏”是没有这个优先级之分的。 因为非静态属性,静态属性和静态方法不能被重写,所以运行要看左边。因为重写的方法优先级高,所以运行的时候看右边。)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值