还剩19页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
类和对象的高级特征JAVA
1..第四.JAV.类和对象的高级特.教案名称...教案大小...教案类型..WOR.文.星级评定:..★★★★.教案简介...本讲主要讲述.java语言中面向对象的高级特征.包括抽象类.接口和包的特性..通过本讲的学习.同学们可以使.jav.语言中较为深入的技术编写面向对象程序..下载....
1.什么是抽象类.接口.它们各自又有哪些特性..
1.仔细体会面向对象编程的思想.熟练理解类和对象的概念.理解面向对象的特性.会编写各.java类.逐渐掌握面向对象编程的方法...
2.注.java语言中.不允许多重继承.而使用接口的方法..换句话说.除非将自己的域名转让给其他人.而且对方也按照相同的路径名编.Jav.代码.否则名字的冲突是永远不会出现的..当然.如果你没有自己的域名.那么必须创造一个非常生僻的包名(例如自己的英文姓名..以便尽最大可能创建一个独一无二的包名..如决定发行自己.Jav.代码.那么强烈推荐去申请自己的域名.它所需的费用是非常低廉的..
②..ftp:〃ftp.internic.ne.这个技巧的另一部分是.packag.名解析成自己机器上的一个目录..这样一来.Java程序运行并需要装载.clas.文件的时.(这是动态进行的.在程序需要创建属于那个类的一个对象.或者首次访问那个类的一.stati.成员时..它就可以找到.clas.文件驻留的那个目录..Jav.解释器的工作程序如下..首先.它找到环境变量CLASSPAT.(.Jav.或者具.Java解释能力的工具如浏览器安装到机器中时.通过操作系统进行设定...CLASSPATH包含了一个或多个目录.它们作为一种特殊的.使用.从这里展开对.clas.文件的搜索.从那个根开始.解释器会寻找包名.并将每个点号(句点.替换成一个斜杠.从而生成从CLASSPAT.根开始的一个路径名(所.packag.foo.bar.ba.会变.foo\bar\ba.或者foo/bar/baz.具体是正斜杠还是反斜杠由操作系统决定...随后将它们连接到一起.成为CLASSPAT.内的各个条目(入口...以后搜索.clas.文件时.就可从这些地方开始查找与准备创建的类名对应的名字..此外.它也会搜索一些标准目录这些目录.Jav.解释器驻留的地方有关..为进一步理解这个问题.下面以我自己的域名为例.它.bruceeckel.com..将其反转过来后,com.bruceecke.就为我的类创建了独一无二的全局名称com.edu.org.ne.等扩展名以前.Jav.包中都是大写的.但.Jav.
1..以来这种情况已发生了变化..现在整个包名都是小写的..由于决定创建一个名.uti.的库.我可以进一步地分割它.所以最后得到的包名如下..packag.com.bruceeckel.util.现在.可将这个包名作为下述两个文件的命名空.使用••//.Vector,jav./.Creatin..packag.packag.com.bruceeckel.util,publi.clas.Vecto...publi.Vector....System,out.printin....com.bruceeckel.util.Vector///:.创建自己的包时.要.packag.语句必须是文件中的第一个非注释代码..第二个文件表面看起来是类似的//.List.jav./.Creatin..packag.packag.com.bruceeckel.・・util,publi.clas.Lis...publi.List....System,out.printin....com.b ruceeckel.util.List)这两个文件都置于我自己系统的一个子目录中..C:\DOC\JavaT\com\bruceeckel\uti.若通过它往回走.就会发现包.com.bruceeckel.util.但路径的第一部分又是什么呢.这是.CLASSPATH环境变量决定的..在我的机器上.它是..CLASSPATH二.;D:\JAVA\LIB;C:\D0C\Java.可以看出.CLASSPAT.里能包含大量备用的搜索路径..然而.使.JAR文件时要注意一个问题..必须将JAR文件的名字置于类路径里.而不仅仅是它所在的路径..所以对一个名.grape,jar.JAR文件来说.我们的类路径需要包括..CLASSPATH二.;D:\JAVA\LIB;C:\flavors\grape.ja.正确设置好类路径后.可将下面这个文件置于任何目录里••//.LibTest.jav./.Use.th.librar.packag.c
05.impor.com.bruceec kel.util.*.publi.clas.LibTes...publi.stati.voi.main(String[.args....Ve cto...ne.Vector(....Lis...ne.List.编译器遇.import语句后.它会搜索.CLASSPAT.指定的目录.查找子目录com\bruceeckel\util.然后查找名称适当的已编译文件(对于Vector是Vector,class.对.List贝!J.List,class)注.Vector.List内无论类还是需要的方法都必须设.public・・..
1.自动编.为导入的类首次创建一个对象时(或者访问一个类.stati.成员时).编译器会在适当的目录里寻找同名的.clas.文件(所以如果创建类.的一个对象.就应该是X.class)..若只发.X.class.它就是必须使用的那一个类..然而.如果它在相同的目录中还发现了一.X.java.编译器就会比较两个文件的日期标记..如果X.java.X.clas.新.就会自动编译X.java.生成一个最新.X.classo..对于一个特定的类.或在与它同名的.java文件中没有找到它.就会对那个类采取上述的处理..
2.冲.若通过*导入了两个库.而且它们包括相同的名字.这时会出现什么情况呢.例如.假定一个程序使用了下述导入语句..impor.com.bruceeckeL util.*.impor.java.util.由于java.util.*也包含了一个Vector类.所以这会造成潜在的冲突..然而.只要冲突并不真的发生.那么就不会产生任何问题这当然是最理想的情况.因为否则的话.就需要进行大量编程工作.防范那些可能可能永远也不会发生的冲突..如现在试着生成一个Vector.就肯定会发生冲突..如下所示..Vecto...ne.Vector().它引用的到底是哪个Vector类呢.编译器对这个问题没有答案.读者也不可能知道..所以编译器会报告一个错误.强迫我们进行明确的说明.例如.假设我想使用标准.Jav.Vector.那么必须象下面这样编程・java.util.Vecto ne.java.util.Vector.由于它・・・・・.CLASSPAT.一起.完整指定了那个Vector的位置.所以不再需要impor.java.util.*语句.除非还想使用来.java,util的其他东西...
4.
3..掌握前述的知识后.接下来就可以开始创建自己的工具库.以便减少或者完全消除重复的代码..例如.可.System.out.printin创建一个别名.减少重复键入的代码量..它可以是名.tool.的一个包package.的一部分..//.P.jav./.Th.P.rin.P.rintl.shorthan.packag.com.bruceeckel.tools.publi.clas....publi.stati.voi.rint Objec.obj....System,out.print obj....publi.stati.voi.rint Strin.s....System,out.p rints....publi.stati.voi.rint chart,s....System,out.prin ts publi.stati.voi.rint cha.・・・・c....System,out.print c.・publi.stati.voi.rint in.i....System,out.print・・i....publi.stati.voi.rint Ion.
1....System,out.print
1.…System,out.printin1….publi.stati.voi.rintln floa.f....System,out.printinf....publi.stati.voi.rintlndoubl.d....System,out.printind....publi.stati.voi.rintlnboolea.b....System,out.printlnb....///所有不同的数据类型现在都可以在一个新行输出P.rintlnO.或者不在一个新行输出P.rint..大家可能会猜想这个文件所在的目录必须从某.CLASSPAT.位置开始.然后继.com/bruceeckel/toolso.编译完毕后.利用一个import语句.即可在自己系统的任何地方使.P.clas.文件..如下所示..ToolTest.jav.所以从现在开始.无论什么时候只要做出了一个有用的新工具.就可将其加入tool.目录或者自己的个人util.tool.目录..
1.CLASSPAT.的陷.P.jav.文件存在一个非常有趣的陷阱..特别是对于早期.Jav.实现方案来说.类路径的正确设定通常都是很困难的一项工作..编写这本书的时候.我引入.P.jav.文件.它最初看起来似乎工作很正常..但在某些情况下.却开始出现中断..在很长的时间里.我都确信这是Java或其他什么在实现时一个错误..但最后,我终于发现在一个地方引入了一个程序(即.
1.章要说明.CodePackager.java).它使用了一个不同的类P..由于它作为一个工具使用.所以有时候会进入类路径里.另一些时候则不会这样..但只要它进入类路径.那么假若执行的程序需要寻.com.bruceeckel.tool.中的类.Java首先发现的就.CodePackager.java中.P..止匕时.编译器会报告一个特定的方法没有找到..这当然是非常令人头疼的.因为我们在前面的.P里明明看到了这个方法.而且根本没有更多的诊断报告可为我们提供一条线索.让我们知道找到的是一个完全不同的类(那甚至不是publi.的)..乍一看来.这似乎是编译器的一个错误.但假若考.inipor.语句.就会发现它只是说..在这里可能发现.P..然而.我们假定的是编译器搜索自己类路径的任何地方.所以一旦它发现一个P.就会使用它.若在搜索过程中发现了错误的一个.它就会停止搜索..这与我们在前面表述的稍微有些区别.因为存在一些讨厌的类.它们都位于包内..而这里有一个不在包内.P.但仍可在常规的类路径搜索过程中找到..如果您遇到象这样的情况.请务必保证对于类路径的每个地方.每个名字都仅存在一个类...
4.
3..Java已取消的一种特性是.的条件编译.它允许我们改变参数.获得不同的行为.同时不改变其他任何代码..Java之所以抛弃了这一特性.可能是由于该特性经常在.里用于解决跨平台问题..代码的不同部分根据具体的平台进行编译.否则不能在特定的平台上运行..由于Java的设计思想是成为一种自动跨平台的语言.所以这种特性是没有必要的..然而.条件编译还有另一些非常有价值的用途..一种很常见的用途就是调试代码..调试特性可在开发过程中使用.但在发行的产品中却无此功能..Ale.Holub.提出了利用包package.来模仿条件编译的概念..根据这一概念.它创建.C断定机制一个非常有用.Jav.版本..之所以叫作断定机制.是由于我们可以说它应该为真或者它应该为假..如果语句不同意你的断定.就可以发现相关的情况..这种工具在调试过程中是特别有用的..可用下面这个类进行程序调试://.Assert,jav./.Assertio.too.fo.debuggin.packag.com.bruceec kel.tools,debug.publi.clas.Asser...privat.stati.voi.perrStrin.msg....Syste m.err.printin msgpubli.f ina.stati.voi.is_trueboolea.exp....if!exp.perrAssertio.failed.publi.fina.stati.・・・voi.is_falseboolea.exp...ifexp.perrAssertio.failed....pub li.fina.stati.voi..is_trueboolea.exp.Strin.msg....if!exp.perrAssertio.failed..msg....publi.f ina.stati.voi..is_false boolea.exp.Strin.msg....if exp.perr Assertio.failed..msg这个类只是简单地封装了布尔测试..如果失败.就显示出出错消息..在..章.大家还会学习一个更高级的错误控制工具.名为违例控制..但在目前这种情况下.perr方法已经可以很好地工作..如果想使用这个类.可在自己的程序中加入下面这一行.impor.com.bruceeckel.tools,debug.*.如欲清除断定机制.以・便自己能发行最终的代码.我们创建了第二个Assert类.但却是在一个不同的包里//.Assert,jav./.Turnin.of.th.assertio.outpu.・・/.s.yo.ca.shi.th.program.packag.com.bruceeckel.tools.publi.clas.Asser...publi.f ina.stati.voi.is_true boolea.exppubli.fina.stati.voi.is_false boolea.exp{..publi.fina.stat i.voi..is_true boolea.exp.Strin.msg.{..publi.f ina.stati.voi..is_false boolea.exp.Strin.msg.{..///.现在.假如将前一个import语句变成下面这个样子impor.com.bruceeckel.tools.*.程序便不再显示出断言・・..下面是个例子••//.TestAssert.jav./.Demonstratin.th.assertio.too.packag.c
05./.Commen.th.following.an.uncommen.th./.subsequen.lin.t.chang.assertio.behavior,im por.com.bruceeckel.tools,debug.*/.impor.com.・bruceeckel.too Is.*.publi.clas.TestAsser...publi.stati.voi.mainString[.args...Assert.is_true..
2.=.
5...Assert.is_false..
1.・二2Assert.is_true..
2.=.
5....=.
5....Assert.・・・・is_false..
1.=.
2...
2......III.通过改变导入.package.我们可将自己的代码从调试版本变成最终的发行版本..这种技术可应用于任何种类的条件代码...
4.
3..大家应注意这样一个问题.每次创建一个包后.都在为包取名时间接地指定了一个目录结构・....
1.理解方法抽象类和接口.不要混淆了两者的使用...
2.接口的使用
4..抽象.
4..接.
4...
4.
3..我们.impor.关键字导入一个完整的库时.就会获得.(Package...例如..impor.java.util.*.它的作用是导入完整的实用工具(Utility.库.该库属于标.Jav.开发工具包的一部分.由.Vecto.位.java.uti.里.所以现在要么指定完整名称java.util.Vecto.(可省.impor.语句..要么简单地指定一个Vecto.(因.impor.是默认的...若想导入单独一个类.可.impor.语句里指定那个类的名字..impor.java.util.Vector.现在.我们可以自由地使.Vectoro..然而.java.uti.中的其他任何类仍是不可使用的..之所以要进行这样的导入.是为了提供一种特殊的机制.以便管理命名空.(Nam.Space.o..我们所有类成员的名字相互间都会隔离起来..位于..内的一个方法f()不会与位于..内的.拥有相同签.(自变量列表.,()发生冲突..但类名会不会冲突呢.假设创建一.stac.类.将它安装到已有一.stac.类(由其他人编写.的机器上.这时会出现什么情况呢.对于因特网中.Jav.应用.这种情况会在用户毫不知晓的时候发生.因为类会在运行一.Jav.程序的时候自动下载..正是由于存在名字潜在的冲突.所以特别有必要.Jav.中的命名空间进行完整的控制,而且需要创建一个完全独一无二的名字.无论因特网存在什么样的限制..迄今为止.本书的大多数例子都仅存在于单个文件中.而且设计成局部(本地.使用,没有同包名发生冲突(在这种情况下•类名置于默认.内...这是一种有效的做法.而且考虑到问题的简化.本书剩下的部分也将尽可能地采用它..然而.若计划创建一个对因特网友.或者说适合在因特网使.的程序.必须考虑如何防止类名的重复...Jav.创建一个源码文件的时候.它通常叫作一个编辑单.(有时也叫作翻译单....每个编译单元都必须有一个以.jav.结尾的名字..而且在编译单元的内部.可以有一个公共(public.类.它必须拥有与文件相同的名字(包括大小写形式.但排除.java文件扩展名...如果不这样做.编译器就会报告出错..每个编译单元内都只能有一.public类(同样地.否则编译器会报告出错...那个编译单元剩下的类(如果有的话.可在那个包外面的世界面前隐藏起来.因为它们并非公..(.public).而且它们由用于.public类的支.类组成..编译一个.jav.文件时.我们会获得一个名字完全相同的输出文件.但对于.jav.文件中的每个类.它们都有一个.clas.扩展名..因此.我们最终从少量的.jav.文件里有可能获得数量众多的.clas.文件..如以前用一种汇编语言写过程序.那么可能已习惯编译器先分割出一种过渡形式(通常是一个.ob.文件..再用一个链接器将其与其他东西封装到一起(生成一个可执行文件..或者与一个库封装到一起(生成一个库...但那并不.Jav.的工作方式..一个有效的程序就是一系列.clas.文件.它们可以封装和压缩到一.JA.文件里(使.Jav.
1..提供.ja.工具...Jav.解释器负责对这些文件的寻找.装载和解.(注释
①...
①..Jav.并没有强制一定要使用解释器..一些固有代码.Jav.编译器可生成单独的可执行文件....也由一系列类文件构成..每个文件都有一.publi..(并没强迫使用一.publi.类,但这种情况最很典型的..所以每个文件都有一个组件..如果想将所有这些组件(它们在各自独立的.jav.和.clas.文件里.都归纳到一起.那.packag.关键字就可以发挥作用...若在一个文件的开头使用下述代码..packag.mypackage.那.packag.语句必须作为文件的第一个非注释语句出现..该语句的作用是指出这个编译单元属于名.mypackag.的一个库的一部分..或者换句话说.它表明这个编译单元内.public类名位.mypackag.这个名字的下面..如果其他人想使用这个名字.要么指出完整的名字,要么.mypackag.联合使•impor.关键字(使用前面给出的选项...注意根.Jav.包(封装.的约定.名字内的所有字母都应小写.甚至那些中间单词亦要如此..例如.假定文件名.MyClass.javao..它意味着在那个文件有一个.而且只能有一.publi.类..而且那个类的名字必须.MyClass(包括大小写形式...packag.mypackage.publi.clas.MyClas../....现在.如果有人想使.MyClass.或者想使.mypackag.内的其他任.publi.类.他们必须.impor.关键字激.mypackag.内的名字.使它们能够使用..另一个办法则是指定完整的名称..mypackage.MyClas...ne.mypackage.MyClass.impor.关键字贝J可将其变得简洁得多..impor.mypackage.*./....MyClas...ne.MyClass.作为一名库设计者.一定要记.packag..impor.关键字允许我们做的事情就是分割单个全局命名空间.保证我们不会遇到名字的冲突无论有多少人使用因特网.也无论多少人.Jav.编写自己的类••创建独一无二的包.大家或许已注意到这样一个事实・..由于一个包永远不会真的封.到单独一个文件里面,它可由多个.clas.文件构成.所以局面可能稍微有些混乱..为避免这个问题.最合理的一种做法就是将某个特定包使用的所有.clas.文件都置入单个目录里..也就是说.我们要利用操作系统的分级文件结构避免出现混乱局面..这正.Jav.所采取的方法..它同时也解决了另两个问题..创建独一无二的包名以及找出那些可能深藏于目录结构某处的类..正如我们在..章讲述的那样.为达到这个目的.需要将.clas.文件的位置路径编码到packag.的名字里..但根据约定.编译器强.packag.名的第一部分是类创建者的因特网域名..由于因特网域名肯定是独一无二的.InterNI.保证注释
②.它控制着域名的分配.所以假如按这一约定行事.packag.的名称就肯定不会重・复.所以永远不会遇到名称冲突的问题。
个人认证
优秀文档
获得点赞 0