仓酷云

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

[学习教程] JAVA网页编程之Java中static、this、super、final用法...

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

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

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

x
通过视频学习比传统的大课堂学习更适合成人化的学习规律。有人说大课堂气氛好,学习氛围浓,热闹,可以认识很多人。1、static
  请先看上面这段程序:
publicclassHello{
publicstaticvoidmain(String[]args){//(1)
System.out.println("Hello,world!");//(2)
}
}
  看过这段程序,关于年夜多半学过Java的历来说,都不生疏。即便没有学过Java,而学过别的的初级言语,比方C,那你也应当能看懂这段代码的意义。它只是复杂的输入“Hello,world”,一点其余用途都没有,但是,它却展现了static关头字的次要用法。
  在1处,我们界说了一个静态的办法名为main,这就意味着告知Java编译器,我这个办法不必要创立一个此类的对象便可利用。你还得你是怎样运转这个程序吗?一样平常,我们都是在命令行下,打进以下的命令(加下划线为手动输出):
javacHello.java
javaHello
Hello,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=0
v1.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=0
v1.c=27v2.c=27
v1.c=15v2.c=15
ct.c=10
v1.c=10v2.c=10
v1.c=11v2.c=11
ct.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.LinkedList
I=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供应这四个关头字,给程序员的编程带来了很年夜的便当,但并非说要让你各处利用,一旦到达滥用的程序,便拔苗助长,以是在利用时请必定要仔细思索。
由于这些智能化家电的市场需求没有预期的高,Sun放弃了该项计划。就在Oak几近失败之时,随着互联网的发展,Sun看到了Oak在计算机网络上的广阔应用前景,于是改造了Oak,
兰色精灵 该用户已被删除
沙发
发表于 2015-1-21 13:55:21 | 只看该作者
《JAVA语言程序设计》或《JAVA从入门到精通》这两本书开始学,等你编程有感觉的时候也可以回看一下。《JAVA读书笔记》这本书,因为讲的代码很多,也很容易看懂,涉及到面也到位。是你学习技术巩固的好书,学完后就看看《JAVA编程思想》这本书,找找一个自己写的代码跟书上的代码有什么不一样。
再现理想 该用户已被删除
板凳
发表于 2015-1-30 19:43:41 | 只看该作者
任职于太阳微系统的詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的程序语言
海妖 该用户已被删除
地板
发表于 2015-2-3 11:54:32 | 只看该作者
科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。
只想知道 该用户已被删除
5#
发表于 2015-2-4 20:41:09 | 只看该作者
科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。
分手快乐 该用户已被删除
6#
发表于 2015-2-7 18:21:39 | 只看该作者
那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?当然没那么简单,这只是万里长征走完了第一步。不信?那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧!
山那边是海 该用户已被删除
7#
发表于 2015-2-8 06:04:54 | 只看该作者
是一种语言,用以产生「小应用程序(Applet(s))
乐观 该用户已被删除
8#
发表于 2015-2-18 22:11:17 | 只看该作者
关于设计模式的资料,还是向大家推荐banq的网站 [url]http://www.jdon.com/[/url],他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。
再见西城 该用户已被删除
9#
发表于 2015-3-6 11:05:01 | 只看该作者
Pet Store.(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要 错过了。
若天明 该用户已被删除
10#
发表于 2015-3-13 00:08:34 | 只看该作者
Pet Store.(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要 错过了。
灵魂腐蚀 该用户已被删除
11#
发表于 2015-3-19 08:00:30 | 只看该作者
关于设计模式的资料,还是向大家推荐banq的网站 [url]http://www.jdon.com/[/url],他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。
不帅 该用户已被删除
12#
发表于 2015-3-27 13:09:56 | 只看该作者
J2SE开发桌面应用软件比起 VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。
谁可相欹 该用户已被删除
13#
发表于 2015-3-27 21:13:07 | 只看该作者
所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。
变相怪杰 该用户已被删除
14#
发表于 2015-4-9 02:21:56 | 只看该作者
Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。
因胸联盟 该用户已被删除
15#
发表于 2015-4-9 17:48:45 | 只看该作者
关于设计模式的资料,还是向大家推荐banq的网站 [url]http://www.jdon.com/[/url],他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。
活着的死人 该用户已被删除
16#
发表于 2015-4-10 07:03:53 | 只看该作者
Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。
小妖女 该用户已被删除
17#
发表于 2015-4-10 08:46:28 | 只看该作者
Java自面世后就非常流行,发展迅速,对C++语言形成了有力冲击。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台
冷月葬花魂 该用户已被删除
18#
发表于 2015-4-15 07:15:58 | 只看该作者
应用在电视机、电话、闹钟、烤面包机等家用电器的控制和通信。由于这些智能化家电的市场需求没有预期的高,Sun公司放弃了该项计划。随着1990年代互联网的发展
精灵巫婆 该用户已被删除
19#
发表于 2015-4-22 00:15:34 | 只看该作者
Java是一种计算机编程语言,拥有跨平台、面向对java
若相依 该用户已被删除
20#
发表于 2015-5-6 21:03:33 | 只看该作者
你一定会高兴地说,哈哈,原来成为Java高手就这么简单啊!记得Tomjava也曾碰到过一个项目经理,号称Java很简单,只要三个月就可以学会。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-9-21 04:21

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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