仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1924|回复: 20
打印 上一主题 下一主题

[学习教程] JAVA编程:java进修条记7--Polymorphism

[复制链接]
灵魂腐蚀 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:41:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
他们对jsp,servlet,javabean进行封装就是为了展示他们的某个思想,与java的开发并没有必然的关系,也不见得在所以情况下,别人使用起来会简单。条记Polymorphism
多态(polymorphism)也被称为静态绑定『dynamicbinding』、后绑定『latebinding』或运转时绑定『run-timebingding』。
它的意义是要在程序运转的时分,依据对象的范例来决意该绑定哪一个办法。多态性是继数据笼统和承继以后的,面向对象的编程言语的第三个基础特征。

绑定(binding):将办法的挪用连到办法自己
前绑定(earlybinding):当绑定产生在程序运转之前时(就是由编译器或毗连器卖力)
后绑定(latebinding):在程序运转的时分,依据对象的范例来决意该绑定哪一个办法。

“封装”(encapsulation)经由过程将数据的特性(characteristics)与举动(behavior)分离在一同,创立了一种新的数据范例。
“埋没完成”(Implementationhiding)经由过程将细节设成private,完成了接口与完成的分别。
“多态性”是站在“class”的角度来处置这类逻辑上的分别的。


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



Shapes=newCircle();//upcasting:将Circle对象upcast为Shape范例
s.draw();

Upcast(上传)就是把对象的reference看成基类的reference来用.(注:java外部是晓得对象属于甚么范例的)
由于Derivedclassisatypeofbaseclass,以是基类的reference(Shapes)能承受派生类(circle)的对象

upcast今后,基类reference挪用的都是基类本人的method(latebinding),
除非这个method是late-bound的,也就是派生类覆写(override)了这个method,才会依据对象范例选择响应的method(多态性).

以下面的代码为例:s是Shape范例的reference,除非draw()是一个静态绑定的method(派生类circle覆写了这个draw()),
s.draw()才会挪用cicle的draw(),不然挪用的都是基类Shape本人的method

private和final的method城市接纳early-binding,由于他们是不克不及被override的。(注:private办法主动就是final的)

倡议别用基类的privatemethod的名字往定名派生类的method。由于如许会让人误觉得会override这个method,
实践上private主动就是final的,不克不及被override。


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

override(覆写)暗示在派生类里写一个"一样"的method。就是从头写一遍这个method
(注:1."一样"暗示:同名且参数列表和前往值也不异。2.method必需长短final,非private的(private办法主动就是final的))
overload:除"一样"的method(即override)之外的同名method.


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


当你想要经由过程一个大众的接口来操控一组类的时分,就能够利用笼统类了。经由过程静态绑定机制,那些切合办法特性的派生类办法将会失掉挪用。
abstractclass{}
笼统类的办法可使abstract的,也能够长短abstract。派生类承继了一个abstract类,那他要末完成一切的abstract的method,要末把本人也酿成abstract的。


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



//:c07:PolyConstructors.java
//Constructorsandpolymorphism
//dontproducewhatyoumightexpect.
importcom.bruceeckel.simpletest.*;
abstractclassGlyph{
abstractvoiddraw();
Glyph(){
System.out.println("Glyph()beforedraw()");
draw();//假如你new一个派生类对象,而且在基类机关函数内里挪用了静态绑定的办法,
//那末它会利用谁人派生类覆写后的版本。
System.out.println("Glyph()afterdraw()");
}
}
classRoundGlyphextendsGlyph{
privateintradius=1;
RoundGlyph(intr){
radius=r;
System.out.println(
"RoundGlyph.RoundGlyph(),radius="+radius);
}
voiddraw(){
System.out.println(
"RoundGlyph.draw(),radius="+radius);
}
}
publicclassPolyConstructors{
privatestaticTestmonitor=newTest();
publicstaticvoidmain(String[]args){
newRoundGlyph(5);
monitor.expect(newString[]{
"Glyph()beforedraw()",
"RoundGlyph.draw(),radius=0",
"Glyph()afterdraw()",
"RoundGlyph.RoundGlyph(),radius=5"
});
}
}///:~
假如你new一个派生类对象,而且在基类机关函数内里挪用了静态绑定的办法,那末它会利用谁人派生类覆写后的版本。

真实的初始化历程是如许的:
1.在举行别的事情之前,分派给这个对象的内存会先被初始化为两进制的零。
2.正如后面一向在所说的,先挪用基类的机关函数。这时候会挪用被覆写的draw()办法(是的,在挪用RoundGlyph的机关函数之前挪用),
这时候它发明,因为受第一步的影响,radius的值仍是零。
3.数据成员依照它们声明的按次举行初始化。
4.挪用派生类的机关函数的注释。


一个好的机关函数应当:用起码的事情量把对象的形态(fields)设置好,并且要尽量地制止往挪用办法。
机关函数独一能平安挪用的办法,就是基类的final/private办法。它们不会被覆写,因而也不会发生这类不测的举动。


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

一旦了解了多态性,你就会以为一切工具应当都是承继上去的,由于多态性其实是太伶俐了。可是如许做会减轻计划的包袱。
实践上,假如你一碰到“要用已有的类来创立新类”的情形就想到要用承继的话,事变就会毫无需要地变得庞大起来了。
较好的举措仍是先思索分解,出格是当你不晓得该承继哪一个类的时分。分解其实不强求你把计划弄成一个类系。
别的它还更天真,由于利用分解的时分,你能够静态地选择成员的范例(和它们的举动),而利用承继的话,
就得在编译时指明对象切实其实切范例。上面这段程序就演示了这一点:

