导航:首页 > 编程语言 > java中多态性

java中多态性

发布时间:2022-05-02 22:12:48

‘壹’ java的多态有什么特点什么地方适合使用多态

多态性是指允许不同子类型的对象对同一消息作出不同的响应。简单的说就是用同样的对象引用调用同样的方法但是做了不同的事情。多态性分为编译时的多态性和运行时的多态性。
如果将对象的方法视为对象向外界提供的服务,那么运行时的多态性可以解释为:当A系统访问B系统提供的服务时,B系统有多种提供服务的方式,但一切对A系统来说都是透明的(就像电动剃须刀是A系统,它的供电系统是B系统,B系统可以使用电池供电或者用交流电,甚至还有可能是太阳能,A系统只会通过B类对象调用供电的方法,但并不知道供电系统的底层实现是什么,究竟通过何种方式获得了动力)。
方法重载(overload)实现的是编译时的多态性(也称为前绑定),而方法重写(override)实现的是运行时的多态性(也称为后绑定)。

‘贰’ 如何理解JAVA的多态性

在面向对象编程中,多态是指一个接口有多种实现方式,即一个接口使用不同实例执行不同的操作。在java中多态有两种表现形式:方法的重载和方法的重写。方法的重载是指同一个类中可以可以存在多个同名的方法,但这些方法的参数必须不同(个数,顺序,类型),程序运行时根据其参数的数量与类型调用对应的方法实现不同的功能。(与返回值类型没有关系)public
void
plant(int
i){方法体;}public
void
plant(String
s){方法体;}方法的重写是指子类提供与父类相同的方法,包括方法的名称,参数列表,返回值类型。 还有可以
父类
变量名=new
子类();

‘叁’ java的多态怎么实现

实现多态的三个条件(前提条件,向上转型、向下转型)
1、继承的存在;(继承是多态的基础,没有继承就没有多态)
2、子类重写父类的方法。(多态下会调用子类重写后的方法)
3、父类引用变量指向子类对象。(涉及子类到父类的类型转换)
向上转型 Student person = new Student()
将一个父类的引用指向一个子类对象,成为向上转型,自动进行类型转换。此时通过父类引用变量调用的方法是子类覆盖或继承父类的方法,而不是父类的方法此时通过父类引用变量无法调用子类特有的方法。
向下转型 Student stu = (Student)person;
将一个指向子类对象的引用赋给一个子类的引用,成为向下转型,此时必须进行强制类型转换。向下转型必须转换为父类引用指向的真实子类类型,,否则将出现ClassCastException,不是任意的强制转换
向下转型时可以结合使用instanceof运算符进行强制类型转换,比如出现转换异常---ClassCastException

‘肆’ java中多态的定义是什么

多态性是指允许不同类的对象对同一消息作出响应,多态性包括参数化多态性和包含多态性,多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。
多态有两种表现形式:重载和覆盖
1、首先说重载(overload),是发生在同一类中,与什么父类子类、继承毫无关系。
标识一个函数除了函数名外,还有函数的参数(个数和类型),也就是说,一个类中可以有两个或更多的函数,叫同一个名字而他们的参数不同。
他们之间毫无关系,是不同的函数,只是可能他们的功能类似,所以才命名一样,增加可读性,仅此而已!
2、再说覆盖(override),是发生在子类中,也就是说必须有继承的情况下才有覆盖发生。
继承一个类,也就有了父类了全部方法,如果你感到哪个方法不爽,功能要变,那就把那个函数在子类中重新实现一遍。
这样再调用这个方法的时候,就是执行子类中的过程了,父类中的函数就被覆盖了。

‘伍’ JAVA中的多态

Java中的多态主要指两方面:
1.方法的重载:根据相同的方法名和不同的参数形式,可以调用功能不同的方法。
2.方法的重写:子类中方法名和参数形式、返回值类型与父类一致,可以实现方法功能的重写。
子类重写的方法同名覆盖了父类中原来的方法,子类对象或上转型对象调用该方法时,调用的是子类中重写的方法。不同的子类中可以分别重写功能不同的方法。
用上转型对象调用该方法时,根据当时所控制的对象类型不同(为上转型对象赋值不同),可以实现不同的方法功能。

‘陆’ 关于java中的对象多态性

程序2报错是因为
Bb=(B)a;这句话。父类给子类赋值。向下转型,所以报错
而程序1没报错是因为Aa=newB();这里初始化的时候发生过向上转型
之后在向下转型所以不会出错
向下转型只有曾经发生过向上转型才可以向下转。
就像你的程序一中的:
Aa=newB();//直接用子类构造实例化父类对象
相当于Bb=newB();
Aa=b;
Bb=(B)a;//如上,只有是从B类型对象转到A类型对象的
这个时候A的对象才能转回来
而向上转型则是子类赋值给父类自动转的。
对象的向上向下转型体现了对象的多态性。
方法的重载和覆写也能说明java的多态性。

‘柒’ 简述java类中多态性的体现形式

多态可分为:
1.编译多态:主要是体现在重载,系统在编译时就能确定调用重载函数的哪个版本。
2.运行多态:主要体现在OO设计的继承性上,子类的对象也是父类的对象,即上溯造型,所以子类对象可以作为父类对象使用,父类的对象变量可以指向子类对象。因此通过一个父类发出的方法调用可能执行的是方法在父类中的实现,也可能是某个子类中的实现,它是由运行时刻具体的对象类型决定的。

‘捌’ 怎么理解JAVA中的多态性

一、基本概念

