下面给大家介绍一些关于多态与抽象的知识: 都是一些比较简单的基础知识,如果有大佬能指导一二,那更是感激不尽
多态: 相同行为,不同实现.
静态多态:编译时,系统就能决定调用哪个方法
动态多态:运行中,系统才能动态确定方法所指的对象.
方法的重载: 满足相同的行为,不同的实现,是多态的一种体现,是静态多态.
方法的重写: 单独的重写也是静态多态
动态多态:使用动态绑定和重写实现
数据类型 基本数据类型 引用数据类型
发生原因 赋值时左右两端数据类型不匹配 赋值时左右两端数据类型不匹配
转换类型 自动(小转大) 强制(大转小) 自动(向上转型) 强制(向下转型)
适用范围 除了boolean其他都可以相互转换 只有继承类才能相互转换
对我们来说要想编译,运行都通过,最终只有两种效果:
1. 父类引用指向子类对象.
编译通过:因为子类和父类就是is-a的关系,所以子类对象就是父类类型的,一点问题也没有.
运行通过:因为每个子类对象在产生过程中,都是采用内存叠加的方式
先产生父类对象部分(就是一个完整的父类对象),然后在叠加子类特有
所以,这个子类对象拥有父类类型类型定义的一切内容
唯一的问题是:
当使用父类引用指向子类对象的时候,该引用只能操作到该对象身上继承与父亲的属性和行为,操作不到这个子类对象自己特有的属性和行为.
如果子类重写了父类的行为,那么只要是子类对象,不管用什么引用去指向,效果都是会是子类重写后的效果.
动态多态:
1.给的是父类引用
2.因为父类引用只能看见来自父类的部分,所以这个方法一定要定义在父类身上,然后在子类重写
动态绑定技术:
运行时根据父类引用变量所指向对象的实际类型执行相应的子类方法,从而实现多态性
2. 本类引用指向本类对象.
Instanceof
作用是判断某个对象是否是某个数据类型
true false
instanceof 既是一个关键字,又是一个运算符.
对象 instanceof 数据类型
判断某个对象是否是某个数据类型
多态应用:
1.多态参数
2.异购集合-多态数组
多态总结:
1.使用父类类型的引用指向子类的对象.
2.该引用只能调用父类中定义的方法,不能调用子类中独有的方法
3.如果子类中重写了父类中的一个方法,那么在调用该方法的时候,将会调用子类中的这个方法.
4.在子类中,子类可以调用父类中的所有办法.
抽象方法:
父类的某些方法,只能确定方法声明
(即子类共有的方法叫什么名字,有什么参数,返回值为什么类型,访问修饰符应该是什么)
但是不能确定方法的具体实现(因为不同的子类具体的实现不同,所以具体的实现应该让子类重写)
语法:
在方法修饰符部分书写abstract修饰符,方法不能有实现部分(包括不能有{})
在方法的参数列表最后用;结束
抽象类与抽象方法的关系:
(1) 有抽象方法必须是抽象类
(2) 抽象类不一定有抽象方法
抽象类: 某些类的设计用途就是拿来做父类的,而不是产生对象的.
为了避免一些误操作 把这种设计为抽象类.
语法:在class关键字前面加修饰符abstract.
影响:
1.抽象类只是不能产生对象了,但是不影响别的内容.其他该有的都有.
2.仍然可以指向子类的对象,访问共有的属性行为.
3.与子类的关系还是is-a的关系.甚至应该说是先考虑到is-a的关系才设计父类,再通过是否需要产生父类对象,来判定是否设计为abstract.
抽象类和抽象方法的好处:
从设计的角都看,将一个抽象方法放在父类中,可以强制任何子类实现一个特别的行为.继承抽象方法的子类如果想要实例对象,必须重写该方法.