原文:http://zetcode.com/lang/java/packages/
在 Java 教程的这一部分中,我们将讨论 Java 包。
包是一组相关类型的组合,提供访问保护和名称空间管理。 Java 中的包与 C# 中的名称空间类似。
使用 Java 创建包
使用package关键字声明包。 该语句必须放在每个源文件的顶部。 每个源文件中只能有一个这样的语句。 Java 源文件必须放在与包名称匹配的目录中。
package com.zetcode;
使用上述包的文件中定义的所有类型都是com.zetcode包的一部分。 类Being具有完全限定的名称com.zetcode.Being。 全球有数百万的 Java 程序员。 为避免潜在的名称冲突,Java 中有一个命名约定。 包名称使用反向互联网域名。 字母以小写字母书写。 只能有一个zetcode.com域名,因此对于包使用反向名称com.zetcode将使它们唯一。 带有com.zetcode包的 Java 源文件必须位于com/zetcode子目录中。 包名称以小写形式编写,以避免与类或接口的名称冲突。
import关键字在源文件的开头用于指定类型(类,接口,枚举或注解)或以后要引用的整个 Java 包,而不在引用中包含它们的包名称。 从 Java SE 5.0 开始,import语句可以导入类的静态成员(方法和变量)。
import java.awt.*;
使用*通配符,我们可以一次导入整个包。 导入后,我们可以引用所有java.awt包类型,而无需使用其全限定名。
import java.awt.event.*;
java.awt.event子包未随java.awt.*导入一起导入。 子包必须独立导入。
import java.util.Random;
在这种情况下,仅导入Random类。 现在可以使用其简单的类名来引用Random类。
Java8 中的核心包
以下是 Java8 中的核心包的列表:
java.lang— 基本语言功能和基本类型java.util— 集合数据结构类java.io- 用于文件操作的 Java APIjava.math— 多精度算术java.nio— Java 的非阻塞 I/O 框架java.net— 网络操作,套接字,DNS 查找,…java.security— 密钥生成,加密和解密java.sql— 用于访问数据库的 Java 数据库连接(JDBC)java.awt— 本机 GUI 组件的基本包层次结构javax.swing— 与平台无关的丰富 GUI 组件的包层次结构java.applet- 用于创建小程序的类java.beans- 包含与开发 bean 有关的类-基于 JavaBean 架构的组件。java.text— 提供用于以独立于自然语言的方式处理文本,日期,数字和消息的类和接口。java.rmi— 用于远程方法调用的 Java API。java.time— 日期,时间,瞬间和持续时间的主要 API。
java.lang包不使用导入语句即可使用。
实际例子
以下示例显示了如何创建包和导入类型。
Packages.java
package com.zetcode;import java.util.Random;public class Packages {public static void main(String[] args) {Random r = new Random();int x = r.nextInt();System.out.println(x);java.util.Calendar c = java.util.Calendar.getInstance();System.out.println(c.getTime());}}
该示例使用两种类型:Random类和Calendar类。 第一类是导入的,第二类是由其完全限定的名称引用的。
package com.zetcode;
我们用package关键字声明一个包。 Packages.java文件必须位于com/zetcode子目录中。
import java.util.Random;
此代码行使我们可以使用不带包名称的Random类。
Random r = new Random();
在这里,我们使用Random而不使用其全名。
java.util.Calendar c = java.util.Calendar.getInstance();
如果我们没有在类型上使用import关键字,则在本例中只能使用其全名-java.util.Calendar来引用它。 import关键字可以节省很多打字时间。
$ ls com/zetcode/Packages.java
Packages.java源文件位于com/zetcode子目录中。 包名称必须反映目录结构。
$ javac com/zetcode/Packages.java
我们使用javac工具编译源文件。 该工具从com/zetcode目录的父目录中调用。
$ java com.zetcode.Packages179489124Thu Jan 19 20:53:08 CET 2017
这是com.zetcode.Packages程序的输出。
Java 包级别可见性
如果我们未指定任何访问修饰符(例如private,protected或public),那么我们将获得包私有的可见性。 在这种情况下,变量和方法可在同一包中访问。 其他包中的类无法访问通过包私有访问声明的类和成员。
Java 默认包
如果未声明任何包,则该文件中定义的所有类型都是默认未命名包的一部分。 建议始终将您的类型放在包装中。 即使是小型程序。
DefaultPackage.java
public class DefaultPackage {public static void main(String[] args) {System.out.println("A class in a default package");}}
DefaultPackage类是默认包的一部分。
$ lsDefaultPackage.java
如果未指定包,则不会将源文件放置在特定的子目录中。
$ javac DefaultPackage.java$ java DefaultPackageA class in a default package
我们编译代码并运行应用。 源文件和字节码位于当前工作目录中。
Java 自动导入
Java 编译器自动导入两个包:java.lang和当前包。
Constants.java
package com.zetcode;public class Constants {public static final String version = "1.0";}
Constants类与引用其版本成员的AutomaticImports位于同一包中。
AutomaticImports.java
package com.zetcode;public class AutomaticImports {public static void main(String[] args) {String os = System.getProperty("os.name");System.out.println(os);System.out.println(Constants.version);}}
在此示例中,我们引用了 Java 编译器自动导入的一些类。
String os = System.getProperty("os.name");
String和System类是java.lang包的一部分。
System.out.println(Constants.version);
Constants类与AutomaticImports类位于同一包中。 因此,我们可以访问类及其成员,而无需使用完全限定的名称或使用import关键字。
$ ls com/zetcode/AutomaticImports.java Constants.java
AutomaticImports.java和Constants.java文件都位于同一子目录中。
$ javac com/zetcode/AutomaticImports.java com/zetcode/Constants.java
这两个文件都被编译。
$ java com.zetcode.AutomaticImportsLinux1.0
这是com.zetcode.AutomaticImports程序的示例输出。
Java 静态导入
如果我们经常使用一些静态成员,则可以稍后使用import static语句来引用它们,而无需使用完整的类名。 静态导入应谨慎使用。
StaticImport.java
package com.zetcode;import static java.lang.Math.E;import static java.lang.Math.PI;import static java.lang.Math.abs;public class StaticImport {public static void main(String[] args) {System.out.println(E);System.out.println(PI);System.out.println(abs(-5));}}
在此示例中,我们引用两个常量和一个静态方法。
import static java.lang.Math.E;import static java.lang.Math.PI;import static java.lang.Math.abs;
我们使用import static语句启用不带全名的引用。
System.out.println(E);System.out.println(PI);System.out.println(abs(-5));
我们引用这三个成员时没有其类名。
$ java com.zetcode.StaticImport2.7182818284590453.1415926535897935
这是com.zetcode.StaticImport程序的输出。
本章介绍了 Java 中的包。 我们已经展示了如何在包中组织代码。
