跳转至

Java 包

原文: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 API
  • java.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.Packages 
179489124
Thu Jan 19 20:53:08 CET 2017

这是com.zetcode.Packages程序的输出。

Java 包级别可见性

如果我们未指定任何访问修饰符(例如privateprotectedpublic),那么我们将获得包私有的可见性。 在这种情况下,变量和方法可在同一包中访问。 其他包中的类无法访问通过包私有访问声明的类和成员。

Java 默认包

如果未声明任何包,则该文件中定义的所有类型都是默认未命名包的一部分。 建议始终将您的类型放在包装中。 即使是小型程序。

DefaultPackage.java

public class DefaultPackage {

    public static void main(String[] args) {

        System.out.println("A class in a default package");   
    }    
}

DefaultPackage类是默认包的一部分。

$ ls
DefaultPackage.java

如果未指定包,则不会将源文件放置在特定的子目录中。

$ javac DefaultPackage.java 
$ java DefaultPackage 
A 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");

StringSystem类是java.lang包的一部分。

System.out.println(Constants.version);    

Constants类与AutomaticImports类位于同一包中。 因此,我们可以访问类及其成员,而无需使用完全限定的名称或使用import关键字。

$ ls com/zetcode/
AutomaticImports.java  Constants.java

AutomaticImports.javaConstants.java文件都位于同一子目录中。

$ javac com/zetcode/AutomaticImports.java com/zetcode/Constants.java

这两个文件都被编译。

$ java com.zetcode.AutomaticImports 
Linux
1.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.StaticImport 
2.718281828459045
3.141592653589793
5

这是com.zetcode.StaticImport程序的输出。

本章介绍了 Java 中的包。 我们已经展示了如何在包中组织代码。



回到顶部