《教学课件第六章 接口与包.ppt》由会员分享,可在线阅读,更多相关《教学课件第六章 接口与包.ppt(36页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、PPT模板下载:/moban/ 行业PPT模板:/hangye/ 节日PPT模板:/jieri/ PPT素材下载:/sucai/PPT背景图片:/beijing/ PPT图表下载:/tubiao/ 优秀PPT下载:/xiazai/ PPT教程: /powerpoint/ Word教程: /word/ Excel教程:/excel/ 资料下载:/ziliao/ PPT课件下载:/kejian/ 范文下载:/fanwen/ 试卷下载:/shiti/ 教案下载:/jiaoan/ 字体下载:/ziti/ 教学课件第六章 接口与包LOGOCompany Logo在本章中,我们将会学到:abstract类
2、与方法、接口的定义格式、多态1包的定义、编译、导入和调用2考虑到包功能的Java中的访问控制3 3匿名类与内部类4 Company Logo6.1 接口(Interface)6.1.1 抽象(抽象(abstract)类与抽象方法)类与抽象方法v 什么是抽象类和抽象方法呢什么是抽象类和抽象方法呢?简单的说,抽象方法是只有方法声明而没有方法体的特殊方法,如下例:abstract void talk();而如果一个类中含有抽象方法,这个类就自然成为抽象类,如下例:abstract class Animalabstract void talk();void getSkinColor()从上面的代码可以
3、看出:1)talk( ) 方法只有修饰符和方法名,而没有方法体(即花括号部分),所以它是一个抽象方法,需要abstract关键字修饰;2)class Animal中有抽象方法talk(),虽然Animal类中也有其它的有方法体的方法,如getSkinColor(),但只要类体中有一个方法是抽象的,类就是抽象的。所以它自然成为抽象类,也需要abstract关键字修饰;Company Logo抽象类和方法有何作用?v 这可能是初学编程者最感到迷惑的问题之一!v 在设计程序时,通常先将一些具有相关功能的方法组织在一起,形成特定的类,然后由其他子类来继承这个类,在子类中将覆盖这些没有实现的方法,完成特
4、定的具体功能。这种编程模式通常是基于相对较大型工程的设计而言的,在这些大型工程中,实现的技术比较复杂,模块多,代码量大,涉及编程的相关人员较多,角色和任务也不尽相同,为了合理安排软件工程的开发工作,需要一部分资深程序员先对程序框架做整体设计,然后其他程序员在建立好的框架基础上再做更细致的编程,就好比“建一座大厦要先建好钢筋混凝土框架在垒墙砖”一样,抽象类和方法就是起到“建立框架”的作用。v 在某些特殊编程情况下,一些类和方法的功能无法固定,比如上面的Animal类,它是所有动物的通称,每种动物的“说话”方式不同,小狗可能是“汪汪”地叫,而猫咪是“喵喵”地叫,在Animal类中无法确定talk(
5、)方法具体是什么功能,只能在子类中才能确定,因此把它设为抽象类最合适。1)talk( ) 方法只有修饰符和方法名,而没有方法体(即花括号部分),所以它是一个抽象方法,需要abstract关键字修饰;Company Logo抽象类和方法的具体实例:v 例例6-1:行号行号DemoAbstract.java 程序代码程序代码1abstract class Employee/雇员类,是抽象类int salary;/雇员薪水void setSalary(int salary)/设置薪水this.salary=salary;abstract void showSalary();/显示薪水,是抽象方法cl
6、ass Saler extends Employee/销售员类,是雇员类的子类void showSalary()/重写了父类的showSalary()方法System.out.println(销售员的月薪为:¥+salary*8*30);Company Logo抽象类和方法的具体实例:v 例例6-1:15super(type); this.name=name; /void talk() /覆盖覆盖talk()方法方法 System.out.println(汪汪汪汪); class Cat extends Animal /定义定义Animal类的子类类的子类Cat private String
7、name; public Cat(String type,String name) super(type); this.name=name; Company Logo抽象类和方法的具体实例:v 例例6-1:30 void talk() /覆盖覆盖talk( )方法方法 System.out.println(喵喵喵喵); public class DemoAbstract /定义主类定义主类 public static void main(String args) Dog doggie=new Dog(犬科动物犬科动物,德国黑贝德国黑贝); /指向子类对指向子类对象象 Cat kitty=new
8、 Cat(猫科动物猫科动物,波斯猫波斯猫); /指向子类对象指向子类对象 doggie.talk(); /显示显示doggie的声音的声音 kitty.talk(); /显示显示kitty的声音的声音 Company Logo【运行结果】v 汪汪汪汪v 喵喵喵喵v 【代码说明代码说明】 Animal类是抽象类,其中定义了抽象方法类是抽象类,其中定义了抽象方法talk( ),Dog和和Cat是是Animal类的子类,两个子类均覆盖了类的子类,两个子类均覆盖了talk( )方法。在类方法。在类DemoAbstract中,定义了两个子类类型的变量中,定义了两个子类类型的变量doggie和和kitty
9、,语句:,语句: Dog doggie=new Dog(犬科动物犬科动物,德国黑贝德国黑贝); Cat kitty=new Cat(猫科动物猫科动物,波斯猫波斯猫); 通过调用这两个变量的通过调用这两个变量的talk( )方法(代码方法(代码42,43行),显示行),显示两个子类实例两个子类实例talk( )方法的输出结果方法的输出结果。Company Logo注意:v抽象类因为功能没有定义完善,它是不能定义创建抽象类因为功能没有定义完善,它是不能定义创建实例的,如:实例的,如:Animal obj=new Animal();是错误的。是错误的。抽象类必须经过继承才能使用。抽象类必须经过继承才
10、能使用。v在某些情况下,可能需要定义不允许其他类继承的在某些情况下,可能需要定义不允许其他类继承的类,这种类被称为最终类,最终类用类,这种类被称为最终类,最终类用final关键字说关键字说明。从类的使用方式上可以看出,抽象类和最终类明。从类的使用方式上可以看出,抽象类和最终类在使用方式上正好相反,一个必须通过继承才能使在使用方式上正好相反,一个必须通过继承才能使用,一个不允许继承。因此,两个关键字不能同时用,一个不允许继承。因此,两个关键字不能同时修饰一个类。修饰一个类。v如果子类没有重写抽象父类中的全部方法,按照继如果子类没有重写抽象父类中的全部方法,按照继承的规则,抽象方法后被子类继承,子
11、类当然也会承的规则,抽象方法后被子类继承,子类当然也会成为抽象类。成为抽象类。Company Logo6.1.2接口(interface)v前面我们提到,为了利于软件工程的制作,使继承的类层次结构更清晰,可以使用抽象类来完成整体的设计工作。但因为Java不支持多继承,如果有时我们希望一个类能同时继承两个以上父类中的内容,以抽象类作为父类就力不从心了。这时,可以考虑使用接口来实现多继承的效果。v接口是一种“纯粹”的抽象类,只包含了抽象方法和常量的定义。这些抽象方法必须由其它子类来实现(implements),才能赋予方法新的功能。v接口的格式如下:v访问修饰符访问修饰符 interface 接口
12、名接口名vv 访问修饰符访问修饰符 存储修饰符存储修饰符静态常量;静态常量;v访问修饰符访问修饰符 存储修饰符存储修饰符抽象方法;抽象方法;vv说明:接口中的常量默认是public、static和final类型的,定义时无需指定这些属性;接口中的方法默认是public和abstract类型的,定义时也无需指定方法的这些属性;接口的访问修饰符与类的访问修饰符规则一致,若不写,缺省时为包内访问,但建议设为public,因为从接口的使用上看,接口只有被其它子类实现才有实际意义,为了调用方便,设为public较为合适。Java系统类库的接口都是public的。Company Logo6.1.2接口(i
13、nterface)v接口的使用:v子类实现接口时使用implements关键字,如果想实现多个接口,可以写入多个接口,接口名之间用逗号隔开。v格式为:v访问修饰符 存储修饰符 class 类名 implements 接口名1,接口名2v 例例6-2:定义一个接口,并定义相应的类实现接口中的方法。 DemoInterface.java 程序代码程序代码 interface Circle /定义接口Circle double PI=3.14159; /定义常量 void setRadius(double radius); /定义抽象方法 double getArea( ); /定义抽象方法/ 类D
14、emoInterface实现接口Circle中的方法,用关键字implementspublic class DemoInterface implements Circle double radius; /定义成员变量 Company Logo DemoInterface.java 程序代码程序代码 public void setRadius(double radius) /实现接口中的setRadius方法 this.radius=radius; public double getArea( ) /实现接口中的getArea( )方法 return (radius*radius*PI); pu
15、blic static void main(String args) DemoInterface di=new DemoInterface( ); /创建类对象di System.out.println(接口中定义的PI=+PI); /显示接口中的常量 di.setRadius(5.6); /设置半径 System.out.println(The area is +di.getArea( ); /显示圆面积 【运行结果运行结果】 接口中定义的接口中定义的PI=3.14159 The area is 98.52026239999998 Company Logo【代码说明】1程序中定义了接口程序中
16、定义了接口Circle,PI为接口中定义的常量。虽然为接口中定义的常量。虽然定义定义PI时只用了时只用了double指定常量的存储类型属性,指定常量的存储类型属性,但该常量默认应当是公共、静态的。在类但该常量默认应当是公共、静态的。在类DemoInterface中的中的main( )方法中可以直接使用方法中可以直接使用PI,恰恰说明恰恰说明PI是静态的,否则,不能直接使用。是静态的,否则,不能直接使用。3在类中实现两个接口中的方法时,给方法指定了在类中实现两个接口中的方法时,给方法指定了public属属性,其原因是接口中定义的方法默认为性,其原因是接口中定义的方法默认为public属性,属性,
17、实现这个接口的子类中重定义的该方法也必须指定实现这个接口的子类中重定义的该方法也必须指定public属性,否则编译时将提示错误信息,原因是:属性,否则编译时将提示错误信息,原因是:重写的方法不能比被重写的方法拥有更严格的访问权重写的方法不能比被重写的方法拥有更严格的访问权限(参考限(参考5.3.1节)。节)。2接口中定义的两个方法也只是指定了返回值类型,并没有接口中定义的两个方法也只是指定了返回值类型,并没有指定其他属性。但这两了方法是抽象方法,如果实现指定其他属性。但这两了方法是抽象方法,如果实现该接口的类该接口的类DemoInterface不实现其中的任何一个方不实现其中的任何一个方法,编
18、译时将提示:法,编译时将提示:DemoInterface should be declared abstract; it does not define,提示,提示DemoInterface类应为抽象类,并指出哪个方法没有类应为抽象类,并指出哪个方法没有定义。定义。4实现接口用关键字实现接口用关键字implements。一个类可以同时实现多。一个类可以同时实现多个接口,这可以解决类不能多重继承的问题个接口,这可以解决类不能多重继承的问题。Company Logo接口与抽象类的区别总结如下:Add Your TitleAdd Your TitleAdd Your Title1)接口是一种“纯粹”
19、的抽象类,它所有的方法都是抽象的(即只有声明,没有定义);而抽象类可以允许包含有定义的方法;2)子类实现接口用“implements”关键字;继承抽象类用“extends”关键字;3) 子类可以实现多个接口,但只能继承一个抽象类;4) 一个子类如果实现了一个接口,那么子类必须重写这个接口里的所有方法;抽象类的子类可以不重写抽象父类的所有方法,但这个子类会自然成为抽象类。Company Logo6.1.3 运行时多态运行时多态v前面5.1.3节中介绍了“多态”的概念,并且介绍了多态的分类(分为静态多态和动态多态),本节介绍动态多态(即运行时多态)。v运行时多态是指在运行时对重写方法进行调用的机制
20、,在运行时,JRE根据调用这个方法的实例类型来临时决定调用哪个类的方法。运行时多态用一句话概括就是:父类的引用可以指向子类的对象。见下例:v例例6-3:运行时多态行号行号 EmpDemo.java 程序代码程序代码 1abstract class Employee/雇员类,是抽象类int salary;/雇员薪水void setSalary(int salary)/设置薪水this.salary=salary;abstract void showSalary();/显示薪水,是抽象方法class Saler extends Employee/销售员类,是雇员类的子类Company LogoEm
21、pDemo.java 程序代码程序代码 12 void showSalary()/重写了父类的重写了父类的showSalary()方法方法System.out.println(销售员的月薪为:销售员的月薪为:¥+salary*8*30);class Manager extends Employee/经理类,是雇员类的子类经理类,是雇员类的子类void showSalary()/重写了父类的重写了父类的showSalary()方法方法System.out.println(经理的年薪为:¥经理的年薪为:¥+salary);public class EmpDemo /主类主类 public stat
22、ic void main(String args) Employee emp;/定义父类的引用定义父类的引用 emp=new Saler(); /父类的引用指向子类父类的引用指向子类Saler的实例的实例 emp.setSalary(15); Company Logov前面5.1.3节中介绍了“多态”的概念,并且介绍了多态的分类(分为静态多态和动态多态),本节介绍动态多态(即运行时多态)。v运行时多态是指在运行时对重写方法进行调用的机制,在运行时,JRE根据调用这个方法的实例类型来临时决定调用哪个类的方法。运行时多态用一句话概括就是:父类的引用可以指向子类的对象。见下例:v例例6-3:运行时多
23、态行号行号 EmpDemo.java 程序代码程序代码 1abstract class Employee/雇员类,是抽象类int salary;/雇员薪水void setSalary(int salary)/设置薪水this.salary=salary;abstract void showSalary();/显示薪水,是抽象方法class Saler extends Employee/销售员类,是雇员类的子类Company Logo12 void showSalary()/重写了父类的重写了父类的showSalary()方法方法System.out.println(销售员的月薪为:¥销售员的月
24、薪为:¥+salary*8*30);class Manager extends Employee/经理类,是雇员类的子类经理类,是雇员类的子类void showSalary()/重写了父类的重写了父类的showSalary()方法方法System.out.println(经理的年薪为:¥经理的年薪为:¥+salary);public class EmpDemo /主类主类 public static void main(String args) Employee emp;/定义父类的引用定义父类的引用 emp=new Saler(); /父类的引用指向子类父类的引用指向子类Saler的实例的实
25、例 emp.setSalary(15); emp.showSalary(); /显示销售员的月薪显示销售员的月薪 emp=new Manager();/父类的引用指向子类父类的引用指向子类Manager的实例的实例 emp.setSalary(50000); emp.showSalary(); /显示经理的年薪显示经理的年薪 Company Logo【运行结果】销售员的月薪为:¥3600经理的年薪为:¥50000注意:1接口Employee中的两个方法都是抽象的,因此两个子类Saler和Manager中必须要重写这两个方法。2两个子类Saler和Manager中方法的访问控制权限都设为publ
26、ic,是因为接口Employee中的方法默认访问控制权限都为public,而类继承时,子类重写方法的访问控制权限不能低于被重写的方法。Company Logo6.2 包(package)6.2.1声明包6.2.2编译36.2.3导入包46.2.4包实例46.2.6访问包36.2.5使用使用Java提供的系统包提供的系统包Company Logo6.2.1使用Java提供的系统包java.lang包包是包含了是包含了Java语言的基本核心类的包,如:语言的基本核心类的包,如:1)、数据类型包装类:)、数据类型包装类:Double、Float、Byte、Short、Integer、Long、Boo
27、lean等;等;2)、基本数学函数)、基本数学函数Math类;类;3)、字符串处理的)、字符串处理的String类和类和StringBuffer类;类;4)、异常类)、异常类Runtime;5)、线程)、线程Thread类、类、ThreadGroup类、类、Runnable类;类;6)、)、System,Object 、Number、Cloneable、Class、ClassLoader、Package类等。类等。java.awt包包是存放是存放AWT(Abstract Window Toolkit抽象窗口工具包)组件类的包,如:抽象窗口工具包)组件类的包,如:组件组件Button,TextF
28、ield类等,以及绘图类类等,以及绘图类Grahpics,字体类,字体类Font,事件子包,事件子包event包。包。java.awt.event包包是是awt包的一个子包,存放用于事件处理的相关类和监听接口,如:包的一个子包,存放用于事件处理的相关类和监听接口,如:ActionEvent类,类,MouseEvent类,类,KeyListener接口等。接口等。java.applet包包是是Applet类的支持包,包中还有支持类的支持包,包中还有支持Applet媒体播放的媒体播放的AudioClip接口。接口。包包Company Logo 6.2.2声明包声明包v声明包用关键字声明包用关键字p
29、ackage,该语句必须是类文件的第一条语句,该语句必须是类文件的第一条语句,具体格式如下:具体格式如下:vpackage 包名标示符;包名标示符;v表示该类属于由包名标示符指定的包。实际上,包名和存放类表示该类属于由包名标示符指定的包。实际上,包名和存放类文件的目录名存在一定的关系,包名必须和目录名相同。例如:文件的目录名存在一定的关系,包名必须和目录名相同。例如:源文件源文件Calculate.java放在放在“c:mysrc”目录中,如果想将编目录中,如果想将编译成的类文件译成的类文件Calculate.class打包在打包在mysrc包中,类定义的包中,类定义的方法如下:方法如下:vp
30、ackage mysrc;vpublic class Calculate v如果源文件中没有如果源文件中没有package语句,则默认情况下,此源文件会语句,则默认情况下,此源文件会打包到当前源文件所在的目录下。另外,类的修饰符打包到当前源文件所在的目录下。另外,类的修饰符public指指明该类可以被包以外的类访问,如果不加明该类可以被包以外的类访问,如果不加public,类只能被同,类只能被同一包中的类访问。一包中的类访问。Company Logo 6.2.3编译编译v包编译的基本格式如下:包编译的基本格式如下:vDOS提示符提示符 javac -d 目录名目录名 源文件名源文件名v-d参数
31、表示源文件编译后生成的类文件所在的包的位置参数表示源文件编译后生成的类文件所在的包的位置v假设有源文件假设有源文件Calculate.java放在放在“c:mysrc”目录中,它的目录中,它的简要源代码如简要源代码如6.2.2节所示,那么编译这个源文件的格式为:节所示,那么编译这个源文件的格式为:vDOS提示符提示符 javac -d c: Calculate.javavCalculate.java编译完成后会生成编译完成后会生成mysrc文件夹,文件夹,-d参数指定参数指定将此文件夹放置在将此文件夹放置在c:目录下,最后的文件目录结构为:目录下,最后的文件目录结构为:c: mysrc Cal
32、culate.classv当然在实际操作中,我们也可以自行建立文件夹当然在实际操作中,我们也可以自行建立文件夹mysrc,然后,然后将将Calculate.java复制到这个文件夹中再编译,效果与使用复制到这个文件夹中再编译,效果与使用-d参数相同参数相同。Company Logo 6.2.4导入包导入包v导入包成员使用导入包成员使用import关键字,语法有以下关键字,语法有以下3种:种:v1)import 包名包名.*; (使用通配符使用通配符*,导入包中的通用类和接口,导入包中的通用类和接口,不含子包不含子包)v2)import 包名包名.类名类名; (导入包中指定的类导入包中指定的类)
33、v3)import 父包名父包名.子包名子包名.*; (导入父包内子包中的通用类和接口导入父包内子包中的通用类和接口)vimport语句的位置在语句的位置在package语句之后,类定义之前,例如:语句之后,类定义之前,例如:vpackage mypack;vimport mysrc.*;vclass Demo 注意:注意:java.lang包是唯一在编译过程中自动导入的包,无需用包是唯一在编译过程中自动导入的包,无需用import导入。导入。v当然,在导入包进行编译和运行之前,必须要让编译器和当然,在导入包进行编译和运行之前,必须要让编译器和JRE能识别你的包,这需要配置能识别你的包,这需要
34、配置classpath变变量,配置的过程可以参考后面的示例。量,配置的过程可以参考后面的示例。v如果程序中调用使用频率不高的类,给出包封装的全名也可,可以不需如果程序中调用使用频率不高的类,给出包封装的全名也可,可以不需import导入,例如:导入,例如:v1)创建包)创建包mysrc中的类中的类Calculate的实例:的实例:vmysrc.Calculate cal=new mysrc.Calculate( );v2)获取一个随机整数:)获取一个随机整数:vint i=java.lang.Math.random( );v因为因为java.lang包是自动导入的,可以省略,所以表达式也可以写
35、成包是自动导入的,可以省略,所以表达式也可以写成int i=Math.random( );Company Logo6.2.5 访问包访问包v访问包成员的格式为:访问包成员的格式为: 包名包名.类名类名v访问包成员多见于下面两种情况:运行时和程序源代码调用。但访访问包成员多见于下面两种情况:运行时和程序源代码调用。但访问格式都是一样的。问格式都是一样的。v例如:例如:v运行时访问包成员格式:运行时访问包成员格式:DOS提示符提示符java 包名包名.类名;类名;v程序源代码调用包成员格式:包名程序源代码调用包成员格式:包名.类名类名.类成员类成员v如上例:如上例:java.lang.Math.r
36、andom( );v编译和访问包成员的形式相对比较复杂,读者可以参考下节和配套编译和访问包成员的形式相对比较复杂,读者可以参考下节和配套实践教材的完整示例。实践教材的完整示例。6.2.6 包实例包实例v本节示例是一个尽可能简单的包应用实例,其它相对复杂的包应用本节示例是一个尽可能简单的包应用实例,其它相对复杂的包应用可以参考配套实践教材的完整示例。可以参考配套实践教材的完整示例。Company Logo 6.2.6包实例包实例例例6-4: package mypackage; public class Calculate public int sum(int x,int y)return x+
37、y;import mypackage.Calculate;public class PackageDemo public static void main(String args) Calculate cal=new Calculate();int a=3,b=4;System.out.println(a+b+=+cal.sum(3,4); 【运行结果运行结果】3+4=Company Logo 6.3访问控制访问控制6.3.1 private类中被限定为私有(类中被限定为私有(private)的成员只能被这个类本身的方法访问。)的成员只能被这个类本身的方法访问。6.3.2 缺省访问缺省访问类成
38、员不作任何访问控制修饰时为缺省访问状态,缺省访问控制符时成员只能被同类成员不作任何访问控制修饰时为缺省访问状态,缺省访问控制符时成员只能被同一包内的类访问。一包内的类访问。6.3.3 protected类中被限定为保护(类中被限定为保护(protected)的成员能被这个类的子类的方法访问,而不必关心)的成员能被这个类的子类的方法访问,而不必关心子类与父类是否处于同一包中。需要特殊注意的是,同一包的非子类也可以子类与父类是否处于同一包中。需要特殊注意的是,同一包的非子类也可以访问父类的访问父类的protected成员,就是说成员,就是说protected访问权限包括缺省访问的所有访问权限包括缺
39、省访问的所有情况。情况。6.3.4 public类中被限定为公有(类中被限定为公有(public)的成员能被其它类无限制的访问,而不必在乎访问类)的成员能被其它类无限制的访问,而不必在乎访问类是否为子类或与被访问类在同一包中。当在包外访问某类的成员属性时,只是否为子类或与被访问类在同一包中。当在包外访问某类的成员属性时,只有有public成员支持成员支持“对象名对象名.成员名成员名”的访问格式。的访问格式。6.3.5 访问修饰示例访问修饰示例Company Logo 6.3.5访问修饰示例访问修饰示例例例6-5:包访问中访问修饰符的作用:包访问中访问修饰符的作用vpackage mypacka
40、ge;vpublic class Pack /试试去掉试试去掉vpublicpublic int data=3; /试试将试试将public去掉,或改为去掉,或改为protected,privatevimport mypackage.Pack;vpublic class PackAccess vPack pack=new Pack();vvoid showPackData()vSystem.out.println(packs data is:+pack.data);v public static void main(String args) v PackAccess obj=new PackA
41、ccess(); obj.showPackData(); v v【运行结果运行结果】packs data is:Company Logo 6.4内部类(内部类(Inner Class)“内部类内部类”是指嵌套定义在另一个类内部的类。例如:是指嵌套定义在另一个类内部的类。例如:class OuterClassclass InnerClass内部类与一般类的定义格式相同,也包含成员变量和成员方法。而内部类内部类与一般类的定义格式相同,也包含成员变量和成员方法。而内部类整体又可以当作外部类(整体又可以当作外部类(Outer class)的一个成员使用,这样就可)的一个成员使用,这样就可以调用外部类的
42、成员,所以正确使用内部类,可以使程序更加简单、以调用外部类的成员,所以正确使用内部类,可以使程序更加简单、易读。易读。理解内部类与父子类之间的区别:理解内部类与父子类之间的区别:逻辑关系继承类(父子类之间)是内部类(内外类之间)有子类是父类的逻辑关系继承类(父子类之间)是内部类(内外类之间)有子类是父类的一个特例,例如:雇员类是经理类的超类,那么可以说经理是雇员。一个特例,例如:雇员类是经理类的超类,那么可以说经理是雇员。而内部类可看作为外部类的一部分,例如:飞机类中有内部类引擎而内部类可看作为外部类的一部分,例如:飞机类中有内部类引擎类,那么可以说飞机上有引擎,但不能说引擎就是飞机。类,那么
43、可以说飞机上有引擎,但不能说引擎就是飞机。了解内、外部类的调用关系:了解内、外部类的调用关系:Company Logo例例6-6:class OuterClassString str;boolean outerClassAccessible;InnerClass in;public OuterClass()str=new String(OuterClass variable);outerClassAccessible=true;InnerClass in=new OuterClass.InnerClass();System.out.println(str);System.out.println
44、(外部类外部类访问外部类成员访问外部类成员:+outerClassAccessible);System.out.println(外部类外部类访问内部类成员访问内部类成员:+in.innerClassAccessible);class InnerClassString str;boolean innerClassAccessible;public InnerClass()str=new String(InnerClass variable);Company LogoinnerClassAccessible=true;System.out.println(str);System.out.print
45、ln(内部类内部类访问外部类成员访问外部类成员:+outerClassAccessible);System.out.println(内部类内部类访问内部类成员访问内部类成员:+innerClassAccessible);class InnerClassDemopublic static void main(String args)OuterClass out=new OuterClass(); 【运行结果】InnerClass Company Logo 6.5匿名类(匿名类(Anonymous Class)“匿名类”顾名思义就是“没有名字的类”。一般情况下,如果想使用类的成员,要先义并创建类的
46、一个实例,然后利用实例名操作类的成员。如本章示例6-4 PackAccess.java文件的第11、12行代码:PackAccess obj=new PackAccess();obj.showPackData();其中obj就是类实例的名字,也就是引用名。在随后的代码中如果再想要操作此实例,就可以使用obj引用名使用来代替。在某些编程场合下,可以简化以上步骤。比如,要使用的方法继承自某个接口或类,而且操作这些方法的实例在本类中只出现一次,就可以用匿名类来简化编程步骤。例如,以下代码是JCreator中默认Application工程的一个事件处理的代码片断,用来为设置窗口的关闭功能: this.
47、addWindowListener (new WindowAdapter() public void windowClosing(WindowEvent e) System.exit(0); ); Company Logo 例例6-7:为窗口设置关闭功能:为窗口设置关闭功能import java.awt.*;import java.awt.event.*;public class MyFrame extends Frame public class WindowAdapter2 extends WindowAdapter /自定义内部类自定义内部类public void windowClosi
48、ng(WindowEvent e)System.out.println(window has closed!);System.exit(1);public MyFrame() this.addWindowListener(new WindowAdapter2(); /添加监视器添加监视器this.setTitle(test Anonymous Class);/设置窗口标题文字设置窗口标题文字this.setSize(300,300); /设置窗口大小设置窗口大小this.setVisible(true); /设置窗口可见性设置窗口可见性 public static void main(Stri
49、ng args) new MyFrame(); Company Logo 例例 6-8:import java.awt.*;import java.awt.event.*;public class MyFrame extends Frame public MyFrame() this.addWindowListener ( new WindowAdapter() public void windowClosing(WindowEvent e) System.exit(0); ); this.setTitle(test Anonymous Class);this.setSize(300,300);this.setVisible(true); public static void main(String args) new MyFrame(); LOGO