//:c07:Transmogrify.java
//Dynamicallychangingthebehaviorofanobject
//viacomposition(the"State"designpattern).
importcom.bruceeckel.simpletest.*;
abstractclassActor{
publicabstractvoidact();
}
classHappyActorextendsActor{
publicvoidact(){
System.out.println("HappyActor");
}
}
classSadActorextendsActor{
publicvoidact(){
System.out.println("SadActor");
}
}
classStage{
privateActoractor=newHappyActor();
publicvoidchange(){actor=newSadActor();}
publicvoidperformPlay(){actor.act();}
}
publicclassTransmogrify{
privatestaticTestmonitor=newTest();
publicstaticvoidmain(String[]args){
Stagestage=newStage();
stage.performPlay();
stage.change();
stage.performPlay();
monitor.expect(newString[]{
"HappyActor",
"SadActor"
});
}
}///:~

有一条一样平常原则“利用承继来暗示举动的分歧,而用成员数据来暗示形态的分歧”。上述例程同时表现这二者;两个派生类用来暗示act()办法的分歧,
而Stage则利用分解来暗示形态的变更。在这类情形下,形态的分歧会招致举动的分歧。


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

下传(Downcast):把基类从头转回详细的派生类范例,使得reference能够挪用派生类的extended接口

Java范例传送都要经由反省!以是,只管看上往只是用一对括号作了些一般的的范例转换,可是运转的时分,体系会对这些转换作反省,
以确保它的确是你想要转换的范例。假如不是,你就会失掉一个ClassCastException。这类运转时的范例反省被称为“运转时的范例
判别(run-timetypeidentification缩写为RTTI)”。




但是对于JAVA技术类的学习,我觉得大课堂反而会影响自身独立思考的过程,因为上课的时候,老师讲课的速度很快为了不遗漏要点,通常会仔细的听,
再现理想 该用户已被删除
沙发
发表于 2015-1-21 12:53:55 来自手机 | 只看该作者
是一种由美国SUN计算机公司(Sun Microsystems, Inc.)所研究而成的语言
柔情似水 该用户已被删除
板凳
发表于 2015-1-27 15:32:30 | 只看该作者
一直感觉JAVA很大,很杂,找不到学习方向,前两天在网上找到了这篇文章,感觉不错,给没有方向的我指了一个方向,先不管对不对,做下来再说。
若天明 该用户已被删除
地板
发表于 2015-2-4 20:54:55 | 只看该作者
还好,SUN提供了Javabean可以把你的JSP中的 Java代码封装起来,便于调用也便于重用。
海妖 该用户已被删除
5#
发表于 2015-2-10 09:24:18 | 只看该作者
另外编写和运行Java程序需要JDK(包括JRE),在sun的官方网站上有下载,thinking in java第三版用的JDK版本是1.4,现在流行的版本1.5(sun称作J2SE 5.0,汗),不过听说Bruce的TIJ第四版国外已经出来了,是专门为J2SE 5.0而写的。
乐观 该用户已被删除
6#
发表于 2015-3-1 06:39:52 | 只看该作者
关于设计模式的资料,还是向大家推荐banq的网站 [url]http://www.jdon.com/[/url],他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。
小魔女 该用户已被删除
7#
发表于 2015-3-10 12:51:36 | 只看该作者
科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。
第二个灵魂 该用户已被删除
8#
发表于 2015-3-10 23:56:31 | 只看该作者
一般学编程语言都是从C语开始学的,我也不例外,但还是可能不学过程语言而直接学面向对象语言的,你是刚接触语言,还是从C开始学比较好,基础会很深点,如果你直接学习JAVA也能上手,一般大家在学语言的时候都记一些语言的关键词,常有的包和接口等。再去做逻辑代码的编写,以后的学习过程都是从逻辑代码编写中提升的,所以这方面都是经验积累的。你要开始学习就从
灵魂腐蚀 该用户已被删除
9#
 楼主| 发表于 2015-3-17 16:10:37 | 只看该作者
是一种为 Internet发展的计算机语言
飘灵儿 该用户已被删除
10#
发表于 2015-3-20 20:21:29 | 只看该作者
关于设计模式的资料,还是向大家推荐banq的网站 [url]http://www.jdon.com/[/url],他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。
再见西城 该用户已被删除
11#
发表于 2015-3-30 23:08:44 | 只看该作者
Java 编程语言的风格十分接近C、C++语言。
简单生活 该用户已被删除
12#
发表于 2015-4-1 09:11:39 | 只看该作者
Java是一个纯的面向对象的程序设计语言,它继承了 C++语言面向对象技术的核心。Java舍弃了C ++语言中容易引起错误的指针(以引用取代)、运算符重载(operator overloading)
活着的死人 该用户已被删除
13#
发表于 2015-4-16 05:11:28 | 只看该作者
所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。
14#
发表于 2015-4-20 04:51:38 | 只看该作者
是一种为 Internet发展的计算机语言
爱飞 该用户已被删除
15#
发表于 2015-4-21 15:50:34 | 只看该作者
科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。
兰色精灵 该用户已被删除
16#
发表于 2015-4-27 17:52:06 | 只看该作者
是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能
愤怒的大鸟 该用户已被删除
17#
发表于 2015-5-4 14:09:06 | 只看该作者
是一种使用者不需花费很多时间学习的语言
莫相离 该用户已被删除
18#
发表于 2015-6-6 15:56:34 | 只看该作者
J2SE开发桌面应用软件比起 VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。
山那边是海 该用户已被删除
19#
发表于 2015-6-24 12:52:29 | 只看该作者
让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。
冷月葬花魂 该用户已被删除
20#
发表于 2015-6-27 19:25:48 | 只看该作者
应用在电视机、电话、闹钟、烤面包机等家用电器的控制和通信。由于这些智能化家电的市场需求没有预期的高,Sun公司放弃了该项计划。随着1990年代互联网的发展
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-3 20:34

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表