叉叉电子书 > 文学电子书 > Java语言入门 >

第4章

Java语言入门-第4章

小说: Java语言入门 字数: 每页3500字

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!



一个String对象并填充以”newstring”注意我们创建了两个对象。Stirng对象”oldstring”Stirng对象”newstring”在第三条语句里;第一个包括”oldstring”的叫做s的对象已走出了有效范围;没有任何方法可以再访问他;我们现在有一个新的对象也叫s;包含”newstring”。在下一个废品回收线程;前一个对象将被标识并清除。
3。4子类
  子类是利用存在的对象创建一个新对象的机制;比如;如果你有一个Horse类;你可以创建一个Zebra子类;Zebra是Horse的一种。
  classZebraextendsHorse{intnumber_OF_stripes:}关键词extends来定义对象有的子类。Zebra是Horse的子类。Horse类里的所有特征都将拷贝到Zebra类里;而Zebra类里可以定义自己的成员函数和实例变量。Zebra称为Horse的派生类或继承。另外;你也许还想覆盖基类的成员函数。用ClassOne说明;下面是一个派生类覆盖Add_i功能的例子。
importClassOne;publicclassNewClassextendsClassOne{publicvoid
Add_i(intj){i=i+(j/2);}}
  当NewClass类的实例创建时;变量i初始化值为10;但调用Add_i产生不同的结果。NewClassmnc;mnc=newNewClass();mnc。Add_i(10);访问控制Java里当你创建一个新类时;你可以标明变量和成员函数的访问层次。
  publicpublicvoidAnyOneCanAccess(){}public实例变量和成员函数可以任意其它类调用。
  protectedprotectedvoidOnlySubClasses(){}protected实例变量和成员函数只能被其子类调用。
  privateprivateStringCreditCardNumber;private实例变量和成员函数只能在本类里调用。
  friendlyvoidMyPackageMethod(){}缺省的;如果没有定义任何防火控制;实例变量或函数缺省定义成friendly;意味着可以被本包里的任意对象防问;但其它包里的对象不可防问。静态成员函数和变量有?copy;时候;你创建一个类;希望这个类的所有实例都公用一个变量。也就是说;所有这个类的对象都只有实例变量的同一个拷贝。这种方法的关键词是static,例如:classBlock{ staticintnumber=50;}
  所有从Block类创建的对象的number变量值都是相同的。无任在哪个对象里改变了number的值;所有对象的number都跟着改变。同样的;你可以定义static成员函数;但这个成员函数不能访问非static函数和变量。classBlock{staticintnumber=50;intlocalvalue;staticvoidadd_local(){localvalue++;//没有运行}staticvoidadd_static(){number++;//运行}}
3。5this和super
  访问一个类的实例变量时;this关键词是指向这个类本身的指针;在前面ClassOne例子中;我们可以增加构造函数如下:
  publicclassClassOne{inti;publicClassOne(){i=10;}
  publicClassOne(intvalue)this。i=value;}
  publicvoidAdd_i(intj){i=i+j;}}
  这里;this指向ClassOne类的指针。如果在一个子类里覆盖了父类的某个成员函数;但又想调用父类的成员函数;你可以用super关键词指向父类的成员函数。
importClassOne;publicclassNewClassextendsClassOne{publicvoidAdd_i(intj){i=i+(j/2);super。Add_i(j);}}
  下面程序里;i变量被构造函数设成10;然后15,最后被父类(ClassOne)设成25。NewClassmnc;mnc=newNewClass();mnc。Add_i(10);
3。6类的类型
  至今为止;我用在类前面只用了一个public关键词;其实它有下面4种选择:abstract一个abstract类必须至少有一个虚拟函数;一个abstract类不能直接创建对象;必须继承子类后才能。
  final一个final类声明了子类链的结尾;用final声明的类不能再派生子类。publicpublic类能被其它的类访问。在其它包里;如果想使用这个类必须先import;则它只能在它定义的package里使用。synchronicable这个类标识表示所有?copy;类的成员函数都是同步的。
3。7抽象类
  面向对象的一个最大优点就是能够定义怎样使用这个类而不必真正定义好成员函数。如果程序由不同的用户实现时是很有用的,这不需用户使用相同的成员函数名。
  在java里Graphics类里一个abstract类的例子如下:publicabstractclassGraphics{publicabstractvoiddrawLine(intx1;inty1;intx2;inty2);publicabstractvoiddrawOval(intx;inty;intwidth;intheight);publicabstractvoiddrawRect(intx;inty;intwidth;intheight);。。。}
  在Graphics类里声明了几个成员函数;但成员函数的实际代码是在另外一?copy;地方实现的。
  publicclassMyClassextendsGraphics{publicvoiddrawLine(intx1;inty1;intx2;inty2){}}
  当一个类包含一个abstract成员函数;这个类必须定义为abstract类。然而并不是abstract类的所有的成员函数都是abstract的。Abstract类不能有私有成员函数(它们不能被实现);也不能有静态成员函数。
3。8接口
  当你确定多个类的操作方式都很相象时,abstract成员函数是很有用的。但如果你需要使用这?copy;abstract成员函数,必须创建一个新类,这样有时很繁琐。接口提?copy;了一种抽象成员函数的有利方法。一个接口包含了在另一个地方实现的成员函数的收集。成员函数在接口里定义为public和abstract。接口里的实例变量是public;static和final。接口和抽象的主要区别是一个接口提?copy;了封装成员函数协议的方法而不必强迫用户继承类。例子:publicinterfaceAudiClip{//Startplayingtheclip。voidplay();//Playtheclipinaloop。voidloop();//Stopplayingtheclipvoidstop();}
  想使用AudioClip接口的类使用implenents关键词来提?copy;成员函数的程序代码。classMyClassimplementsAudioClip{voidplay(){}voidloop}voidstop}}
  优点一个接口类可以被任意多的类实现,每个类可以共享程序接口而不必关心其它类是怎样实现的。classMyOtherClassimplementsAudioClip{voidstop(){}。。。}内部成员函数Java还提?copy;了调用C和C++函数的方法。用native关键词来定义C和C++的函数。publicclassDate{intnow;publicDate(){now=time();}privatenativeinttime();static{System。loadLibrary(”time”);}}一?copy;Java代码写好后;就需要以下步骤执行:1。用javah来创建头文件(。h)2。用javah来创建stub文件3。用C和C++写native成员函数的代码4。编译stub文件和。C文件成一个动态可加载库5。用java运行java程序或appletviewer运行applet注意:Native成员函数超出了类的范围。
