|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
专门做了这个例子;而java的这个例子好像就是为了教学而写的,很多教学目的的例子是不考虑优化、性能的。举动标准了你能对对象收回的哀求。你的CLASS,也就是对象,也就是MM,你把她计划出来了,并且你很BT,只给她计划了两个举动:爱我()和MAKE爱与我()。那末她便不成能承受别的客户端class(某个帅哥?)的哀求,假如在某个class里,你写成了MM.爱F4(),那末编译器就会堕落。
你天经地义把MM的属性设成美,你不但愿他人来改动这个现实,那末,你就要把这个属性界说为private,如许MM便不会在第二天醒来成为传说中的KL。这在第一章里题目为:被埋没的实行细节。一个属性,有四种润色符,public,private,protected,空(默许,friendly)。分离代表的意义是任何对象能够会见,本对象外部能够会见,本对象(class)的承继者能够会见,统一个包(package)的别的对象能够会见。
我们老是想尽量地让本人的代码变的简便,这便必要反复使用完成码。JAVA供应了这类体例,其路子有两种:组合和承继,假定有一个类为A,A有一个举动doSomething(),另有一个类B,不也想dosomething,那末你能够在B里发生一个办法doSomethingToo(A.doSomething();)。这叫做组合。承继是别的一种办法,你能够间接用关头词extends,让B承继自A,那末你不必特别分外表达,B在外界看来也是有doSomething的才能的。那末我们要问,我们甚么时分要组合,甚么时分用承继呢?BRUCE讲,当BisaA的时分我们用承继。这不太好了解,我们再举个MM的例子。MM具有用饭(eatYou(进食;消化))的举动,MM衍生开来有好色的MM、爱打屁的MM等,但她们都是MM,也就是isa的干系,这个时分你要计划好色的MM的时分就用承继,用extends。而GG不是MM,可是GGislikeaMM,由于GG也能够用饭。这个时分我们就不必再往写eatYou()这个办法了,间接在GG这个类里写eatYou(MM.eatYou();)那末,GG也具有了进食、消化的功效。实在我们要经常用到组合,在程序里,用承继的中央是对照少的。
在承继傍边,有两个特别举动必要我们存眷:覆写(overriding)和重载(overloading)。如今你只需记着:假如baseclass和deriveclass的某个办法称号不异,引数不异,则为覆写(overriding),称号不异,引数不异,则为重载(overloading)。
面向对象一个明显的长处就是多形(多态)性。我原本是不想在这第一部分写代码的,可是仿佛这个成绩用言语表达不敷直不雅,以是就写了个最复杂的能申明多形性的成绩。看代码先。。。
//Love.java
classMM{
publicvoidtoSeeGG(){
System.out.println("xxx");
}
}
classHaoseMMextendsMM{
publicvoidtoSeeGG(){
System.out.println("勾引GG!!!");
}
}
classBenfenMMextendsMM{
publicvoidtoSeeGG(){
System.out.println("好羞怯哦....");
}
}
publicclassLove{
publicstaticvoidloveGG(MMi){
i.toSeeGG();
}
publicstaticvoidmain(String[]args){
MMmm1=newHaoseMM();
MMmm2=newBenfenMM();
loveGG(mm1);
loveGG(mm2);
}
}
该代码运转的了局是:
勾引GG!!!
好羞怯哦....
我们看到由MM衍生出来有好色MM(HaoseMM),天职MM(BenMM),MM们都大概会看到帅哥,可是好色MM和天职MM看帅哥的眼神是纷歧样的,如程序中界说。在爱(Love)这个类里,我们界说一个办法loveGG,我们给它传送一个参数,是基类(baseclass)MM,然后toSeeGG()。经由过程本文最开首的描诉,我们晓得,HaoseMM和BenMM与MM的干系是isa的干系,以是我们在用到loveGG(mm1)和loveGG(mm2)时分编译器不会堕落。我们看到,程序主动各自实行了haoseMM和BenfenMM的toSeeGG(),而不是打印出“xxx”。这就是多形性。之以是会云云奇妙,是由于JAVA运转时情况供应了静态绑定手艺。静态绑定会让你发生的MM在JAVA运转时情况里依照你的唆使分离作出举动。OK,我们不必要晓得静态绑定是怎样运做的,我们只需晓得这是甚么,由于我们还在第一章。上溯外型(upcasting)这个观点也在这里被提出来了。在loveGG(MMi)这个办法里,办法承受的是MM,但是loveGG也承受HaoseMM和BenfenMM,这个特征就叫上溯外型。
我们在下面的程序中看到了一句没有效的代码,就是在MM类里的System.out.println("xxx");。没有人体贴基类MM是怎样看帅哥,由于它只是一个模版,以是我们爽性就不要这句代码,并且我们连{}也不要了,间接改写这个办法为publicabstractvoidtoSeeGG();,那末这个办法称做笼统办法(abstractmethod)。基类MM对我们来讲没有完成的需要,因而我们把classMM{...}改写为abstractclassMM{...},那末这个类叫做笼统类(abstractclass)。我们不由要问,那末笼统类能不克不及含有非笼统的函数呢。答曰:能够。可是这在实践中没有甚么用途,独一用到的中央是:1,main()函数,用来测试你的类;2,测验中。那末我们还要问,子类能够不覆写父类中笼统办法行不可?答曰:假如子类也是abstract,那末能够,不然不可。
比笼统类做的更完全的是接口(注重,这里的接口是JAVA中真正意义的接口,非上文一入手下手的接口,也既举动)。接口被计划出来的目标就是要让你承继的。等………,这是第一章,只让人人晓得一些观点就好了,下面我们说的太多了。
BRUCE是个完全的NN大家,我们接上去看到他把JAVA的低效力成绩说的是那末的天经地义,以致于我们看完后不由自主也要说:
恩,JAVA就应当如许做,让C++见鬼往吧。面向对象,因而一切东东都是对象,有对象便有对象的发生和扑灭。程序运转的时分,对象发生在内存中。内存分派有三种战略,分离是静态的,栈式的(stack),和堆式的(heap)。C++利用前两种战略,JAVA仅利用后者。二者有甚么区分呢?喜好追本溯源的伴侣请参考本站JSP/JAVA分坛的“栈存储(stack)和堆存储(heap)的区分”,我们只需记着,后者在内存中的寻址要花更长的工夫,因而JAVA的效力低。可是JAVA供应了依据heap特性发生的渣滓接纳机制。渣滓接纳机制完成如许的义务,当你的对象不在利用的时分它会主动发觉并没落。你不必再忧虑产生内存保守了。而这是每一个C++程序员最头疼的事变。以是,你选择吧,是要平安仍是要效力。
实在第一章接上去讲的工具关于初学者来讲已其实不主要了,以上你的常识你分明了以后,在接上去的进修上你会轻松良多。我倡议你不要看的那末明晰了。我想我们应当入手下手,即刻进进第二章了。
最后就是我对java的几点希望:首先是IDE工具,有人说java已经很好了,有jbuilder,eclipse,netBeans等等,但是我认为如果java想超越.net,那么他首先要解决的就是IDE工具的整合。 |
|