多态性:发送消息给某个对象,让该对象自行决定响应何种行为。
通过将子类对象引用赋值给超类对象引用变量来实现动态方法调用。

java 的这种机制遵循一个原则:当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。

1. 如果a是类A的一个引用,那么,a可以指向类A的一个实例,或者说指向类A的一个子类。
2. 如果a是接口A的一个引用,那么,a必须指向实现了接口A的一个类的实例。

二、Java多态性实现机制

SUN目前的JVM实现机制,类实例的引用就是指向一个句柄(handle)的指针,这个句柄是一对指针:
一个指针指向一张表格,实际上这个表格也有两个指针(一个指针指向一个包含了对象的方法表,另外一个指向类对象,表明该对象所属的类型);
另一个指针指向一块从java堆中为分配出来内存空间。

The Java Virtual Machine does not require any particular internal structure for objects. In Sun 's current implementation of the Java Virtual Machine, a reference to a class instance is a pointer to a handle that is itself a pair of pointers: one to a table containing the methods of the object and a pointer to the Class object that represents the type of the object, and the other to the memory allocated from the Java heap for the object data. (jvm规范中关于对象内存布局的说明)

三、总结

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中什么叫作多态性

我自己的总结是,多态是将子类对象抽象成父类的引用。我就举一个例子吧:
现在又一个表示动物的类Animal,它还有两个子类,一个表示猫的类Cat,一个表示狗的类Dog。
Animal animal;
Cat cat = new Cat();
Dog dog = new Dog();
那么,将子类对象抽象成父类引用,就是:
animal = cat;或
animal = dog;
猫和狗都是动物,所以这样的赋值是没问题的。
但是如果是cat = animal;就会编译出错,因为动物不一定是猫。

这样的抽象有什么好处呢?假设动物有一个共用的方法,叫睡觉sleep(),但是不同动物睡觉的方式不同,例如:
abstract class Animal{abstract public void sleep();}
class Cat extends Animal{
public void sleep(){// 猫睡觉的动作}
}
class Dog extends Animal{
public void sleep(){// 狗睡觉的动作}
}
现在要设计一些方法,看动物是怎么睡觉的,如果每种动物对应一个方法,那么就需要这样定义:
void displaySleep(Cat cat){cat.sleep();}
void displaySleep(Dog dog){dog.sleep();}
但是,随着动物增多,这样的方法需要越来越多,这样的设计是不合理的。有了多态之后,就可以这样设计了:
void displaySleep(Animal animal){animal.sleep();}
这样一个方法就行了,要看不同动物的睡觉动作,只要这样调用方法就可以了:
displaySleep(new Cat());。

‘拾’ java中多态是什么意思

多态(Polymorphism)按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。引用Charlie Calverts对多态的描述——多态性是允许你将父对象设置成为一个或更多的他的子对象相等的技术,赋值之后,

父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作(摘自“Delphi4编程技术内幕”)。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。多态性在Object Pascal和C++中都是通过虚函数实现的。

多态指同一个实体同时具有多种形式。它是面向对象程序设计(OOP)的一个重要特征。如果一个语言只支持类而不支持多态,只能说明它是基于对象的,而不是面向对象的。C++中的多态性具体体现在运行和编译两个方面。

运行时多态是动态多态,其具体引用的对象在运行时才能确定。编译时多态是静态多态,在编译时就可以确定对象使用的形式。

多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。

C++中,实现多态有以下方法:虚函数,抽象类,覆盖,模板(重载和多态无关)。

OC中的多态:不同对象对同一消息的不同响应.子类可以重写父类的方法

多态就是允许方法重名 参数或返回值可以是父类型传入或返回。


(10)java中多态性扩展阅读:

把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。

赋值之后,父类型的引用就可以根据当前赋值给它的子对象的特性以不同的方式运作。也就是说,父亲的行为像儿子,而不是儿子的行为像父亲。

比如从某个基类派生出多个子类,其基类有一个虚方法Tdoit,然后其子类也有这个方法,但行为不同,然后这些子类对象中的任何一个可以赋给其基类对象的引用,或者说将子对象地址赋给基类指针,这样其基类的对象就可以执行不同的操作了。

实际上你是在通过其基类的引用来访问其子类对象的,你要做的就是一个赋值操作。

使用继承性的结果就是当创建了一个类的家族,在认识这个类的家族时,就是把子类的对象当作基类的对象,这种认识又叫作upcasting(向上转型)。这样认识的重要性在于:我们可以只针对基类写出一段程序,但它可以适应于这个类的家族,

因为编译器会自动找出合适的对象来执行操作。这种现象又称为多态性。而实现多态性的手段又叫称动态绑定(dynamic binding)。

阅读全文

与java中多态性相关的资料

热点内容
职业生涯pdf 浏览:953
ubuntu安装软件php 浏览:158
黑马程序员退学流程 浏览:361
网页服务器崩溃怎么回事 浏览:650
cnc编程前景怎么样 浏览:319
lniux命令详解 浏览:493
linuxmysql查询日志 浏览:368
老捷达伙伴压缩比 浏览:93
改后缀加密 浏览:432
邮局选址问题算法 浏览:14
河北服务器内存云主机 浏览:12
在电脑上怎么找到加密狗图标 浏览:435
电脑的浏览器怎么打开pdf文件怎么打开 浏览:142
pdf卡片库下载 浏览:11
单片机中二进制表示什么 浏览:725
java网络编程推荐 浏览:795
施耐德开关编程 浏览:66
组织胚胎学pdf 浏览:844
linux查看发包 浏览:496
加密货币交易所暴利时代 浏览:824