「java里的多态」Java中什么是多态
本篇文章给大家谈谈java里的多态,以及Java中什么是多态对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
java中的多态
多态包括方法重载和方法重写,说个故事 …… 有点长 …… 可以直接看结论 …… 1.某天, 老板说, 我们的对象都要可以比较! C++程序员写下了 : template typename T T max(const T o1,const T o2);然后为每个类 添加了 operator 操作。 Java程序员写下了 : intetface ICompare { ... } class I_am_exist_with_ONLY_STATIC_METHOD_Because_such_bitch_Java_is_ONLY_OO { public: static ICompare max(ICompare o1,ICompare o2) throw(InvalidArgument) ; }然后每个类去implments 一下。 2.过几天, 老板又说了, 我们的对象, 都要可以串行化! C++程序员写了 : template typename T void Save(const T o,Stream s); void Load(const T o,Stream s);然后为每个类实现了一对 Save 和 Load 的函数。 Java 程序员写了 : interface ISerialize { void Save(Stream s); void Load(Stream s); }然后为每个类去implments 3.然后又过几天, 再过几天 , 然后…… 每个C++类都有许多函数。每个Java类都 implemts 许多interfaces 4. 然后, 老板怒了, 为什么 max 会throw exception ? Java程序员说 …… String 和 Integer 无法比较 …… C++ 程序员笑了: 编译时我就知道了~~ 5.然后, 老板又怒了, 为什么File里面什么都没有? C++程序员 一看代码: std::vector Object v; std::for_each( v.begin() , v.end(), std::bind2nd(ptr_fun(Save), file ) );坏了 …… 截断了 …… Java程序员笑了: 我早就知道这应该(或者说我们从来用的都)是(运行)多态行为。 这就是区别。 generic programming 和 oo的区别。前者依赖的是concepts, 依赖的是 (昨天写过 忘记在哪了 …… 呆会找找 ) (可以直接看10楼, 前面写得很罗嗦…… )后者依赖的是interfaces。 前者的类里面, 更多看到的是 typedef , 相同名字的函数 (push_back, insert ……)因为这就是GP的interfaces —— 在C++GP领域里的专用名词是concepts typedef 和 push_back 没有消耗, 时间或者空间上的 (编译时间如果算的话, 可能还是有点……) 后者的类,就继承自大量的interface。空间上的消耗, 可以C++随便写点什么看看sizeof就知道了, 尤其注意加上 virtual继承后, 编译器塞进去的东西有多大。( 大部分编译器使用的C++的内存模型已经是空间效率与时间效率都非常好的了 —— space : vtbl * classes + vptr *objects , time: O(1) ) 前者的多态仅在编译时, 可以检查出一些不必要的错误(如 int 和string 的比较, 肯定是设计上出了问题), 运行时无多态行为。后者多态在运行时, 有可能会发生一些错误, 以及一点点效率损失。 但是运行多态又是必要的。比如 decorate , 可以处理运行时错综复杂的关系。 编译多态就没辙。 两者各有长处, 完全可以相互取长补短。 故事的最后结局是: C++程序员意识到了错误: 回头看看书 《TC++PL》 “C++是一种通用程序设计语言 …… ” oh yeah!运行多态就运行多态呗, OO就哦哦呗, 咱也行!! struct ISerialize { virtual void Save(Stream s) const = 0; virtual void Load(Stream s) = 0; public: virual ~ISerialize() {} /* virtual 是可选的, 决定于是否需要由ISerialize* 删除对象 , 因为下面写了 boost::shared_ptr 所以必须加上virtual 才能多态删除 */ /* 如果不需要多态删除 */ protected: /// /* non-virtual */ ~ISerialize() {} }然后让每个类实现这个接口。 std::vectorboost::shared_ptrISerialize v; std::for_each( v.begin() , v.end() , std::bind1st( std::mem_fun(ISerialize::Save) , file ) );所有对象都写入文件去了。 老板很高兴。 Java程序员盯着满屏幕的 exceptions ……
java中多态的定义是什么?
多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。
多态有两种表现形式:重载和覆盖
首先说重载(overload),是发生在同一类中。与什么父类子类、继承毫无关系。
标识一个函数除了函数名外,还有函数的参数(个数和类型)。也就是说,一个类中可以有两个或更多的函数,叫同一个名字而他们的参数不同。
他们之间毫无关系,是不同的函数,只是可能他们的功能类似,所以才命名一样,增加可读性,仅此而已!
再说覆盖(override),是发生在子类中!也就是说必须有继承的情况下才有覆盖发生。
我们知道继承一个类,也就有了父类了全部方法,如果你感到哪个方法不爽,功能要变,那就把那个函数在子类中重新实现一遍。
这样再调用这个方法的时候,就是执行子类中的过程了。父类中的函数就被覆盖了。(当然,覆盖的时候函数名和参数要和父类中完全一样,不然你的方法对父类中的方法就不起任何作用,因为两者是两个函数,毫不关系)
java的多态怎么实现?
实现多态的三个条件(前提条件,向上转型、向下转型)
1、继承的存在;(继承是多态的基础,没有继承就没有多态)
2、子类重写父类的方法。(多态下会调用子类重写后的方法)
3、父类引用变量指向子类对象。(涉及子类到父类的类型转换)
向上转型 Student person = new Student()
将一个父类的引用指向一个子类对象,成为向上转型,自动进行类型转换。此时通过父类引用变量调用的方法是子类覆盖或继承父类的方法,而不是父类的方法此时通过父类引用变量无法调用子类特有的方法。
向下转型 Student stu = (Student)person;
将一个指向子类对象的引用赋给一个子类的引用,成为向下转型,此时必须进行强制类型转换。向下转型必须转换为父类引用指向的真实子类类型,,否则将出现ClassCastException,不是任意的强制转换
向下转型时可以结合使用instanceof运算符进行强制类型转换,比如出现转换异常---ClassCastException
java中多态是什么意思?
什么是多态
1.面向对象的三大特性:封装、继承、多态。从一定角度来看,封装和继承几乎都是为多态而准备的。这是我们最后一个概念,也是最重要的知识点。
2.多态的定义:指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用)
3.实现多态的技术称为:动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。
4.多态的作用:消除类型之间的耦合关系。
5.现实中,关于多态的例子不胜枚举。
下面是多态存在的三个必要条件,要求大家做梦时都能背出来!
多态存在的三个必要条件
一、要有继承;
二、要有重写;
三、父类引用指向子类对象。
多态的好处:
1.可替换性(substitutability)。多态对已存在代码具有可替换性。例如,多态对圆Circle类工作,对其他任何圆形几何体,如圆环,也同样工作。
2.可扩充性(extensibility)。多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。例如,在实现了圆锥、半圆锥以及半球体的多态基础上,很容易增添球体类的多态性。
3.接口性(interface-ability)。多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。如图8.3 所示。图中超类Shape规定了两个实现多态的接口方法,computeArea()以及computeVolume()。子类,如Circle和Sphere为了实现多态,完善或者覆盖这两个接口方法。
4.灵活性(flexibility)。它在应用中体现了灵活多样的操作,提高了使用效率。
5.简化性(simplicity)。多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。
关于java里的多态和Java中什么是多态的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
发布于:2022-12-05,除非注明,否则均为
原创文章,转载请注明出处。