多态与抽象

                             **多态与抽象**

这里写图片描述

                 **多态**
在Java中,多态有两种理解方式:第一种是对象的不同的方法可以用相同的一个方法名,也就是重载的概念。 另一种是同一对象根据不同的消息执行相应的行为,也可以这样认为发送消息给某一个对象,让对象自行选择哪种相应的行为。根据这种两种方式,所以多态可以分为静态多态和动态多态。
静态多态指的是程序在编译时,系统就能决定调用哪个方法,所以也称为编译时多态。在Java中,静态多态实现的方式就是方法重载,其调用规则是依据对象在定义时的类型相应地调用对应类中的重载方法。
动态多态指在运行中系统才能动态确定方法所指的对象,所以也称为运行时多态。动态多态的实现方式是重写父类中的同名成员方法,其调用规则是依据对象在实例化时而非定义时的类型,相应地调用对应类中的同名成员方法。也就是说,动态多态主要通过动态绑定和重写的机制来实现。 

  **技术基础**
在Java中,使用动态绑定和重写机制来实现多态,我们首先需要掌握如下三个基础技术概念:
向上转型技术:一个父类的引用变量可以指向不同的子类对象,或者说一个子对象可以被当作一个父类类型。
instanceof关键字:instanceof关键字用于判断运行时对象的真正类型。
动态绑定技术:运行时根据父类引用变量所指对象的实际类型执行相应的子类方法,从而实现多态性。

1)向上转型和向下转型
数值数据类型byte、short、int、long、float和double的相互转换规则,即:当从低精度数据类型向高精度数据类型转换时实行自动转换,这种类型转换技术称为向上转型;当从高精度数据类型向低精度数据类型转换时,需要使用强制类型转换符,这种类型转换技术称为向下转型。
对于引用数据类型,这种转换技术依然适用。在父类和子类的继承层次关系中,沿着子类向父类向上转型是自动转换,而从父类向子类必须使用强制类型转换才能实现向下转型。

2)使用instanceof关键字判断对象的真正类型
Java语言的多态机制导致了引用变量的声明类型和实际引用对象的类型可能不一致。为更准确鉴别一个对象的真正类型,Java语言引入了instanceof运算符。

3)动态绑定
在面向对象程序开发中,我们将一个方法调用与该方法所在的类关联起来,称为"绑定"。绑定分静态绑定和动态绑定,或者称为前期绑定和后期绑定。
所谓静态绑定,是指在程序执行前方法已经被绑定,此时由编译器或其它连接程序实现。针对Java简单的可以理解为程序编译期的绑定;这里特别说明一点,Java中的方法只有final、static、private和构造器是前期绑定。
所谓动态绑定,是指在运行时根据具体对象的类型进行绑定。Java中所有的普通方法,都采用动态绑定技术。通过动态绑定,JVM必须沿着继承层次树向下找,判断一个方法是否被重写。如果方法被重写了,在运行时就执行子类中的方法,而不是编译时调用的父类方法。

    **多态的主要应用**
在Java中,多态的主要应用体现在两个方面:多态参数和异构集合。下面我们分别以示例详细说明。

  1)多态参数
所谓多态参数,就是当方法的某个形式参数是一个引用的时候,与该引用兼容的任何对象都可以传递给方法,从而允许方法接受不同数据类型的形式参数。

  2)异构集合
多态最常见的应用是创建一个不是同一类型,但是有共同父类的数据集合。不同对象的集合称为异构集合。

注:
能够在编译期间,就能够确定是方法是被哪一个对象所执行的重载或者重写,都是属于静态多态

引用数据类型的向上转型只能适用于父子之间,不能去玩:指鹿为马的事
引用数据类型的向上转型,是指子类向父类转型,这个编译器会自动识别
子类与子类,不是父子关系,不能相互转换

为什么父类的引用可以指向子类的实现? 因为子类的实例中,一定拥有一个完整的父类的所有的值得数据。

引用数据类型,向下转型是有风险的,不是说就一定能转型成功,如果需要转型成功,必须满足2个条件:
第一个,必须是父类的引用指向一个子类的实现
第二个,子类的引用最终必须指向相同类型的子类实现

instanceof关键字的作用:判断某个对象,是否是某种类型的对象.
       规避掉在“强制向下转型”过程中,可能会出现的转型风险


       **抽象**
我们在编写类时,通常会在类中定义一些方法,用来描述该类所具有的行为。在类的方法体中,我们编写代码实现该类所要执行的行为。在继承关系中,子类继承父类后,子类也就具有父类所具备的行为。如果子类继承了父类的行为,但是与父类的行为实现方式不同,就需要通过方法重写来覆盖父类的行为。
如果我们不需要类的实例时,就可以将类设计成为一个抽象类。所谓抽象类,是不能被实例化的类。在抽象类中,类的所有其它功能都存在,成员变量、方法、构造器都可以用同样的方式访问。我们只是不能创建抽象类的实例。

抽象类
在Java中,使用关键字abstract可以声明一个抽象类,该关键字可以出现在类声明时class关键字前的任何地方。

抽象方法
果我们想一个类包含一个特定的方法,该方法的实际实现由子类决定,那么我们就可以在父类中将该方法声明为抽象方法。抽象方法只有方法签名,没有方法体。
将一个方法声明为抽象方法有两个结果:
类也必须声明为抽象类。如果一个类包含了抽象方法,那么该类也必须是抽象的。
任何子类必须重写抽象方法,除非子类本身也是抽象的。

注:
如果一个类中存在抽象方法,那么那个类就是抽象类。
抽象类中可以继续编写:成员变量、常量、静态常量,初始块,行为,甚至连构造都可以。但是构造器此时的作用,并非是为了创建对象,而是用于分配成员变量的存储空间。
但是抽象类中,不一定必须要有抽象方法(语法上)
abstract在定义方法时,最大的作用:用来规范子类的行为,强制性要求子类必须重写父类的方法实现
抽象类除了不能实例化以外,其他的都和普通类没有任何区别
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值