多态与抽象

多态

相同的行为,不同的实现。
多态的分类;
静态多态:编译时,系统就能决定调用哪个方法
单独的重写也是静态多态
动态多态:运行中系统才能动态确定方法所指的对象。

多态的实现
静态多态:使用重载实现
动态多态

基本类型			引用类型	
发生		“=”左右两端,赋值的时候	

转换形式		1自动	小转大		1自动	向上转换  子类继承父类
2强制	大转小		2强制	向下转换  父类继承子类

使用范围 不是所有的基本数据类型 不是所有的引用类型可以相互转换
可以相互转换 必须是继承关系才能相互转换

要想编译通过,运行也通过。
最终只有两种效果,
第一种父类引用指向子类对象
第二种本类引用指向本类对象

本类引用指向子类对象
编译通过:是因为子类和父类就是is-a的关系,所以子类对象就是父类类型的,
运行通过:是因为每个子类对象在产生过程中,都是采用内存叠加的方式。
先产生父类对象部分(就是一个完整的父类对象),然后再叠加子类特有的。
所以,这个子类对象拥有父类类型定义的一切内容。

唯一的问题:
当使用父类引用指向子类对象的时候,该引用只能操作到该对象身上继承与父类的属性或行为,
操作不到这个子类对象自己特有的属性和行为。

特例 ----也是动态多态的关键
	如果子类重写了父类的行为,那么只要对象是子类对象,
	不管用声明引用去指向(父类也好,子类也好),效果都会是子类重写的效果。
举例:动物叫,狗叫猫叫

动态多态:
1、给的是父类的引用
2、因为父类引用只能看见来自父类的部分,
所以这个方法一定要定义在父类身上,然后再子类重写

动态绑定技术:
运行时根据父类引用变量所指向对象的实际类型执行相应的子类方法,从而实现多态性。

由于父类引用可以指向子类对象,且是自动类型转换,没有任何特殊语法。
那么我们在书写代码的时候,手里如果有一个父类

instanceof关键字:
对象 instanceof 数据类型
判断某个对象是否是某个数据类型
返回类型:true false

多态总结:
使用父类类型的引用指向子类的对象。
该引用只能调用父类中定义的方法,不能调用子类中独有的方法。
如果子类中重写了父类中的一个方法,那么在调用该方法的时候,将会调用子类中的这个方法。
在多态中,子类可以调用父类中的所有方法。

抽象方法:
父类的某些方法,只能确定方法声明。
(即子类共有的方法叫什么名字,有什么参数,返回值为什么类型,访问修饰符应该是什么)
但是不能确定方法的具体实现(因为不同的子类具体实现不同,所有具体的实现应该让子类重写)

语法:
在方法修饰符部分书写abstract修饰符,方法不能有实现部分(包括不能有{})
在方法的参数列表最后用:结束

影响:它可以在编译期,强制要求子类的实现必须重写来自父类的抽象方法。
(抽象类的子类必须重写它的抽象方法,除非子类也是抽象类)

相关概念:最终方法

抽象类与抽象方法的关系:
(1)有抽象方法的类必须是抽象类
(2)抽象类不一定有抽象方法
但是从设计上来说,如果抽象类没有抽象方法,就失去了抽象的意义了。
(3)抽象可以通过 继承 传递的。
比如:父类有三个抽象方法,子类只能确定实现其中的1个或2个,那么子类仍然具有抽象方法。
所以这个子类也必须是抽象类,再由子类的子类进一步重写实现。

抽象类:
某些类的设计用途就是拿来做父类的,而不是产生对象的。
为了避免无操作,把这种类设计为抽象类。

语法:
在class关键字面前加修饰符 abstract

影响;—抽象类只是不能产生对象了,但不影响别的内容。
1该有的书写、行为、构造、初始化块、…都可以有
2仍然可以指向子类的对象,访问共有的属性行为
3与子类的关系还是is-a,甚至应该说先考虑到is-a的关系才设计父类,
在通过是否需要产生父类对象,来判断是否设计为abstract

抽象类
相关概念:最终类 —

抽象类和抽象方法的好处
从设计的角度看,将一个抽象方法放到父类中,可以强制任何子类实现一个特别的行为。
继承抽象方法的子类如果想要实例化对象,必须重写该方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值