本课程解释了如何将类和接口捆绑到包中,如何使用包中的类,以及如何安排文件系统以便编译器可以找到源文件。

创建和使用包

为了使类型更易于查找和使用,避免命名冲突和控制访问,程序员将相关类型的组捆绑到包中。

定义:包是一组提供访问保护和名称空间管理的相关类型,请注意,类型引用类、接口、枚举和注解类型,枚举和注解类型分别是特殊的类和接口,因此在本课中通常将类型简称为类和接口。

作为Java平台一部分的类型是按功能捆绑类的各种包的成员:基础类在java.lang中,用于读写的类(输入和输出)在java.io中,依此类推,你也可以将类型放入包中。

假设你编写了一组表示图形对象的类,例如圆形、矩形、线条和点,你还可以编写一个Draggable接口,如果类可以使用鼠标拖动,则可以实现这个接口。

//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语句放在每个源文件的顶部,该文件包含要包含在包中的类型(类、接口、枚举和注解类型)。

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语句,则类型最终会出现在未命名的包中,一般来说,一个未命名的包只适用于小型或临时应用程序,或者刚刚开始开发过程,否则,类和接口属于命名包。

命名包

随着全世界程序员使用Java编程语言编写类和接口,很多程序员可能会对不同类型使用相同的名称,事实上,前面的例子就是这样:当java.awt包中已经有一个Rectangle类时,它定义了一个Rectangle类,尽管如此,编译器允许两个类在不同的包中具有相同的名称。每个Rectangle类的完全限定名称包括包名称,也就是说,graphics包中Rectangle类的完全限定名称是graphics.Rectanglejava.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文件。


上一篇:泛型的限制
下一篇:使用包成员

博弈
2.5k 声望1.5k 粉丝

态度决定一切