《JAVA类和对象的高级特征.docx》由会员分享,可在线阅读,更多相关《JAVA类和对象的高级特征.docx(20页珍藏版)》请在优知文库上搜索。
1、JAVA类和对象的高级特征(1)第四章JAVA类和对象的高级特征教案名称:教案大小:教案类型:WORD文档星级评定:教案简介:本讲主要讲解并描述了java语言中面对对象的高级特征,包括抽象类、接口和包的特性。通过本讲的学习,同学们可以运用java语言中较为深化的技术编写面对对象程序。下载一1.什么是抽象类、接口?它们各自又有哪些特性?2.你知道java语言在面对对象编程方面有何独特的特点吗?本讲主要讲解并描述了java语言中面对对象的高级特征,包括抽象类、接口和包的特性。通过本讲的学习,同学们可以运用java语言中较为深化的技术编写面对对象程序。应深刻理解各学问点的概念,运用上讲的编程基础学问
2、及面对对象技术,编写各种java类,由浅至深,养成风格良好的编程习惯。1.细致体会面对对象编程的思想,娴熟理解类和对象的概念,理解面对对象的特性,会编写各种java类,渐渐驾驭面对对象编程的方法。2.留意java语言中,不允很多重继承,而运用接口的方法。1.理解方法抽象类和接口,不要混淆了两者的运用。2.接口的运用。4.1抽象类4.2接口4.3包4.4JAVA应用程序编程接口java语言中,用abstract关键字来修饰一个类时,这个类叫做抽象类,用abstract关键字来修饰一个方法时,这个方法叫做抽象方法。格式如下:abstractclassabstractclass抽象类abstract
3、returnTypeabstractMethod(paramlist)/抽象方法抽象类必需被继承,抽象方法必需被重写。抽象方法只需声明,无需实现:抽象类不能被实例化,抽象类不确定要包含抽象方法。若类中包含了抽象方法,则该类必需被定义为抽象类。接口是抽象类的一种,只包含常量和方法的定义,而没有变量和方法的实现,且其方法都是抽象方法。它的用处体现在下面几个方面:通过接口实现不相关类的相同行为,而无需考虑这些类之间的关系。O通过接口指明多个类须要实现的方法。O通过接口了解对象的交互界面,而无需了解对象所对应的类1接口的定义包括接口声明和接口体。接口声明的格式如下:publicinterfaceInt
4、erfaceNameextends1istOfSuperlnterfaceextends子句与类声明的extends子句基本相同,不同的是一个接口可有多个父接口,用逗号隔开,而一个类只能有一个父类。接口体包括常量定义和方法定义常量定义格式为:typeNAME=Value:该常量被实现该接口的多个类共享;具有public,final,static的属性。方法体定义格式为:(具有public和abstract屈性)returnTypemethodName(paramist);2在类的声明中用implements子句来表示一个类运用某个接口,在类体中可以运用接口中定义的常量,而且必需实现接口中定义的
5、全部方法。一个类可以实现多个接口,在implements子句中用逗号分开。3接口作为一种引用类型来运用。任何实现该接口的类的实例都可以存储在该接口类型的变量中,通过这些变量可以访问类所实现的接口中的方法。进行面对对象的设计时,一项基本的考虑是:如何将发生变更的东西与保持不变的东西分隔开。这一点对于库来说是特殊重要的。那个库的用户(客户程序员)必需能依靠自己运用的那一部分,并知道一旦新版本的库出台,Fl己不须要改写代码。而与此相反,库的创建者必需能自由地进行修改与改进,同时保证客户程序员代码不会受到那些变动的影响。为达到这个目的,需遵守确定的约定或规则。例如,库程序员在修改库内的一个类时,必需保
6、证不删除已有的方法,因为那样做会造成客户程序员代码出现断点。然而,相反的状况却是令人苦痣的。对于一个数据成员,库的创建者怎样才能知道哪些数据成员已受到客户程序员的访问呢?若方法属于某个类唯一的一部分,而且并不确定由客户程序员干脆运用,那么这种苦痛的状况同样是真实的。假如库的创建者想删除一种旧有的实施方案,并置入新代码,此时又该怎么办呢?对那些成员进行的任何改动都可能中断客户程序员的代码。所以库创建者处在一个尴尬的境地,好像根本动弹不得。为解决这个问题,Java推出了访问指示符的概念,允许库创建者声明哪些东西是客户程序员可以运用的,哪些是不行运用的。这种访问限制的级别在最大访问和最小访问的范围之
7、间,分别包括:public.友好的(无关键字),protected以及PrivaIeo依据前一段的描述,大家或许已总结出作为一名库设计者,应将全部东西都尽可能保持为private(私有),并只展示出那些想让客户程序员运用的方法。这种思路是完全正确的,尽管它有点儿违反那些用其他语言(特殊是O编程的人的宜觉,那些人习惯于在没有任何限制的状况下访问全部东西。到这一章结束时,大家应当可以深刻体会到Java访问限制的价值。然而,组件库以及限制谁能访问那个库的组件的概念现在仍不是完整的。仍存在这样一个问题:如何将组件绑定到单独一个统一的库单元里。这是通过Java的package(打包)关键字来实现的,而且
8、访问指示符要受到类在相同的包还是在不同的包里的影响。所以在本章的开头,大家首先要学习库组件如何置入包里。这样才能理解访问指示符的完整含义。4.3.1我们用import关键字导入一个完整的库时,就会获得包(PaCkage)。例如:importjava.util.*;它的作用是导入完整的好用工具(Utility)库,该库属于标准Java开发工具包的一部分。由于VCCior位于java.Util里,所以现在要么指定完整名称java.util.Vector(可省略import语句),要么简洁地指定一个VeCtor(因为import是默认的)。若想导入单独一个类,可在import语句里指定那个类的名字:
9、importjava.util.Vector;现在,我们可以臼山地运用VectOFo然而,java.Util中的其他任何类仍是不行运用的。之所以要进行这样的导入,是为了供应一种特殊的机制,以便管理命名空间(NameSpace)。我们全部类成员的名字相互间都会隔离起来。位于类内的一个方法f不会与位于类B内的、拥有相同签名(自变量列表)的f()发生冲突。但类名会不会冲突呢?假设创建一个stack类,将它安装到已有一个StaCk类(由其他人编写)的机器上,这时会出现什么状况呢?对于因特网中的Java应用,这种状况会在用户宅不知晓的时候发生,因为类会在运行一个Java程序的时候自动下载。正是由于存在名
10、字潜在的冲突,所以特殊有必要对Java中的命名空间进行完整的限制,而且须要创建一个完全独一无二的名字,无论因特网存在什么样的限制。迄今为止,本书的大多数例子都仅存在于单个文件中,而且设计成局部(木地)运用,没有同包名发生冲突(在这种状况下,类名置于默认包内)。这是一种有效的做法,而且考虑到问题的简化,本书剩下的部分也将尽可能地采纳它。然而,若安排创建一个对因特网友好或者说适合在因特网运用的程序,必需考虑如何防止类名的重第。为Java创建一个源码文件的时候,它通常叫作一个编辑单元(有时也叫作翻译单元)。每个编译单元都必需有一个以.java结尾的名字。而且在编译单元的内部,可以有一个公共(PUbl
11、iC)类,它必需拥有与文件相同的名字(包拈大小写形式,但解除.java文件扩展名)。假如不这样做,编译器就会报告出错。每个编译单元内都只能有一个public类(同样地,否则编译器会报告出错)。那个编译单元剩下的类(假如有的话)可在那个包外面的世界面前隐减起来,因为它们并非公共的(非public),而且它们由用于主PUbIiC类的支撵类组成。编译一个.java文件时,我们会获得一个名字完全相同的输出文件;但对于java文件中的每个类,它们都有一个.CIaSS扩展名。因此,我们最终从少量的.java文件里有可能获得数量众多的.class文件。如以前用一种汇编语言写过程序,那么可能已习惯编译器先分割
12、出一种过渡形式(通常是一个.Obj文件),再用一个链接器将其与其他东西封装到一起(生成一个可执行文件),或者与一个库封装到一起(生成一个库)O但那并不是Java的工作方式。一个有效的程序就是一系列.class文件,它们可以封装和压缩到一个JAR文件里(运用Java1.1供应的jar工具)。Java说明器负责对这些文件的找寻、装载和说明(注释)。:Java并没有强制确定要运用说明器。一些固有代码的Java编译器可生成单独的可执行文件。库也由一系列类文件构成。每个文件都有一个public类(并没强迫运用一个public类,但这种状况最很典型的),所以每个文件都有一个组件。假如想将全部这些组件(它们
13、在各自独立的.java和.class文件里)都归纳到一起,那么package关键字就可以发挥作用)。若在一个文件的开头运用下述代码:packagemypackage:那么package语句必需作为文件的第一个非注释语句出现。该语句的作用是指出这个编译单元属于名为mypackage的一个库的一部分。或者换句话说,它表明这个编译单元内的public类名位于mypackage这个名字的下面。假如其他人想运用这个名字,要么指出完整的名字,要么与mypackage联合运用import关键字(运用前面给出的选项)。留意依据JaVa包(封装)的约定,名字内的全部字母都应小写,甚至那些中间单词亦要如此。例如,
14、假定文件名是MyClass.java。它意味着在那个文件有一个、而且只能有一个public类。而且那个类的名字必需是MyClass(包括大小写形式):packagemypackage;publicclassMyClass/.现在,假如有人想运用MyClass,或者想运用mypackage内的其他任何public类,他们必需用import关键字激活mypackage内的名字,使它们能够运用。另一个方法则是指定完整的名称:mypackage.MyClassm=newmypackage.MyClassO:import关键字则可将其变得简沾得多:importmypackage.*;/.MyClassm
15、=newMyClassO;作为一名库设计者,确定要记住package和import关键字允许我们做的事情就是分割单个全局命名空间,保证我们不会遇到名字的冲突无论有多少人运用因特网,也无论多少人用Java编写Fl己的类。1创建独一无二的包名大家或许已留意到这样一个事实:由于一个包恒久不会真的封装到单独一个文件里面,它可由多个.ClaSS文件构成,所以局面可能略微有些混乱。为避开这个问题,最合理的一种做法就是将某个特定包运用的全部.ClaSS文件都置入单个书目里。也就是说,我们要利用操作系统的分级文件结构避开出现混乱局面。这正是Java所实行的方法。它同时也解决了另两个问题:创建独一无二的包名以及找出那些可能深藏于书目结构某处的类。正如我们在第2章讲解并描述的那样,为达到这个目的,须要将.ClaSS文件的位置路径编码到PaCkagC的名字里。但依据约定,编译器强迫package名的第一部分是类创建者的因特网域名。由于因特网域名确定是独一无二的(由InterNIC保证注释,它限制着域名的安排),所以假如按这一约定行事,package的名称就确定不会重复,所以恒久不会遇到名称冲突的问题。换句话说,除非将自己的域名转让