3。9包(Packages)
  包(Package)由一组类(class)和界面(interface)组成。它是管理大型名字空间,避免名字冲突的工具。每一个类和界面的名字都包含在某个包中。按照一般的习惯,它的名字是由”。”号分隔的单词构成,第一个单词通常是开发这个包的组织的名称。
  定义一个编译单元的包编译单元的包由package语句定义。如果使用package语句,编译单元的第一行必须无空格,也无注释。其格式如下:packagepackageName;若编译单元无package语句,则该单元被置于一个缺省的无名的包中。使用其它包中的类和界面在Java语言里提?copy;一个包可以使用另一个包中类和界面的定义和实现的机制。用import关键词来标明来自其它包中的类。一个编译单元可以自动把指定的类和界面输入到它自己的包中。在一个包中的代码可以有两种方式来定义来自其它包中的类和界面:*在每个引用的类和界面前面给出它们所在的包的名字;//前缀包名法acme。project。FooBarobj=newacme。project。FooBar();*使用import语句,引入一个类或一个界面,或包含它们的包。引入的类和界面的名字在当前的名字空间可用。引入一个包时,则该包所有的公有类和界面均可用。其形式如下://从acme。project引入所有类importacme。project。*;这个语句表示acme。project中所有的公有类被引入当前包。以下语句从acme。project包中进入一个类Employec_List。//从acme。project而引入Employee_Listimportacme。project。Employee_list;Employee_Listobj=newEmployee_List();在使用一个外部类或界面时,必须要声明该类或界面所在的包,否则会产生编译错误。import(引用)类包(classpackage)用import关键词调入;指定package名字如路径和类名;用*匹配符可以调入多于一个类名。
importjava。Date;importjava。awt。*;
  如果java源文件不包含package;它放在缺省的无名package。这与源文件同目录,类可以这样引入:importMyClass。
  Java系统包:Java语言提?copy;了一个包含窗口工具箱,实用程序,一般I/O;工具和网络功能的包。
  java。applet这个包包含量了一?copy;设计applet的类;用一个类Applet和三个接口。AppletContext;AppletStub;和AudioClip。
  java。awt另一个窗口工具箱包。awt;包含了一?copy;产生装饰物和GUI成员的类。这个package包括:
  Button;Checkbox;Choice;ponent;Graphics;Menu;Pane1;TextArea和TextField。
  java。ioI/Opackage包含文件输入/输出类,FileInputStream和FileOutputStream。
  java。lang这个包包含Java语言类;包含:对象;线程;异常出口;系统;整数;原点;数学;字符等。
  java这个类支持TCP/IP网络协议,并包含Socket类;URL和URL相联系的类。
  java。util这个类包含一?copy;程序的同步类;它包含Date;Dictionary类等。
3。10异常
  当在Java程序中发生一个错误时,例如:一个变元的值非法,代码会发现这个错误,并引发一个异常(exception)。在缺省的情况下,异常会输出一个错误消息,然后中止线程的执行。但是,程序自己可以定义异常处理段(exceptionhandler)来截获(catch)异常,并从错误中恢复。有一?copy;异常是由Java解释器在运行时刻引发的。实际上,任何类都可以定义属于自己的异常,并使用throw语句引发它们。一个throw(引发?copy;语句是由throw关键字和一个对象构成。按常规,该对象应该是Exception类的实例或其子类的实例。throw语句会引起执行转向相应的异常处理段。当一个throw语句执行时,它下面的所有代码不再执行了,它所在的方法也不再返回值。下面的例子将演示如何创建一个Exception的子类,然后引发一个异常。classMyExceptionextendsException{}classMyClass{voidoops(){if(/*不出现错误*/){…}else{/*出错*/}else{/*出错*/thrownewMyException();}}}为了定义一个异常处理段,程序必须用try语句把可能产生异常的代码成组。在try语句后面跟上一个或多个catch(截获?copy;语句,每个异常对应一个catch语句。每个catch语句中包含着异常处理段。例如:try{p。a=10;}catch(Null

返回目录 上一页 下一页 回到顶部 0 0

你可能喜欢的