永发信息网

类的多态性

答案:2  悬赏:40  手机版
解决时间 2021-12-25 16:59
类的多态性
最佳答案
问题一:什么体现了类的多态性? 多态是通过:
1 接口 和 实现接口并覆盖接口中同一方法的几不同的类体现的
2 父类 和 继承父类并覆盖父类中同一方法的几个不同子类实现的.
一、基本概念
多态性:发送消息给某个对象,让该对象自行决定响应何种行为。
通过将子类对象引用赋值给超类对象引用变量来实现动态方法调用。
java 的这种机制遵循一个原则:当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。
1. 如果a是类A的一个引用,那么,a可以指向类A的一个实例,或者说指向类A的一个子类。
2. 如果a是接口A的一个引用,那么,a必须指向实现了接口A的一个类的实例。二、Java多态性实现机制
SUN目前的JVM实现机制,类实例的引用就是指向一个句柄(handle)的指针,这个句柄是一对指针:
一个指针指向一张表格,实际上这个表格也有两个指针(一个指针指向一个包含了对象的方法表,另外一个指向类对象,表明该对象所属的类型);
另一个指针指向一块从java堆中为分配出来内存空间。
三、总结
1、通过将子类对象引用赋值给超类对象引用变量来实现动态方法调用。
DerivedC c2=new DerivedC();
BaseClass a1= c2; //BaseClass 基类,DerivedC是继承自BaseClass的子类
a1.play(); //play()在BaseClass,DerivedC中均有定义,即子类覆写了该方法
分析:
* 为什么子类的类型的对象实例可以覆给超类引用?
自动实现向上转型。通过该语句,编译器自动将子类实例向上移动,成为通用类型BaseClass;
* a.play()将执行子类还是父类定义的方法?
子类的。在运行时期,将根据a这个对象引用实际的类型来获取对应的方法。所以才有多态性。一个基类的对象引用,被赋予不同的子类对象引用,执行该方法时,将表现出不同的行为。
在a1=c2的时候,仍然是存在两个句柄,a1和c2,但是a1和c2拥有同一块数据内存块和不同的函数表。
2、不能把父类对象引用赋给子类对象引用变量
BaseClass a2=new BaseClass();
DerivedC c1=a2;//出错
在java里面,向上转型是自动进行的,但是向下转型却不是,需要我们自己定义强制进行。
c1=(DerivedC)a2; 进行强制转化,也就是向下转型.
3、记住一个很简单又很复杂的规则,一个类型引用只能引用引用类型自身含有的方法和变量。
你可能说这个规则不对的,因为父类引用指向子类对象郸时候,最后执行的是子类的方法的。
其实这并不矛盾,那是因为采用了后期绑定,动态运行的时候又根据型别去调用了子类的方法。而假若子类的这个方法在父类中并没有定义,则会出错。
例如,DerivedC类在继承BaseClass中定义的函数外,还增加了几个函数(例如 myFun())
分析:
当你使用父类引用指向子类的时候,其实jvm已经使用了编译器产生的类型信息调整转换了。
这里你可以这样理解,相当于把不是父类中含有的函数从虚拟函数表中设置为不可见的。注意有可能虚拟函数表中有些函数地址由于在子类中已经被改写了,所以对象虚拟函数表中虚拟函数项目地址已经被设置为子类中完成的......余下全文>>问题二:什么是多态性?Java中的多态包含哪些类型? 多态性:顾名思义就是拥有“多种形态”的含义,是指属性或方法在子类中表现为多种形态。它包括两种类型:
静态多态性:包括变量的隐藏、方法的重载(指同一个类中,方法名相同[方便记忆],但是方法的参数类型、个数、次序不同,本质上是多个不同的方法);
动态多态性:是指子类在继承父类(或实现接口)时重写了父类(或接口)的方法,程序中用父类(或接口)引用去指向子类的具体实例,从代码形式上看是父类(或接口)引用去调用父类(接口)的方法,但是在实际运行时,JVM能够根据父类(或接口)引用所指的具体子类,去调用对应子类的方法,从而表现为不同子类对象有多种不同的形态。不过,程序代码在编译时还不能确定调用的哪一个类的方法,只有在运行时才能确定,故又称为运行时的多态性。问题三:什么是多态性,C++中是如何实现多态的 多态按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。
多态性是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。
把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。
赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。也就是说,父亲的行为像儿子,而不是儿子的行为像父亲。
举个例子:例如ATM机。世界上有非常多的银行,每个银行都有好多种卡。如果ATM需要为每一种卡写一种方法去调用,例如getMoney(CCBCard card),getMoney(BBCard card)就会非常的麻烦。而且维护起来就是灾难性的。因为每时每刻都可能会有新的卡出现。所以我们可以采用多态
getMoney(Card card),所有的银行卡都继承Card这个类。这样就可以避免为每一种卡写一个方法。但是每一种卡的使用方法,作用都不一样,Card如何调用每一种卡不同的内容呢?
这就需要多态。让你看起来像是操作的父类,但是实际的运行内容却是子类的内容。
下面有一段代码,你可以参考一下。
用父类的指针或者引用指向子类对象,来实现多态的作用
class A {
public:
A() {}
virtual void foo() {
cout foo();
if(a != NULL)
delete a;
return 0;
}
这将显示:
This is B.
如果把virtual去掉,将显示:
This is A.
前面的多态实现使用抽象类,并定义了虚方法.问题四:什么是多态? 比如有一个父类superClass,它有2个子类subClass1,subClass2。superClass有一个方法
func(),两个子类都重写了这个方法。那么我们可以定义一个superClass的引用obj,让它指向一个子类的对象,比如superClass obj = new subClass1();那么我们调用obj.func()方法时候,会进行动态绑定,也就是obj它的实际类型的func()方法,即subClass1的func()方法。同样你写superClass obj = new subClass2();obj.func()其实调用的是subCla憨s2的func()方法。这种由于子类重写父类方法,然后用父类引用指向子类对象,调用方法时候会进行动态绑定,这就是多态。多态对程序的扩展具有非常大的作用,比如你要再有一个subClass3,你需要改动的东西会少很多,要是使用了配置文件那就可以不动源代码了。问题五:C++中类的继承,多态性的要点是什么 多态性
1.多态性的概念
多态性是指用一个名字定义不同的函数,这函数执行不同但又类似的操作,从而实现“一个接口,多种方法”。
多态性的实现与静态联编、动态联编有关。静态联编支持的多态性称为编译时的多态性,也称静态多态性,它是通过函数重载和运算符重载实现的。动态联编支持的多态性称为运行时的多态性,也称动态多态性,它是通过继承和虚函数实现的。
2.函数重载
函数重载的意义在于他能用同一个名字访问一组相关的函数。
在类中普通成员函数和构造函数都可以重载,特别是构造函数的重载(他提供了多种初使化方式)给用户更大的灵活性。在基类和派生类的函数重载有两种情况:一种是参数有所差别的重载。另一种是参数没有差别的重载,只是他们属于不同的类。
可以用以下两种方法来区分这两种函数:用对象名加以区分;使用“类名::”加以区分。
3.运算符重载称动态多态性,他是通过继承和虚函数实现的。
运算符重载通过创建运算符函数operator@()来实现。运算符函数定义了重载的运算符将要进行的操作,这种操作通常作用在一个类上。这样,在编译时遇到名为operator@的运算符函数(@表示所要重载的运算符),就检查传递给函数的参数的类型。
重载运算符与预定义运算符的使用方法完全相同,它不能改变原有运算符的参数个数(单目或双目),也不能改变原有的优先级的结合性。用户不能定义新的运算符,只能从C++已有的运算符中选择一个恰当的运算符重载。
3.1成员运算符函数
运算符函数可以定义为它将要操作的类的成员(称为成员运算符函数),也可以定义为非类的成员,但是非成员的运算符函数大多是类的友元函数(称为友元运算符函数)。
成员运算符函数在类中的声明格式为:
class X{
//……
type operator@(参数表);
};
其中type为函数的返回类型,@为所要重载的运算符符号,X是重载此运算符的类名,参数表中罗列的是该运算符所需要的操作数。
成员运算符函数定义的形式一般为:
type X::operator@(参数表)
//函数体}
其符号的含义与声明时相同。
在成员运算符函数的参数表中,若运算符是单目的,则参数表为空,此时当前对象作为运算符的一个操作数,通过this指针隐含地传递给函数的;若运算符是双目的,则参数表中有一个操作数,它作为运算符的右操作参数,此时当前对象做为运算符的左操作数,它是this指针隐含地传递给函数的。总之成员运算符函数operator@所需要的一个操作数是由对象通过this指针隐含传递。
3.2友元运算符函数
在C++中可以把运算符函数定义成某个类的友元函数,称为友元运算符函数。
友元运算符函数在类的内部声明格式如下:
friend type operator@(参数表)
定义友元运算符函数格式如下:
type operator@(参数表)
{ //函数体
}
与成员运算符函数不同,友元运算符函数是不属于任何类对象的,它没有this指针。若重载的是双目运算符,则参数表中有两个操作数;若重载的是单目运算符,则参数表中只有一个操作数。 不能用友元函数重载的运算符是=、()、[]、-〉,其余的运算符都可以使用友元函数来实现重载。
运算符函数调用形式如下表:
运算符函数调用形式
习惯形式 友元运算符函数调用形式 成员运算符函数调用形式
a+b operator(a,b) a.ope......余下全文>>问题六:C#类的多态性指的是什么? 没法实例化,那个是内部类,得定义为publ丁c才行,而且这个跟多态没关系。
改成:
public class m就可以了
实例化代码如下:
pt.m pm = new pt.m();问题七:java中多态是什么意思? 多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。
多态有两种表现形式:重载和覆盖
首先说重载(overload),是发生在同一类中。与什么父类子类、继承毫无关系。
标识一个函数除了函数名外,还有函数的参数(个数和类型)。也就是说,一个类中可以有两个或更多的函数,叫同一个名字而他们的参数不同。
他们之间毫无关系,是不同的函数,只是可能他们的功能类似,所以才命名一样,增加可读性,仅此而已!再说覆盖(override),是发生在子类中!也就是说必须有继承的情况下才有覆盖发生。我们知道继承一个类,也就有了父类了全部方法,如果你感到哪个方法不爽,功能要变,那就把那个函数在子类中重新实现一遍。
这样再调用这个方法的时候,就是执行子类中的过程了。父类中的函数就被覆盖了。(当然,覆盖的时候函数名和参数要和父类中完全一样,不然你的方法对父类中的方法就不起任何作用,因为两者是两个函数,毫不关系)问题八:java的多态怎么理解啊,多态有什么用途。 多态有编译时多态 和运行时多态。
第一个是通过方法重载实现;第二个是通过方法覆盖实现(子类覆盖父类方法)。
第一种就是我们调用方法是不用区分参数类型,程序会自动执行相应方法,如: 加法运算,可以使int相加,可以是double相加,都是同一个方法名。
第二种就是动态绑定,使用父类引用指向子类对象,再调用某一父类中的方法时,不同子类会表现出不同结果。 这样的作用就是扩展性极好,玩过网游的话应该知道 游戏中有不同的角色,它们都有一个父类,它们做相同动作时表现出来的效果就会不一样,比如跑,魔法师的跑跟战士的跑就不会一样,这就是俩者都覆盖了父类中的跑方法,各自有自己的现实,表现出来多态。 如果有一天你想再加个角色,只用再写一个类继承该父类,覆盖其中的跑方法就行了,其他代码不用怎么改,所以可维护性也很好。
这一个小的程序 或许你体会不到多态的强度作用。其实说到多态就是 面向接口编程,它不和具体类尽心挂钩了
比如 你没用多态的话 ,
你没实例化一个对象 就要new一下,那假如你那天改变了需求了呢?那是不是又要改里面的?这样不好,所以 你可以通过多态,把需要相似的给提出来,然后继承它 这样 以后需要扩展你仅仅只是继承而已。这样就很简单。
这个需要多看代码 才可以更深刻理解。
有问题在讨论。问题九:对象的多态性到底有什么用? 通俗点,比如:笔类有三个子类:毛笔、钢笔、铅笔,他们有方法:使用前准备()这个方法, 毛笔的方法执行:蘸墨 钢笔执行:吸墨 铅笔执行:削铅笔
这样你可以在写字这个类里写:笔 对象 = 对象.使用前准备()。
这样你的这个类就抽象出来了。将来你再多了一个沾水钢笔就可以在沾水钢笔里修改属性为:蘸墨水 而不用进入写字类再加上一个笔的子类判断。
明白不?
你问这个问题说明你没有理解面向对象。还要继续努力。
____________________________________________________
看见了你的补充,说的不完全对,但是好想你明白一些了。
其实不是为了以后的变更,而是为了更通用。
例如:写字(写信)等等这个对象不应该与笔这个对象之间建立强耦合,否则将来发明了新的笔,你就都要去修改写字这个类,但是如何具体些是笔的写这个方法应该说明的,所以将两个类抽象出来,这样,你的类可以给任意的其他人去使用,以后因为变更而扩展是用途之一。问题十:C++中 继承与多态区别 继承是指,子类可以自动获得父类提供的函数,如父类提供了foo函数,则子类也会有foo函数
多态是指,子类可以重写父类的某个函数,从而为这个函数提供不同于父类的行为。一个父类的多个子类可以为同一个函数提供不同的实现,从而在父类这个公共的接口下,表现出多种行为
当然,以上的自动获得和重写,还存在一个访问级别的概念。比如public的函数或者protected的函数才能被重写这类的限制。
全部回答
这个问题的回答的对
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
明明的反义词
现在4s能降级吗?
王泽龙什么歌好听
如果字母A代表一个自然数(A不为0),那么下
高考美术考什么?
单选题真理标准问题讨论的主要内容是关于A.平
如图所示是同一只鸡蛋在甲、乙两液体中的状态
Supermassive Black Hole 中文歌词
委托书拍照片有用吗,不承认怎么办
葡萄怎么洗最干净
包头市固阳县地税局办公位置在哪啊?好找么?
康美盛铝材在哪里啊,我有事要去这个地方
苏州吴中区尹山湖地铁站属于什么街道
士军几又念什么字
包头市土默特右旗地税局位置在什么地方啊,我
推荐资讯
费县质量技术监督局地址在什么地方?想过去办
建冷库需要什么手续
IBC是什么包装
笔记本怎么删除软件
JJ游戏里金币怎样兑换秋卡
福州去平潭。去哪个车站坐车。多少钱吖?
苏州出入境检验检疫局(苏惠路)在什么地方啊,
Don’t lose heart; difficulties you are f
请问咸鸡蛋如何阉制???
如果两个人相爱准备结婚,因为一方家长死活不
单选题Wecancommunicate________others_
企业的核心竞争力是什么?
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?