JAVA什么是多态?
⾯向对象编程有三⼤特性:封装、继承、多态。
封装隐藏了类的内部实现机制,可以在不影响使⽤的情况下改变类的内部结构,同时也保护了数据。对外界⽽已它的内部细节是隐藏的,暴露给外界的只是它的访问⽅法。
继承是为了重⽤⽗类代码。两个类若存在IS-A的关系就可以使⽤继承。,同时继承也为实现多态做了铺垫。
那么,什么是多态呢?
1.定义:
多态:指允许不同类的对象对同⼀消息做出响应。即同⼀消息可以根据发送对象的不同⽽采⽤多种不同的⾏为⽅式。(发送消息就是函数调⽤)。
通俗⼀点的说法:所谓多态就是指程序中定义的引⽤变量所指向的具体类型和通过该引⽤变量发出的⽅法调⽤在编程时并不确定,⽽是在程序运⾏期间才确定,即⼀个引⽤变量倒底会指向哪个类的实例对象,该引⽤变量发出的⽅法调⽤到底是哪个类中实现的⽅法,必须在由程序运⾏期间才能决定。因为在
程序运⾏时才确定具体的类,这样,不⽤修改源程序代码,就可以让引⽤变量绑定到各种不同的类实现上,从⽽导致该引⽤调⽤的具体⽅法随之改变,即不修改程序代码就可以改变程序运⾏时所绑定的具体代码,让程序可以选择多个运⾏状态,这就是多态性。
2.实现多态的技术称为:动态绑定(dynamic binding),是指在执⾏期间判断所引⽤对象的实际类型,根据其实际的类型调⽤其相应的⽅法。
3.作⽤:消除类型之间的耦合关系。
多态的优点
1. 消除类型之间的耦合关系
2. 可替换性(substitutability):多态对已存在代码具有可替换性。例如,多态对圆Circle类⼯作,对其他任何圆形⼏何体,如圆环,也
同样⼯作。
3. 可扩充性(extensibility):多态对代码具有可扩充性。增加新的⼦类不影响已存在类的多态性、继承性,以及其他特性的运⾏和操
作。实际上新加⼦类更容易获得多态功能。例如,在实现了圆锥、半圆锥以及半球体的多态基础上,很容易增添球体类的多态性。4. 接⼝性(interface-ability):多 态是超类通过⽅法签名,向⼦类提供了⼀个共同接⼝,由⼦类来完善或者覆盖它⽽实现的。如图8.3
所⽰。图中超类Shape规定了两个实现多态的接⼝⽅法,computeArea()以及computeVolume()。⼦类,如Circle和 Sphere为了实现多态,完善或者覆盖这两个接⼝⽅法。java重写和重载的区别
5. 灵活性(flexibility):它在应⽤中体现了灵活多样的操作,提⾼了使⽤效率。
6. 简化性(simplicity):多态简化对应⽤软件的代码编写和修改过程,尤其在处理⼤量对象的运算和操作时,这个特点尤为突出和重
要。
多态存在的三个必要条件
继承
重写
⽗类引⽤指向⼦类对象(向上转型)
向上转型:在多态中需要将⼦类的引⽤赋给⽗类对象,只有这样该引⽤才能够具备技能调⽤⽗类的⽅法和⼦类的⽅法。
Animal a = new Cat(); // 向上转型
Cat c = (Cat)a; // 向下转型
多态的实现⽅式
⽅式⼀:继承⽗类进⾏⽅法重写,同⼀个类中进⾏⽅法重载
重写:⼦⽗类出现⼀模⼀样的⽅法,但返回值类型可以是⼦⽗类。
⽅法重写的应⽤:
当⼦类需要⽗类的功能,⽽功能主体⼦类有⾃⼰的特有内容时,可以重写⽗类中的⽅法。即沿⽤了⽗类的功能,⼜定义了⼦类特有的内容。当⼦类对象调⽤重写的⽅法时,调⽤的是⼦类的⽅法,⽽不是⽗类中被重写的⽅法。
要想调⽤⽗类中被重写的⽅法,则必须使⽤关键字 super。
⽅法重写规则
重写遵循“两同两⼩⼀⼤”规则:
两同: ⽅法名、形参列表相同
两⼩:
⼦类⽅法返回值类型应⽐⽗类⽅法返回值类型更⼩或相等
⼦类⽅法声明抛出的异常类应⽐⽗类⽅法声明抛出的异常类更⼩或相等
⼀⼤:
⼦类⽅法的访问权限应⽐⽗类⽅法访问权限更⼤或相等
重写注意点
⽗类中的私有⽅法不能被重写,该⽅法对于⼦类是隐藏的,因此其⼦类⽆法访问该⽅法,也⽆法重写
⽗类静态⽅法,⼦类也必须通过静态⽅法进⾏覆盖,即静态只能覆盖静态
⼦类重写⽗类⽅法时,最好声明得⼀模⼀样
如果⼦类中定义了⼀个与⽗类private⽅法具有相同的⽅法名、相同的形参列表、相同的返回值类型的⽅法,依然不是重写,只是在⼦类中重新定义了⼀个新的⽅法,所以该新⽅法不会受⽗类⽅法的任何限制。
重写和重载
Override 和 Overload 的区别?Overload能改变返回值类型吗?
Override是重写,Overload是重载。重载可以改变返回值类型,它是⽅法名相同,参数列表不同,与返回值类型⽆关。
⽅法重写:⼦类中出现和⽗类中⽅法声明⼀模⼀样的⽅法。返回值类型相同(或者是⼦⽗类,多态),⽅法名和参数列表⼀模⼀样。主要发⽣在⼦类和⽗类的同名⽅法之间。
⽅法重载:本类中出现⽅法名相同,参数列表不同的⽅法,和返回值类型⽆关,可以改变。主要发⽣同⼀类的多个同名⽅法之间。
⼦类对象调⽤⽅法时,先⼦类本⾝的⽅法,再⽗类中的⽅法。
⽅式⼆:接⼝实现
1. ⽣活中的接⼝最具代表性的就是插座,例如⼀个三接头的插头都能接在三孔插座中,因为这个是每个国家都有各⾃规定的接⼝规则,
有可能到国外就不⾏,那是因为国外⾃⼰定义的接⼝类型。
2. java中的接⼝类似于⽣活中的接⼝,就是⼀些⽅法特征的集合,但没有⽅法的实现。
⽅式三:抽象类和抽象⽅法
需要注意的问题
⼀是⼦类与⽗类的关系,⼆是重载⽅法的调⽤问题。
⼦类对象可以直接当成⽗类对象使⽤,但反过来就不可以。举例来说,⼈是⽗类,学⽣是⼈的⼦类,所以学⽣对象⼀定具备⼈对象的属性,但是⼈对象就未必具有学 ⽣对象的特性。所以学⽣对象可以当做⼈对象来使⽤,但是⼈对象就不能当做学⽣对象使⽤。注意当把⼦类对象当成⽗类对象使⽤时,⼦类对象将失去所有的⼦类特 性,只保留与⽗类同名的属性和⽅法(同名⽅法不仅是函数名相同,⽽且参数类型也要⼀样,否则不予保留)。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。