本课程解释了如何将类和接口捆绑到包中,如何使用包中的类,以及如何安排文件系统以便编译器能够找到源文件。java
为了使类型更易于查找和使用,避免命名冲突和控制访问,程序员将相关类型的组捆绑到包中。程序员
定义:包是一组提供访问保护和名称空间管理的相关类型,请注意,类型引用类、接口、枚举和注解类型,枚举和注解类型分别是特殊的类和接口,所以在本课中一般将类型简称为类和接口。
做为Java平台一部分的类型是按功能捆绑类的各类包的成员:基础类在java.lang
中,用于读写的类(输入和输出)在java.io
中,依此类推,你也能够将类型放入包中。编程
假设你编写了一组表示图形对象的类,例如圆形、矩形、线条和点,你还能够编写一个Draggable
接口,若是类可使用鼠标拖动,则能够实现这个接口。segmentfault
//in the Draggable.java file public interface Draggable { ... } //in the Graphic.java file public abstract class Graphic { ... } //in the Circle.java file public class Circle extends Graphic implements Draggable { . . . } //in the Rectangle.java file public class Rectangle extends Graphic implements Draggable { . . . } //in the Point.java file public class Point extends Graphic implements Draggable { . . . } //in the Line.java file public class Line extends Graphic implements Draggable { . . . }
你应该将这些类和接口捆绑在一个包中,缘由有多种,包括:编程语言
要建立包,请为包选择一个名称,将包含该名称的package
语句放在每一个源文件的顶部,该文件包含要包含在包中的类型(类、接口、枚举和注解类型)。code
package
语句(例如,package graphics;
)必须是源文件中的第一行,每一个源文件中只能有一个package
语句,它适用于文件中的全部类型。对象
若是将多个类型放在单个源文件中,则只有一个能够是公共的,而且它必须与源文件具备相同的名称,例如,你能够在文件Circle.java
中定义public class Circle
,在文件Draggable.java
中定义public interface Draggable
,在文件Day.java
中定义public enum Day
,依此类推。能够在与公共类型相同的文件中包含非公共类型(强烈建议这样作,除非非公共类型很小且与公共类型密切相关),但只有公共类型能够从包外部访问,全部顶级非公开类型都将是包私有。接口
若是将上一节中列出的图形接口和类放在名为graphics
的包中,则须要六个源文件,以下所示:开发
//in the Draggable.java file package graphics; public interface Draggable { . . . } //in the Graphic.java file package graphics; public abstract class Graphic { . . . } //in the Circle.java file package graphics; public class Circle extends Graphic implements Draggable { . . . } //in the Rectangle.java file package graphics; public class Rectangle extends Graphic implements Draggable { . . . } //in the Point.java file package graphics; public class Point extends Graphic implements Draggable { . . . } //in the Line.java file package graphics; public class Line extends Graphic implements Draggable { . . . }
若是不使用package
语句,则类型最终会出如今未命名的包中,通常来讲,一个未命名的包只适用于小型或临时应用程序,或者刚刚开始开发过程,不然,类和接口属于命名包。get
随着全世界程序员使用Java编程语言编写类和接口,不少程序员可能会对不一样类型使用相同的名称,事实上,前面的例子就是这样:当java.awt
包中已经有一个Rectangle
类时,它定义了一个Rectangle
类,尽管如此,编译器容许两个类在不一样的包中具备相同的名称。每一个Rectangle
类的彻底限定名称包括包名称,也就是说,graphics
包中Rectangle
类的彻底限定名称是graphics.Rectangle
,java.awt
包中Rectangle
类的彻底限定名是java.awt.Rectangle
。
除非两个独立的程序员为其包使用相同的名称,不然这颇有效,是什么防止了这个问题?公约。
包名称所有小写,以免与类或接口的名称冲突。
公司使用其反向的互联网域名来开始其包名 — 例如,com.example.mypackage
用于由example.com
的程序员建立的名为mypackage
的包。
在单个公司内发生的名称冲突须要经过公司内的约定来处理,多是经过在公司名称后面包含区域或项目名称(例如,com.example.region.mypackage
)。
Java语言自己的包以java.
或javax.
开头。
在某些状况下,互联网域名可能不是有效的包名,若是域名包含连字符或其余特殊字符,若是包名称以数字或其余字符开头,这些字符非法用做Java名称的开头,或者若是包名称包含保留的Java关键字,例如“int
”,则会发生这种状况,在这种状况下,建议的约定是添加下划线,例如:
域名 | 包名称前缀 |
---|---|
hyphenated-name.example.org | org.example.hyphenated_name |
example.int | int_.example |
123name.example.com | com.example._123name |
要为类型建立包,请将package
语句做为包含类型(类、接口、枚举或注解类型)的源文件中的第一个语句。
要使用不一样包中的公共类型,你有三种选择:(1)使用类型的彻底限定名称,(2)导入类型,(3)导入类型为成员的整个包。
包的源文件和类文件的路径名称反映了包的名称。
你可能必须设置CLASSPATH
,以便编译器和JVM能够找到类型的.class
文件。