Java程序设计电子教案第四章.ppt
《Java程序设计电子教案第四章.ppt》由会员分享,可在线阅读,更多相关《Java程序设计电子教案第四章.ppt(71页珍藏版)》请在三一办公上搜索。
1、第4章 包和接口,4.1 包4.2 访问保护4.3 引入包4.4 接口,4.1 包,在编制大程序的时候,常常会定义许多不同用途的类。如何更好地将这些类组织起来,是一个很重要的问题。这不仅可以使程序整体清晰条理,还可以使其他项目中对这些类的引用更为方便。为此,Java引入了包的概念。包是类的容器,用于保证类名空间的一致性,例如,可以在自己的包内创建一个名为List的类而不会与别人创建的其他List类重名。由于Java是一种网络编程语言,支持在Internet上动态装载模块,因此它特别注意避免名字空间的冲突。可以认为包是一个名字空间,在该空间中,除了方法重载的情形外,同一个相同类型(类、接口、变量
2、和方法)的名字只能出现一次。而各包之间出现重名,这时系统依靠包名对重名的标识符进行区分。实际上,在程序中使用的每一个变量和方法都隐含地用全限定名进行访问。限定名的组成方式为:格式包名.类名.变量名或方法名,下一页,返回,4.1 包,4.1.1 定义包创建一个包只需要包含一个package命令作为一个Java源文件的第一句就可以了。该文件中定义的任何类将属于指定的包。package语句定义了一个存储类的名字空间。如果你省略package语句,类名被输入一个默认的没有名称的包。尽管默认包对于短的例子程序很好用,但对于实际的应用程序它是不适当的。多数情况,程序编写者需要为自己的代码定义一个包。下面是
3、package声明的通用形式:package pkg;这里,pkg是包名。例如,下面的声明创建了一个名为MyPackage的包。package MyPackage;,上一页,下一页,返回,4.1 包,Java用文件系统目录来存储包。例如,任何你声明的MyPackage中的一部分的类的.class文件被存储在一个MyPackage目录中。记住这种情况是很重要的,目录名必须和包名严格匹配。多个文件可以包含相同package声明。package声明仅仅指定了文件中定义的文件属于哪一个包。它不拒绝其他文件的其他方法成为相同包的一部分。多数实际的包伸展到很多文件。你可以创建包层次。为做到这点,只要将每个
4、包名与它的上层包名用点号“.”分隔开就可以了。一个多级包的声明的通用形式如下:package pkg1.pkg2.pkg3;,上一页,下一页,返回,4.1 包,包层次一定要在Java开发系统的文件系统中有所反映。例如,一个由下面语句定义的包:package java.awt.image;需要在你的UNIX、Windows或Macintosh文件系统的 java/awt/image,javaawtimage或java:awt:image中分别保存。一定要仔细选用包名。你不能在没有对保存类的目录重命名的情况下重命名一个包。,上一页,下一页,返回,4.1 包,4.1.2 编译和运行包在介绍运用包的例
5、子之前,我们有必要先来讲解一下类路径环境变量。因为Java编译器考虑特定位置作为包层次的根被类路径(CLASSPATH)控制。如果我们没有用到package语句,我们可以在同样的未命名的默认包中保存所有的类。这样做允许你仅仅通过在命令行键入类名编译源文件和运行Java解释器,并得到结果。这种情况下它还会工作是因为默认的当前工作目录(.)通常在类路径环境变量中为Java运行时间默认定义。然而,当有包参与时,事情就不这么简单了,如果用package语句指明一个包,则包的层次结构必须与文件目录的层次相同。,上一页,下一页,返回,4.1 包,例如,我们在test目录下创建了一个名为packTest的类
6、放在包test中,然后保存在文件packTest.java中。对该文件进行编译后,得到字节码文件packTest.class。如果我们直接在test目录下运行javapackTest,解释器返回”cant find class packTest”(找不到类packTest),因为这时类packTest处于包test中,对它的引用应为test.packTest,于是我们运行java test.packTest,但解释器仍然返回“cant find class testpackTst”(找不到类 testpackTest)。这时我们可以查看CLASSPATH,发现它的值为.;C:javaclass
7、es,表明Java解释器在当前目录和Java类库所在目录c:javaclasses查找,也即在testtest目录下查找类packTest,因此找不到,改正的方法可以有两种:,上一页,下一页,返回,4.1 包,(1)在test的上一级目录运行java test.packTest。(2)修改CLASSPATH,使其包括当前目录的上一级目录。由此可以看出,运行一个包中的类时,必须指明包含这个类的包,而且要在适当的目录下运行,同时正确地设定环境变量CLASSPATH,使解释器能够找到指定的类。例4-1:一个简短的包的例子,我们试试下面简单的包:package MyPack;class Balance
8、 String name;double bal;,上一页,下一页,返回,4.1 包,Balance(String n,double b)name=n;bal=b;void show()if(bal);System.out.println(name+:$+bal);,上一页,下一页,返回,4.1 包,class AccountBalance public static void main(String args)Balance current=new Balance3;current0=new Balance(K.J.Fielding,123.23);current1=new Balance(W
9、ill Tell,157.02);current2=new Balance(Tom Jackson,-12.33);for(int i=0;i3;i+)currenti.show();,上一页,下一页,返回,4.1 包,称该文件名为 AccountBalance.java,把它存放在MyPack目录中。接着,编译文件。确信结果文件.class同样在MyPack目录中。然后用下面的命令行执行AccountBalance类:java MyPack.AccountBalance这时我们需要注意,当你执行该命令时你必须在MyPack的上级目录,或者把类路径环境变量设置成合适的值。如上所述,Accoun
10、tBalance现在是MyPack包的一部分。这意味着它不能自己执行。也就是说你不能用下面的命令行:java AccountBalanceAccountBalance必须和它的包名一起使用。,上一页,返回,4.2 访问保护,前面已经学习了Java的访问控制机制的很多方面和它的访问说明符。例如,你已经知道一个类的private成员仅可以被该类的其他成员访问。包增加了访问控制的另一个维度。如你所看到的,Java提供很多级别的保护以使在类、子类和包中有完善的访问控制。类和包都是封装和容纳名称空间和变量及方法范围的方法。包就像盛装类和下级包的容器。类就像是数据和代码的容器。类是Java的最小的抽象单元
11、。因为类和包的相互影响,Java将类成员的可见度分为四个种类:相同包中的子类相同包中的非子类不同包中的子类既不在相同包又不在相同子类中的类,下一页,返回,4.2 访问保护,三个访问控制符,private、public和protected,提供了多种方法来产生这些种类所需访问的多个级别,表4-1总结了它们之间的相互作用。Java的访问控制机制看上去很复杂,我们可以按下面方法简化它。任何声明为public的内容可以被从任何地方访问。被声明成private的成员不能被该类外看到。如果一个成员不含有一个明确的访问说明,它对于子类或该包中的其他类是可见的。这是默认访问。如果你希望一个元素在当前包外可见,
12、但仅仅是元素所在类的子类直接可见,把元素定义成protected。表4-1仅适用于类成员。一个类只可能有两个访问级别:默认的或是公共的。如果一个类声明成public,它可以被任何其他代码访问。如果该类默认访问控制符,它仅可以被相同包中的其他代码访问。下面是一个访问的例子:,上一页,下一页,返回,4.2 访问保护,下面的例子显示了访问修饰符的所有组合。该例有两个包和五个类。记住这两个不同包中的类需要被存储在以它们的包p1、p2命名的目录下。第一个包定义了三个类:Protection,Derived,和 SamePackage。第一个类以合法的保护模式定义了四个int变量。变量n声明成默认受保护型
13、。n_pri是private型,n_pro是protected,n_pub是public的。该例中每一个后来的类试图访问该类一个实例中的变量。根据访问权限不编译的行用单行注释/。在每个这样的行之前都是列举该级保护将允许访问的地点的注释。第二个类,Derived是同样包p1中Protection类的子类。这允许Derived访问Protection中的除n_pri以外的所有变量,因为它是private。第三个类,SamePackage,不是Protection的子类,但是是在相同的包中,也可以访问除n_pri以外的所有变量。,上一页,下一页,返回,4.2 访问保护,下面是Protection.j
14、ava文件:package p1;public class Protection int n=1;private int n_pri=2;protected int n_pro=3;public int n_pub=4;public Protection()System.out.println(base constructor);System.out.println(n=+n);System.out.println(n_pri=+n_pri);System.out.println(n_pro=+n_pro);System.out.println(n_pub=+n_pub);,上一页,下一页,返
15、回,4.2 访问保护,下面是Derived.java文件:package p1;class Derived extends Protection Derived()System.out.println(derived constructor);System.out.println(n=+n);/class only/System.out.println(n_pri=+n_pri);System.out.println(n_pro=+n_pro);System.out.println(n_pub=+n_pub);,上一页,下一页,返回,4.2 访问保护,下面是SamePackage.java文件
16、:package p1;class SamePackage SamePackage()Protection p=new Protection();System.out.println(same package constructor);System.out.println(n=+p.n);/class only/System.out.println(n_pri=+p.n_pri);System.out.println(n_pro=+p.n_pro);System.out.println(n_pub=+p.n_pub);,上一页,下一页,返回,4.2 访问保护,下面是另一个包p2的源代码。p2中
17、定义的两个类重载了另两种受访问控制影响的情况。第一个类Protection2是p1.Protection的子类。这允许访问p1.Protection中除n_pri(因为它是private的)和n之外的所有变量,n是定义成默认保护型的。记住,默认型的只能允许类中或包中的代码访问。最后,OtherPackage类只访问了一个变量n_pub,它是定义成public型的。下面是Protection2.java文件:package p2;class Protection2 extends p1.Protection Protection2()System.out.println(derived othe
18、r package constructor);/class or package only/System.out.println(n=+n);,上一页,下一页,返回,4.2 访问保护,/class only/System.out.println(n_pri=+n_pri);System.out.println(n_pro=+n_pro);System.out.println(n_pub=+n_pub);下面是OtherPackage.java文件:package p2;class OtherPackage OtherPackage()p1.Protection p=new p1.Protect
19、ion();System.out.println(other package constructor);,上一页,下一页,返回,4.2 访问保护,/class or package only/System.out.println(n=+p.n);/class only/System.out.println(n_pri=+p.n_pri);/class,subclass or package only/System.out.println(n_pro=+p.n_pro);System.out.println(n_pub=+p.n_pub);,上一页,下一页,返回,4.2 访问保护,如果你希望试试
20、这两个包,下面是两个可以用的测试文件。包p1的测试文件如下:/Demo package p1.package p1;/Instantiate the various classes in p1.public class Demo public static void main(String args)Protection ob1=new Protection();Derived ob2=new Derived();SamePackage ob3=new SamePackage();,上一页,下一页,返回,4.2 访问保护,p2的测试文件如下:/Demo package p2.package p
21、2;/Instantiate the various classes in p2.public class Demo public static void main(String args)Protection2 ob1=new Protection2();OtherPackage ob2=new OtherPackage();,上一页,返回,4.3 引入包,包的存在是划分不同类的很好的机制,了解为什么所有Java内部的类都存在包中是很简单的。在未命名的默认包中是没有核心Java类的;所有的标准类都存储在相同的包中。既然包中的类必须包含它们的包名才能完全有效,为每个你想用的包写一个长的逗点分离
22、的包路径名是枯燥的。因为这点,Java包含了import语句来引入特定的类甚至是整个包。一旦被引入,类可以被直呼其名的引用。import语句对于程序员是很方便的而且在技术上并不需要编写完整的Java程序。如果你在程序中将要引用若干个类,那么用import语句将会节省很多打字时间。Import语句的功能是引入包或包中的类。从表面上看import语句与C语言的include语句类似,但它们的作用是不同的。include语句是将后面指定的文件实际读入到所在的位置,而import语句并不将包实际读入,它只是指示编译器可以到指定的包中去寻找类、方法等。所有的Java类可以通过指定全限定名的方式使用,但使
23、用import语句后,可以使类名、方法名的引用变得简单。,下一页,返回,4.3 引入包,在Java源文件中,可以有任意多个import语句,它们必须位于package语句(如果有的话)与这个文件中的类或接口之间。下面是import语句的般格式:格式import包名1.包名2.包名3.(类名|*);说明该语句中,包具有一定层次结构,最后以显式方式指定一个类名或*号,*号表示Java编译器应该引入整个包。下面是引入包的一些例子:;Import java.lang.*;*号方式可能会增加编译时间,特别是在引入一个大包时。因此,比较好的办法是显式地引入要用到的类,而不是整个包。不过,*号对运行时间的性
24、能或生成的类文件大小没有丝毫影响。,上一页,下一页,返回,4.3 引入包,所有Java包含的标准Java类都存储在名为java的包中。基本语言功能被存储在java包中的java.lang包中。通常,你必须引入你所要用到的每个包或类,但是,既然Java在没有java.lang中的很多函数时是无用的,因此通过编译器为所有程序隐式引入java.lang是有必要的。这与下面的在你所有程序开头的一行是一样的:import java.lang.*;如果在你用星号形式引用的两个不同包中存在具有相同类名的类,编译器将保持沉默,除非你试图运用其中的一个。这种情况下,你会得到一个编译时错误并且必须明确的命名指定包
25、中的类。任何你用到类名的地方,你可以使用它的全名,全名包括它所有的包层次。例如,下面的程序使用了一个引入语句:,上一页,下一页,返回,4.3 引入包,import java.util.*;class MyDate extends Date 没有import语句的例子如下:class MyDate extends java.util.Date 如表4-1中所示,当一个包被引入,仅仅是该包中声明成public的项目可以在引入代码中对非子类可用。例如,如果你希望前面显示的MyPack包中的Balance类在MyPack外可以被独立的类运用,那么你需要声明它为public型,并把它存在自己的文件中,如
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java 程序设计 电子 教案 第四
![提示](https://www.31ppt.com/images/bang_tan.gif)
链接地址:https://www.31ppt.com/p-6510018.html