|
|
本帖最后由 pansong291 于 2019-4-9 12:55 编辑
上篇:49.异常(三)---面向对象
下篇:51.访问控制---面向对象
注意:如果你的回复只是“感谢分享”、“辛苦了”之类的与教程内容无关的字眼,还请不要回复本帖,谢谢合作!!!
注意:如果你的回复只是“感谢分享”、“辛苦了”之类的与教程内容无关的字眼,还请不要回复本帖,谢谢合作!!!
注意:如果你的回复只是“感谢分享”、“辛苦了”之类的与教程内容无关的字眼,还请不要回复本帖,谢谢合作!!!
读者可以想一想,sun 公司的 JDK,系统软件商,开发工具商都会提供成千上万个具有
各种用途的类,我们也要管理自己的大型软件系统中数目众多的类。如果不对这些类进行分
门别类的使用和存放,就象我们不用文件夹去管理众多的文件一样,在使用时将极度困难和
不方便,也极易出现类的命名冲突问题。Java 是通过引入包(package)机制,提供类的多层
类命名空间,来解决上述问题的。
package 语句及应用
我们还是通过一段程序来开始 package 的讲解:
package org.it315;
public class TestPackage
{
public static void main(String [] args)
{
new Test().print();
}
}
class Test
{
public void print()
{
System.out.println("the program is demostrating how to using package!");
}
}
上面的程序第一条语句,指示这个源文件中的所有类都位于包 org.it315 中,位于包中
的每个类的完整名称都应该是包名与类名的组合,如上面的类 TestPackage 的完整名称应是
org.it315.TestPackage。
同一个包中的类相互访问,不用指定包名,如程序中的 TestPackage 类访问 Test 类时,
用的是 Test,而不是 org.it315.Test。如果从外部访问一个包中的类,必须使用类的完整
名称。就好比北京人说:“我要去一趟上海!”,如果说成“我要去一趟中国﹒上海!”,同是中
国的两个城市,使用时非要加个中国前缀,也是行得通的,但让人听来就有点像卖国贼了。
美国纽约人则必须说:“我要去一趟中国﹒上海!”,因为这是两个不同国家的城市。
位于在包中的类,在文件系统中(通俗地说,就是硬盘上)的存放
位置,必须有与包名层次相对应的目录结构。在 package 语句中,用点(.)来指明包的
层次,如:
package org.it315;
这个语句表示有一个 org 的包,该包中包含有一个名为 it315 的子包。如上面的程
序,类 TestPackage 就在 it315 子包中,我们假设 TestPackage.java 源文件所在目录
的名称为 C:\myjava,我们需要在 C:\myjava 目录中创建一个 org 的子目录,在 org 子
目录中又要创建一个 it315 子目录,TestPackage.class 文件就要位于 it315 目录中,
如图 4.3 所示:
正常编程开发过程中,java源文件的目录也必须与包所指定的目录相同。
脚下留心:
即使文件名都是 TestPackage.class,但其中包含的类的完整名称却不见得相
同,如 org.it315.TestPackage 类与 com.sun.TestPackage 类的文件名都是
TestPackage.class,但却是两个完全不同的类,应存放在不同的目录结构中。
提示:很多初学者常常误以为把一个类放在某个目录下,就等于这个目录名就成了
这个类的包名。再次强调,不是有了目录结构,就等于有了包名,包名必须在程序中通
过 package 语句指定,而不是靠目录结构来指定的,是先要有了包名后,才需要相应的
目录结构。
有关包的其他细节:
package 语句作为 Java 源文件的第一条语句,指明该文件中定义的类所在的包,必须把
包声明放在源文件的最前面,每个源文件只能声明一个包。
如果没有 package 语句,则为缺省无名包。但实际项目应用中,没有使用无名包的类,
读者就把这当着是一个硬性规定吧,相信我,这不仅是一个良好的编程习惯,而且有助你在
日后实际工作中避免许多可能碰到的麻烦。
import 语句及应用
了解完 package 语句的作用,我们来看看不同包的类之间是如何调用的。我们将
TestPackage.java 中的两个类放到不同的包中,按我们前面所讲,我们需要两个单独的.java
源文件来容纳这两个类,程序如下:
程序清单 1:TestPackage.java
package org.it315;
public class TestPackage
{
public static void main(String [] args)
{
new Test().print(); //标记 1
}
}
程序清单 2:Test.java
package org.it315.example;
public class Test
{
public void print()
{
System.out.println("the program is demostrating how to using package!");
}
}
编译器报错:
出错的原因在于:在类 TestPackage 中直接调
用类 Test,编译器认为这两个类应在同一包中,即类 Test 完整名称为 org.it315.Test,实
际上,我们是找不到这个类的。我们将标记 1 处的语句修改成:
new org.it315.example.Test().print();
就一切正常了。
如果我们要在程序中多次用到 org.it315.example 包中的若干类名,我们每次用到其中
的类名时,都要加上 org.it315.example 前缀,显然有点儿繁琐。在 java 中是使用 import
语句来简化这个问题的。
我们修改 TestPackage.java 源文件的程序代码,如下:
package org.it315;
import org.it315.example.*;
//import org.it315.example.Test;
public class TestPackage
{
public static void main(String [] args)
{
new Test().print(); //标记 1
}
}
这个例子已经向读者显示了 import 语句的作用。有了 import
语句,我们在使用某个包里的类时,就不用写上一长串包名了(如
org.it315.example.Test)。我们也可以去掉第二行的注释,然后注释掉第一行,
发现是完全一样的。那么上面粗体的两行 import 语句有什么不一样呢?
第一个 import 语句,导入了整个包中的所有类,那么我们的程序中凡是遇到的
org.it315.example 包中的类,都不用再写包名了,只需写一个类名就可以了。第二个 import
语句只导入了该包中的 Test 类,对该包中的其他类不起作用,在程序中用到 Test 类时,我
们不用写包名了,但对于该包中的其他类,我们还必须写上完整的包名。
如果两个包中都含有同样的类名,如 java.util、java.sql 这两个包中都有 Date 这个
类,程序又同时导入了这两个包中的所有类,如:
import java.util.*;
import java.sql.*;
这时候程序就不知道该用哪个包里面的 Date 类,编译器在碰到使用 Date 类的地方就会
报错。对于这种情况,我们就需要在用到这个特殊的类的地方写上完整的包名,如
new java.sql.Date()。
多学两招:
父 包 和 子 包 之 间 , 能 从 语 意 上 表 示 某 种 血 缘 和 亲 近 关 系 , 如 org.it315.*,
org.it315.mail.*,从包名上可以看出这些类都是 it315 这个组织(或公司)开发的类,
org.it315.mail.* 还能更进一步地说明其中的类是专用于 mail 项目的。但父包和子包在使
用上没有任何关系,如父包中的类调用子包中的类,必须引用子包的全名,而不能省略父包
名部分。另外,当我们 import 了一个包中所有的类,并不会 import 这个包中的子包中的类,
如果程序中用到了子包的类,需要再次对子包作单独引入,如我们以后经常会见到在同一程
序中,经常同时出现下面的两条语句。
import java.awt.*;
import java.awt.event.*;
JDK 中的常用包
Sun 公司在 JDK 中为我们提供了大量的各种实用类,通常称之为 API(application
programming interface),这些类按功能不同分别被放入了不同的包中,供我们编程使用,
下面简要介绍其中最常用的六个包:
1. java.lang----包含一些 Java 语言的核心类,如 String、Math、Integer、System和 Thread,
提供常用功能。
2. java.awt----包含了构成抽象窗口工具集(abstract window toolkits)的多个类,这
些类被用来构建和管理应用程序的图形用户界面(GUI)。
3. java.applet----包含 applet 运行所需的一些类。
4. java.net----包含执行与网络相关的操作的类。
5. java.io----包含能提供多种输入/输出功能的类。
6. java.util----包含一些实用工具类,如定义系统特性、使用与日期日历相关的函数。
注:java1.2 以后的版本中,java.lang 这个包会自动被导入,对于其中的类,不需要使用
import 语句来做导入了,如我们前面经常使用的 System 类。
上篇:49.异常(三)---面向对象
下篇:51.访问控制---面向对象 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|