JAVA多态【学习笔记】

本文深入探讨了面向对象编程中的多态性,包括编译时和运行时多态,以及动态绑定的概念。解释了运行时多态性如何在Java中体现,强调了动态绑定在方法调用中的作用。同时,阐述了继承中的多态规则,方法调用机制,以及父类和子类对象的转化原则。最后,讨论了在多态方法中调用的规则,展示了如何通过父类变量调用子类方法的动态行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【多态与动态绑定】

1.多态的概念和类别

a)根据何时确定执行多态方法的哪一个,多态分为:编译时多态执行时多态

b)在编译时能够确定执行多态方法的哪一个,称为编译时多态

c)而在运行时才能够确定执行多态方法的称为执行时多态

d)运行时多态就是同一操作(方法)作用于继承关系中的不同对象时,会产生不同的执行效果

tips:所谓多态性,通俗的解释就是一个名字具有多种含义。使用多态可提高程序的可拓展性和复用性

---------------------------------------------------------------------------------------------------------------------------------

2、运行多态性含义

a)多态性是面向对象程序设计的三大特性之一(面向对象程序设计三大特征 1、多态(Polymorphism) 2、继承(Inheritance) 3、封装(Encapsulation))

b)注意:JAVA经常应用的多态为运行多态(重点)

c)面向对象程序设计中,严格来说运行多态性是运行绑定机制(或动态绑定机制)。这种机制实现将实现将某种多态对象的方法调用绑定到方法的具体代码实现

---------------------------------------------------------------------------------------------------------------------------------

3、动态绑定含义

a)实现编译多态,具体方法一般采用方法重载(相同的方法名,不同的参数)作为基础

b)实现运行多态,是值继承中的多态,用方法覆盖(父子类)作为基础的,在多态对象对于方法的调用,通过运行时的动态绑定方式实现方法调用

【换句话说,可通过对象实际类型决定其覆盖后的方法】

---------------------------------------------------------------------------------------------------------------------------------

4.继承中的多态规则

规则1:

对于数据来说,继承是否为正确的设计可以用一个简单的规则来判断。“is-a”规则表明子类的每一个对象都是其父类的对象。例如,每一个经理对象也看待是一个员工。(is-a关系)

然而,只有经理类是员工类的子类才是有意义的。很明显,反过来就不行了(并不是所有员工都是经理)

规则2:

还有一个明确叙述“is-a”规则的方法是替换原则。该原则规定无论何时,如果程序需要一个父类对象,都可以用一个子类对象代替

结论:可以通过声明父类变量来声明子类对象(向上转型-Upcast

例如:

1)如果通过父类类型来声明引用变量,赋值可以为创建的任意子类类型对象

//向上转型来声明引用变量
Animal a1 = new Animal();
Animal b1 = new Bird();     //这是由IS-A关系所允许的
Animal c1 = new Cat();     //这是由IS-A关系所允许的

2)如果一个方法的形式参数定义的对象是父类对象,那么用这个方法,可以使用子类对象作为实参;

【运行多态和动态绑定解析】

运行多态:是指在调用时,一个继承关系中父类变量可以指向多个实际子类型的对象,例如:使用多个基类变量来引用若干个不同的子类对象,每个子类对象都有覆盖父类某个成员的方法。

动态绑定:由于多态,一个父类引用变量可以指向子类或父类的对象。在运行时自动选择正确的子类对象的成员方法进行调用成为动态绑定

---------------------------------------------------------------------------------------------------------------------------------

5.方法调用机制(**理解动态绑定机制)

理解调用一个对象方法的机制是非常重要的。下面调用一个方法 x.f(参数)x是一个C类的对象:

1)编译器检查对象的声明类型和方法名

2)接着,编译器检查方法调用中的参数类型。如果在所有的叫做f的方法中有一个其参数类型同调用提供的参数类型最匹配,那么该方法就会被选择调用。这个过程称作超载选择

3)当方法类型为privatestaticfinal或是一个构造函数,那么编译器会准确地知道调用哪个方法。这叫做静态绑定

4)当程序运行并且使用动态绑定来调用一个方法时,那么虚拟机必须调用同x所指向的对象的实际类型相匹配的方法版本。假设实际类型为DC的子类)

首先,解释器会在D的父类C中搜寻方法fString) ,如没有发现,则报错,如有,继续

然后,如果类D对方法fString)覆盖,

那么该方法就会被调用,否则,调用父类f方法

以下是动态绑定在通过数组使用的例子:

 Animal[] zoo = new Animal[3]; 
 zoo[0] = new Bird(); //是一个鸟类的对象
 zoo[1] = new Cat() //猫对象
 zoo[2] = new Elephant()//大象对象

---------------------------------------------------------------------------------------------------------------------------------

 6.在多态方法中调用规则(通过父类变量e引用子类对象)

SuperClass e= new SubClass(); 

对于e.f()方法:

1) 如果调用方法在父类中定义,在子类中没有定义,则不管引用什么对象都调用父类方法(继承特征)

2) 如果调用方法在父类和子类中都有定义则会调用子类定义的方法;(动态绑定特性)

3) 如果调用的方法没有在父类定义,而在子类中定义,则通过父类变量引用的子类对象无法访问此方法,而通过子类变量引用的子类对象可以访问。(父态特征)

---------------------------------------------------------------------------------------------------------------------------------

7.父类对象与子类对象的使用和转化

父类对象与和子类对象的转化需要注意如下的原则:

1子类对象可以被视为是其父类的一个对象

向上转型(UPCAST):指把子类对象赋给父类声明变量或强制类型转换为父类本身的类型(此时对象为父态性

Animal e=new Cat ();
showMessage (Animal a)//实参可为任何Animal对象

2)把上面具有父态性对象再转为其本身类型

向下转型(DOWNCAST: 如果父类变量引用的是一个子类对象(对象父态),那么这个父类对象的引用可以用强制类型转换转化成其本身子类的引用【父态转为子态】

Bird animal1 = (Bird)zoo[0];//强制转换为鸟
Cat animal2 = (Cat)zoo[1];//强制转换为猫

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值