仓酷云
标题:
JAVA网页设计Thinking:Java中static、this、super、...
[打印本页]
作者:
逍遥一派
时间:
2015-1-18 11:47
标题:
JAVA网页设计Thinking:Java中static、this、super、...
C++编译的是本地码,优点是启动快,而且可以精确控制资源因此可以开发很高效的程序.缺点是编程麻烦,而且容易留下安全隐患.跨平台靠源代码在各个平台间分别编译(一处编写到处编译)
Thinking:Java中static、this、super、final用法
本篇旨在匡助筹办进修Java和刚打仗Java的伴侣熟悉、把握和利用static、this、super、final这几个关头字的利用。Java胸无点墨,我也是一名正在进修和利用Java的喜好者,文中不免有不当的地方,接待斧正。
1、static
请先看上面这段程序:
publicclassHello{publicstaticvoidmain(String[]args){//(1)System.out.println("Hello,world!");//(2)}}
看过这段程序,关于年夜多半学过Java的历来说,都不生疏。即便没有学过Java,而学过别的的初级言语,比方C,那你也应当能看懂这段代码的意义。它只是复杂的输入“Hello,world”,一点其余用途都没有,但是,它却展现了static关头字的次要用法。
在1处,我们界说了一个静态的办法名为main,这就意味着告知Java编译器,我这个办法不必要创立一个此类的对象便可利用。你还得你是怎样运转这个程序吗?一样平常,我们都是在命令行下,打进以下的命令(加下划线为手动输出):
javacHello.javajavaHelloHello,world!
这就是你运转的历程,第一行用来编译Hello.java这个文件,实行完后,假如你检察以后,会发明多了一个Hello.class文件,那就是第一行发生的Java二进制字节码。第二行就是实行一个Java程序的最广泛做法。实行了局如你所料。在2中,你大概会想,为何要如许才干输入。好,我们来分化一下这条语句。(假如没有安装Java文档,请到Sun的官方网站扫瞄J2SEAPI)起首,System是位于java.lang包中的一个中心类,假如你检察它的界说,你会发明有如许一行:publicstaticfinalPrintStreamout;接着在进一步,点击PrintStream这个超链接,在METHOD页面,你会看到大批界说的办法,查找println,会有如许一行:
publicvoidprintln(Stringx)。
好了,如今你应当分明为何我们要那样挪用了,out是System的一个静态变量,以是能够间接利用,而out所属的类有一个println办法。
静态办法
一般,在一个类中界说一个办法为static,那就是说,无需本类的对象便可挪用此办法。以下所示:
classSimple{staticvoidgo(){System.out.println("Go...");}}publicclassCal{publicstaticvoidmain(String[]args){Simple.go();}}
挪用一个静态办法就是“类名.办法名”,静态办法的利用很复杂如上所示。一样平常来讲,静态办法经常为使用程序中的别的类供应一些有用工具所用,在Java的类库中大批的静态办法恰是出于此目标而界说的。
静态变量
静态变量与静态办法相似。一切此类实例共享此静态变量,也就是说在类装载时,只分派一块存储空间,一切此类的对象都能够操控此块存储空间,固然关于final则另当别论了。看上面这段代码:
classValue{staticintc=0;staticvoidinc(){c++;}}classCount{publicstaticvoidprt(Strings){System.out.println(s);}publicstaticvoidmain(String[]args){Valuev1,v2;v1=newValue();v2=newValue();prt("v1.c="+v1.c+"v2.c="+v2.c);v1.inc();prt("v1.c="+v1.c+"v2.c="+v2.c);}}
了局以下:
v1.c=0v2.c=0v1.c=1v2.c=1
由此能够证实它们共享一块存储区。static变量有点相似于C中的全局变量的观点。值得切磋的是静态变量的初始化成绩。我们修正下面的程序:
classValue{staticintc=0;Value(){c=15;}Value(inti){c=i;}staticvoidinc(){c++;}}classCount{publicstaticvoidprt(Strings){System.out.println(s);}Valuev=newValue(10);staticValuev1,v2;static{prt("v1.c="+v1.c+"v2.c="+v2.c);v1=newValue(27);prt("v1.c="+v1.c+"v2.c="+v2.c);v2=newValue(15);prt("v1.c="+v1.c+"v2.c="+v2.c);}
publicstaticvoidmain(String[]args){Countct=newCount();prt("ct.c="+ct.v.c);prt("v1.c="+v1.c+"v2.c="+v2.c);v1.inc();prt("v1.c="+v1.c+"v2.c="+v2.c);prt("ct.c="+ct.v.c);}}
运转了局以下:
v1.c=0v2.c=0v1.c=27v2.c=27v1.c=15v2.c=15ct.c=10v1.c=10v2.c=10v1.c=11v2.c=11ct.c=11
这个程序展现了静态初始化的各类特征。假如你初度打仗Java,了局大概令你受惊。大概会对static后加年夜括号感应狐疑。起首要告知你的是,static界说的变量会优先于任何别的非static变量,不管其呈现的按次怎样。正如在程序中所体现的,固然v呈现在v1和v2的后面,可是了局倒是v1和v2的初始化在v的后面。在static{前面随着一段代码,这是用来举行显式的静态变量初始化,这段代码只会初始化一次,且在类被第一次装载时。假如你能读懂并了解这段代码,会匡助你对static关头字的熟悉。在触及到承继的时分,会先初始化父类的static变量,然后是子类的,顺次类推。非静态变量不是本文的主题,在此不做具体会商,请参考ThinkinJava中的解说。
静态类
一般一个一般类不同意声明为静态的,只要一个外部类才能够。这时候这个声明为静态的外部类能够间接作为一个一般类来利用,而不需实例一个内部类。以下代码所示:
publicclassStaticCls{publicstaticvoidmain(String[]args){OuterCls.InnerClsoi=newOuterCls.InnerCls();}}classOuterCls{publicstaticclassInnerCls{InnerCls(){System.out.println("InnerCls");}}}
输入了局会如你所料:
InnerCls
和一般类一样。外部类的别的用法请参阅ThinkinJava中的相干章节,此处不作详解。
2、this&super
在上一篇拙作中,我们会商了static的各种用法,经由过程用static来界说办法或成员,为我们编程供应了某种便当,从某种水平上能够说它相似于C言语中的全局函数和全局变量。可是,并非说有了这类便当,你即可以到处利用,假如那样的话,你便必要仔细思索一下本人是不是在用面向对象的头脑编程,本人的程序是不是是面向对象的。好了,如今入手下手会商this&super这两个关头字的意义和用法。
在Java中,this一般指以后对象,super则指父类的。当你想要援用以后对象的某种工具,好比以后对象的某个办法,或以后对象的某个成员,你即可以使用this来完成这个目标,固然,this的另外一个用处是挪用以后对象的另外一个机关函数,这些即刻就要会商。假如你想援用父类的某种工具,则非super莫属。因为this与super有云云类似的一些特征和与生俱来的某种干系,以是我们在这一起来会商,但愿能匡助你辨别和把握它们两个。
在一样平常办法中
最广泛的情形就是,在你的办法中的某个形参名与以后对象的某个成员有不异的名字,这时候为了不至于搅浑,你便必要明白利用this关头字来指明你要利用某个成员,利用办法是“this.成员名”,而不带this的谁人即是形参。别的,还能够用“this.办法名”来援用以后对象的某个办法,但这时候this就不是必需的了,你能够间接用办法名来会见谁人办法,编译器会晓得你要挪用的是那一个。上面的代码演示了下面的用法:
publicclassDemoThis{privateStringname;privateintage;DemoThis(Stringname,intage){setName(name);//你能够加上this来挪用办法,像如许:this.setName(name);但这并非必需的setAge(age);this.print();}publicvoidsetName(Stringname){this.name=name;//此处必需指明你要援用成员变量}publicvoidsetAge(intage){this.age=age;}publicvoidprint(){System.out.println("Name="+name+"Age="+age);//在此行中其实不必要用this,由于没有会招致搅浑的工具}publicstaticvoidmain(String[]args){DemoThisdt=newDemoThis("Kevin","22");}}
这段代码很复杂,不必注释你也应当能看分明。在机关函数中你看到用this.print(),你完整能够用print()来取代它,二者效果一样。上面我们修正这个程序,来演示super的用法。
classPerson{publicintc;privateStringname;privateintage;protectedvoidsetName(Stringname){this.name=name;}protectedvoidsetAge(intage){this.age=age;}protectedvoidprint(){System.out.println("Name="+name+"Age="+age);}}publicclassDemoSuperextendsPerson{publicvoidprint(){System.out.println("DemoSuper:");super.print();}publicstaticvoidmain(String[]args){DemoSuperds=newDemoSuper();ds.setName("kevin");ds.setAge(22);ds.print();}}
在DemoSuper中,从头界说的print办法覆写了父类的print办法,它起首做一些本人的事变,然后挪用父类的谁人被覆写了的办法。输入了局申明了这一点:
DemoSuper:Name=kevinAge=22
如许的利用办法是对照经常使用的。别的假如父类的成员能够被子类会见,那你能够像利用this一样利用它,用“super.父类中的成员名”的体例,但经常你并非如许来会见父类中的成员名的。
在机关函数中
机关函数是一种特别的办法,在对象初始化的时分主动挪用。在机关函数中,this和super也有下面说的各种利用体例,而且它另有特别的中央,请看上面的例子:
classPerson{publicstaticvoidprt(Strings){System.out.println(s);}Person(){prt("APerson.");}Person(Stringname){prt("Apersonnameis:"+name);}}publicclassChineseextendsPerson{Chinese(){super();//挪用父类机关函数(1)prt("Achinese.");//(4)}Chinese(Stringname){super(name);//挪用父类具有不异形参的机关函数(2)prt("hisnameis:"+name);}Chinese(Stringname,intage){this(name);//挪用以后具有不异形参的机关函数(3)prt("hisageis:"+age);}publicstaticvoidmain(String[]args){Chinesecn=newChinese();cn=newChinese("kevin");cn=newChinese("kevin",22);}}
在这段程序中,this和super不再是像之前那样用“.”毗连一个办法或成员,而是间接在厥后跟上得当的参数,因而它的意义也就有了变更。super后加参数的是用来挪用父类中具有不异情势的机关函数,如1和2处。this后加参数则挪用的是以后具有不异参数的机关函数,如3处。固然,在Chinese的各个重载机关函数中,this和super在一样平常办法中的各类用法也仍可以使用,好比4处,你能够将它交换为“this.prt”(由于它承继了父类中的谁人办法)大概是“super.prt”(由于它是父类中的办法且可被子类会见),它还是能够准确运转。但如许仿佛就有点多此一举的滋味了。
最初,写了这么多,假如你能对“this一般指代以后对象,super一般指代父类”这句话切记在心,那末本篇便到达了目标,别的的你自会在今后的编程理论傍边渐渐体味、把握。别的关于本篇中提到的承继,请参阅相干Java教程。
3、final
final在Java中其实不经常使用,但是它却为我们供应了诸如在C言语中界说常量的功效,不但云云,final还可让你把持你的成员、办法大概是一个类是不是可被覆写或承继等功效,这些特性使final在Java中具有了一个不成或缺的位置,也是进修Java时必需要晓得和把握的关头字之一。
final成员
当你在类中界说变量时,在其后面加上final关头字,那即是说,这个变量一旦被初始化便不成改动,这里不成改动的意义对基础范例来讲是其值不成变,而关于对象变量来讲其援用不成再变。其初始化能够在两个中央,一是其界说处,也就是说在final变量界说时间接给其赋值,二是在机关函数中。这两个中央只能选其一,要末在界说时给值,要末在机关函数中给值,不克不及同时既在界说时给了值,又在机关函数中给别的的值。上面这段代码演示了这一点:
importjava.util.List;importjava.util.ArrayList;importjava.util.LinkedList;publicclassBat{finalPI=3.14;//在界说时便给址值finalinti;//由于要在机关函数中举行初始化,以是此处便不成再给值finalListlist;//此变量也与下面的一样Bat(){i=100;list=newLinkedList();}Bat(intii,Listl){i=ii;list=l;}publicstaticvoidmain(String[]args){Batb=newBat();b.list.add(newBat());//b.i=25;//b.list=newArrayList();System.out.println("I="+b.i+"ListType:"+b.list.getClass());b=newBat(23,newArrayList());b.list.add(newBat());System.out.println("I="+b.i+"ListType:"+b.list.getClass());}}
此程序很复杂的演示了final的惯例用法。在这里利用在机关函数中举行初始化的办法,这使你有了一点天真性。如Bat的两个重载机关函数所示,第一个缺省机关函数会为你供应默许的值,重载的谁人机关函数会依据你所供应的值或范例为final变量初始化。但是偶然你其实不必要这类天真性,你只必要在界说时便给定其值并永稳定化,这时候就不要再用这类办法。在main办法中有两行语句正文失落了,假如你往失落正文,程序便没法经由过程编译,这即是说,不管是i的值或是list的范例,一旦初始化,的确没法再变动。但是b能够经由过程从头初始化来指定i的值或list的范例,输入了局中显现了这一点:
I=100ListType:classjava.util.LinkedListI=23ListType:classjava.util.ArrayList
另有一种用法是界说办法中的参数为final,关于基础范例的变量,如许做并没有甚么实践意义,由于基础范例的变量在挪用办法时是传值的,也就是说你能够在办法中变动这个参数变量而不会影响到挪用语句,但是关于对象变量,却显得很有用,由于对象变量在传送时是传送其援用,如许你在办法中对对象变量的修正也会影响到挪用语句中的对象变量,当你在办法中不必要改动作为参数的对象变量时,明白利用final举行声明,会避免你偶然的修正而影响到挪用办法。别的办法中的外部类在用到办法中的参变量时,此参变也必需声明为final才可以使用,以下代码所示:
publicclassINClass{voidinnerClass(finalStringstr){classIClass{IClass(){System.out.println(str);}}IClassic=newIClass();}publicstaticvoidmain(String[]args){INClassinc=newINClass();inc.innerClass("Hello");}}
final办法
将办法声明为final,那就申明你已晓得这个办法供应的功效已满意你请求,不必要举行扩大,而且也不同意任何今后类承继的类来覆写这个办法,可是承继仍旧能够承继这个办法,也就是说能够间接利用。别的有一种被称为inline的机制,它会使你在挪用final办法时,间接将办法主体拔出到挪用处,而不是举行例行的办法挪用,比方保留断点,压栈等,如许大概会使你的程序效力有所进步,但是当你的办法主体十分复杂时,或你在多处挪用此办法,那末你的挪用主体代码便会敏捷收缩,大概反而会影响效力,以是你要慎用final举行办法界说。
final类
当你将final用于类身上时,你就必要细心思索,由于一个final类是没法被任何人承继的,那也就意味着此类在一个承继树中是一个叶子类,而且此类的计划已被以为很完善而不必要举行修正或扩大。关于final类中的成员,你能够界说其为final,也能够不是final。而关于办法,因为所属类为final的干系,天然也就成了final型的。你也能够明白的给final类中的办法加上一个final,但这明显没成心义。
上面的程序演示了final办法和final类的用法:
finalclassfinal{finalStringstr="finalData";publicStringstr1="nonfinaldata";finalpublicvoidprint(){System.out.println("finalmethod.");}publicvoidwhat(){System.out.println(str+"
"+str1);}}publicclassFinalDemo{//extendsfinal没法承继publicstaticvoidmain(String[]args){finalf=newfinal();f.what();f.print();}}
从程序中能够看出,final类与一般类的利用几近没有不同,只是它得到了被承继的特征。final办法与非final办法的区分也很难从程序行看出,只是记着慎用。
final在计划形式中的使用
在计划形式中有一种形式叫做稳定形式,在Java中经由过程final关头字能够很简单的完成这个形式,在解说final成员时用到的程序Bat.java就是一个稳定形式的例子。假如你对此感乐趣,能够参考阎宏博士编写的《Java与形式》一书中的解说。
到此为止,this,static,supert和final的利用已说完了,假如你对这四个关头字已可以大抵说出它们的区分与用法,那便申明你基础已把握。但是,天下上的任何工具都不是十全十美的,Java供应这四个关头字,给程序员的编程带来了很年夜的便当,但并非说要让你各处利用,一旦到达滥用的程序,便拔苗助长,以是在利用时请必定要仔细思索。
有了这样一个呼声:让java代替C语言成为基本语言。这些足以说明java简单易学的这个优点。其次,java的功能强大,前面我也提到了,EJB3.0的推出使java成为了大型项目的首选。
作者:
兰色精灵
时间:
2015-1-20 15:59
是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能
作者:
愤怒的大鸟
时间:
2015-1-29 12:48
吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧
作者:
老尸
时间:
2015-2-6 00:58
学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。
作者:
金色的骷髅
时间:
2015-2-6 08:15
Java 编程语言的风格十分接近C、C++语言。
作者:
海妖
时间:
2015-2-15 18:46
Java自面世后就非常流行,发展迅速,对C++语言形成了有力冲击。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台
作者:
蒙在股里
时间:
2015-2-26 05:36
你快去找一份Java的编程工作来做吧(如果是在校学生可以去做兼职啊),在实践中提高自己,那才是最快的。不过你得祈祷在公司里碰到一个高手,而且他 还愿意不厌其烦地教你,这样好象有点难哦!还有一个办法就是读开放源码的程序了。我们知道开放源码大都出自高手,他们设计合理,考虑周到,再加上有广大的程序员参与,代码的价值自然是字字珠叽,铿锵有力(对不起,偶最近《金装四大才子》看多了)。
作者:
深爱那片海
时间:
2015-3-8 12:12
所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。
作者:
若相依
时间:
2015-3-12 11:39
让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。
作者:
小魔女
时间:
2015-3-17 07:09
是一种使网页(Web Page)产生生动活泼画面的语言
作者:
透明
时间:
2015-3-17 10:08
是一种使用者不需花费很多时间学习的语言
作者:
莫相离
时间:
2015-3-24 06:16
你可以去承接一些项目做了,一开始可能有些困难,可是你有技术积累,又考虑周全,接下项目来可以迅速作完,相信大家以后都会来找你的,所以Money就哗啦啦的。。。。。。
作者:
简单生活
时间:
2015-3-25 22:26
J2SE开发桌面应用软件比起 VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。
作者:
灵魂腐蚀
时间:
2015-4-1 08:08
J2SE开发桌面应用软件比起 VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。
作者:
精灵巫婆
时间:
2015-4-4 14:21
多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。
作者:
不帅
时间:
2015-4-5 04:18
你现在最缺的是实际的工作经验,而不是书本上那些凭空想出来的程序。
作者:
admin
时间:
2015-4-11 00:11
Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站
作者:
飘灵儿
时间:
2015-4-14 07:10
接着就是EJB了,EJB就是Enterprise JavaBean, 看名字好象它是Javabean,可是它和Javabean还是有区别的。它是一个体系结构,你可以搭建更安全、更稳定的企业应用。它的大量代码已由中间件(也就是我们常听到的 Weblogic,Websphere这些J2EE服务器)完成了,所以我们要做的程序代码量很少,大部分工作都在设计和配置中间件上。
作者:
再见西城
时间:
2015-4-16 02:11
Java 编程语言的风格十分接近C、C++语言。
作者:
飘飘悠悠
时间:
2015-4-20 04:01
学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。
欢迎光临 仓酷云 (http://ckuyun.com/)
Powered by Discuz! X3.2