chapter9类修饰字说明_第1页
chapter9类修饰字说明_第2页
chapter9类修饰字说明_第3页
chapter9类修饰字说明_第4页
chapter9类修饰字说明_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

高级类特性访问控制static变量、方法final类、方法和变量abstract类和abstract方法访问控制在Java中,可以在类、类的属性以及类的方法前面加上一个修饰符(modifier),来对类进行一些访问上的控制。修饰符同一个类中同一个包中子类中全局privateYesdefaultYesYesprotectedYesYesYespublicYesYesYesYes访问控制访问控制的限制程度从高到低如下图所示。注意,Default不是一个修饰符,它只是用来表示一种不加任何修饰符时的状态。privateDefaultprotectedpublicstatic关键字static关键字用来修饰变量、方法和内部类,称这些变量、方法和内部类为静态变量、静态方法和静态内部类static关键字声明一个属性或方法是和类相关的,而不是和类的某个特定的实例相关,因此,这类属性或方法也称为“类属性”或“类方法”如果访问控制权限允许,可不必创建该类对象而直接使用类名加“.”调用static不可用于修饰构造器static自由块除了用于修饰变量和方法外,还可以用于修饰类中的自由块所谓类的“自由块”,就是在类中用“{}”包含起来的不属于任何方法或构造器的代码段使用static来修饰的自由块只在类加载的时候执行一次,通常用于初始化静态变量publicclassCount{privateint

serialNumber;publicstaticintcounter;static{counter=1;}publicstaticint

getTotalCount(){returncounter;}publicCount(){counter++;

serialNumber=counter;}}单子(Singleton)设计模式有时候,我们需要实现这样的功能:那就是在整个应用中,只有一个实例存在。比如,在PowerPoint中,只能出现一个帮助窗口。如果将这个帮助窗口当作一个类,这就意味着它只能有一个实例。利用单子(Singleton)设计模式,可以实现这种需求。final关键字final---用于类、方法、变量前final类---不可被继承,如java.lang.Math就是一个final类,不可被继承final变量---在初始化后不可改变变量值,用于常量定义。如果final变量是引用变量,则不可以改变它的引用对象,但可以改变对象的数据(属性)final方法---不可被覆盖abstract可以使用abstract来修饰一个类或者方法。用abstract修饰的类表示这个类是一个抽象类,用abstract修饰的方法表示这个方法是一个抽象方法。抽象类不能被实例化抽象方法是只有方法声明,而没有方法的实现的方法。抽象类(abstractclass)抽象类里面并非一定需要抽象方法,但是没有抽象方法,抽象类就没有存在的必要在以下任一条件成立时,类必须定义成抽象类:类中有至少一个抽象方法类继承了父类中的抽象方法,但是至少有一个抽象方法没有实现类实现了某个接口,但没有全部实现接口中的方法publicabstractclassShapes{ /** *得出周长 */

publicabstractdoubleperimeter();

/** *得到形状 */

publicabstractStringgetType();}publicclassShapeTriangleextendsShapes{ protecteddoublea,b,c; …… /** *实现父类中的抽象方法 */

publicdoubleperimeter() { returna+b+c; } publicStringgetType() { return"三角形"; } }接口接口的定义,接口的定义是由接口头定义和接口体定义两个部分组成,在接口头定义中,用关键字interface来声明接口[public]interfaceinterfaceName[extendssuperinterface1,……,superinterfacen]{//接口体 //域定义 [public][static][final]typeconstName=constValue; //方法定义 [public][abstract]returntype

functionName(parilist)[throwsexceptionList];}接口的实现PublicclassImplementsCimplementsInterfaceC{}包包是一组相关类和接口的集合。不同于继承、包含关系,包内的类之间具有松散的使用关系。除了private修饰符,被其它权限修饰符(包括默认的修饰符)所修饰的类成员可以被同一个包内的所有类访问和调用,这样可以对复杂系统中大量的类和接口进行方便的、有效的管理,提高了类和接口的安全性,更好的体现面向对象变成的封装特性包的创建packagepk1[.pk2[pk3…]packagemypk;classExtencomputer;classComputerE;包定义语句必须在java源文件的最前面,为java源文件的第一条可执行语句packagemypack.t;publicclassPublicClass{ publicinti=2; publicvoidchangex(floatx) { x++; System.out.println(“x=”+x); }}包的引用使用前缀包名法mypack.t.PublicClassm=newmypack.t.PublicClass();使用引用语句importimport.t.PublicClass;包的路径,两种方式1在编译命令中直接添加包的路径2设置系统的CLASSPATH环境变量setCLASSPATH=.;c:\j2sdk1.4.2\lib接口(interface)接口(interface)是方法和常量值的定义的集合。接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现。接口定义格式:<modifier>interface<name>[extends<superinterface>]{ [<attribute_declarations>] [<abstrctmethod_declarations>] }接口的继承接口和类类似,也可以从一个父接口中派生。接口的继承也是使用"extends"关键字来完成。接口继承的基本语法如下:<modifier>interface<name>[extends<super_interface>,<suuper_interface>]{ [<attribute_declarations>] [<abstract_method_declarations>]}和类不同的是,一个接口可以继承多个父接口实现接口多个无关的类可实现同一个接口。一个类可实现多个无关的接口语法如下:<class_declaration>::= <modifier>class<name>[extends<superclass>] [implements<interface>[,<interface>]*]{ <declarations>*}在Java中,可以通过接口来模拟多继承接口例子interfaceMetal{ publicvoidtwinkle();}接口例子interfaceSubstitution{ publicvoidexchange();}publicclassGoldimplementsSubstitution,Metal{

publicvoidexchange() { System.out.println("Exchange"); }

publicvoidtwinkle() { System.out.println("Shining"); }}常见的java提示错误*错误1:'javac'不是内部或外部命令,也不是可运行的程序或批处理文件。

(javac:Commandnotfound)*错误2:

HelloWorldisaninvalidoptionorargument.

*错误3:

HelloWorld.java:1:Publicclasshelloworldmustbedefinedinafilecalled

"HelloWorld.java".publicclasshelloworld{*错误4:

Exceptioninthread"main"java.lang.NoClassDefFoundError:HelloWorld*错误5:

Exceptioninthread"main"java.lang.NoSuchMethodError:main通过类继承实现代码重用不是精确的代码重用技术,因此它并不是最理想的代码重用机制。换句话说,如果不继承整个类的所有方法和数据成员,我们无法重用该类里面的单个方法。继承总是带来一些多余的方法和数据成员,它们总是使得重用类里面某个方法的代码复杂化。另外,派生类对父类的依赖关系也使得代码进一步复杂化:对父类的改动可能影响子类;修改父类或者子类中的任意一个类时,我们很难记得哪一个方法被子类覆盖、哪一个方法没有被子类覆盖;

最后,子类中的覆盖方法是否要调用父类中的对应方法有时并不显而易见。

任何方法,只要它执行的是某个单一概念的任务,就其本身而言,它就应该是首选的可重用代码。为了重用这种代码,我们必须回归到面向过程的编程模式,把类的实例方法移出成为全局性的过程。为了提高这种过程的可重用性,过程代码应该象静态工具方法一样编写:它只能使用自己的输入参数,只能调用其他全局性的过程,不能使用任何非局部的变量。这种对外部依赖关系的限制简化了过程的应用,使得过程能够方便地用于任何地方。当然,由于这种组织方式总是使得代码具有更清晰的结构,即使是不考虑重用性的代码也同样能够从中获益。

在Java中,方法不能脱离类而单独存在。为此,我们可以把相关的过程组织成为独立的类,并把这些过程定义为公用静态方法。高级类特性虚方法调用instanceof运算符对象的造型(cast)内部类修饰符的适用范围虚方法调用

(VirtualMethodInvocation)正常的方法调用

Personp=newPerson(); p.showName(); Students=newStudent(); s.showName();虚拟方法调用(多态情况下)

Personp=newStudent();p.showName();

编译时类型和运行时类型instanceof运算符使用运算符instanceof可以得到对象的类型对象造型(Casting)所谓造型就是Java对象间的类型转换Java的对象造型可以分为两种情况:自动造型强制造型在造型前可以使用instanceof运算符测试一个对象的类型对象的造型只用在有继承关系的对象之间内部类(innerclass)允许一个类的定义出现在另一个类中,将处于另一个类中的“寄生类”称为“内部类”(innerclass),也称为“类属类”这样的一组类在逻辑上是一个整体,内部类和外层封装它的类之间存在逻辑上的从属关系内部类对其封装类的内部成员有访问权限publicclassOuter1{privateintsize;/*定义一个内部类,名为"Inner"*/publicclassInner{publicvoiddoStuff(){//内部类可以访问外部类的私有属性

size++;}}publicvoidtestTheInner(){Inneri=newInner();i.doStuff();}}实例化内部类实例化内部类的两种方法:

---法一:

Outer.Innerin=newOuter().newInner(); ---法二:

Outero=newOuter(); Outer.InnerI=newo.newInner();

如果内部类是static的,也可以用下面方法:

Outer.Innerin=newOuter.Inner();内部类类的名字只能在定义的范围内使用,除非使用有效的全名Inner类也可以定义在方法的内部。方法中final类型的局部变量,都可以被Inner类的方法访问。(示例7-12)内部类特性Innerclass可以声明为抽象类,因此可以被其它的内部类继承。也可以声明为final的。和外层类不同,Innerclass可以声明为private或protected;Innerclass可以声明为static的,但此时就不能再使用外层封装类的非static的成员变量;非static的内部类中的成员不能声明为static的,只有在顶层类或static的内部类中才可声明static成员修饰符适用范围class属性方法构建器自由块内部类publicYYYYYprotectedYYYY(Default)YYYYYYprivateYYYYfinalYYYYabstractYYYstaticYYY小结描述static变量、方法和初始化器描述final类、方法和变量解释如何以及何时使用abstract类和方法解释如何以及何时使用内部类(innerclass)解释如何以及何时使用接口(interface)高级类特性(下)模板设计模式接口多态模版设计模式(TemplatePattern)在类中

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论