跳转到内容

100% developed
来自维基教科书,开放的书籍,开放的世界

导航 语言基础 主题:v  d  e )


如果您的应用程序变得相当大,您可能会有很多类。尽管您可以按字母顺序浏览它们,但这会变得很混乱。因此,您的应用程序类可以被分类到中。

包是一个命名空间,主要包含类和接口。例如,标准类ArrayList位于包java.util中。对于此类,java.util.ArrayList被称为其完全限定名,因为这种语法没有歧义。不同包中的类可以具有相同的名称。例如,您有两个类java.util.Datejava.sql.Date,它们是不一样的。如果在类中没有声明任何包,则其包是默认包。

包声明

[编辑 | 编辑源代码]

在类中,包声明位于源代码的顶部,使用关键字package

Computer code 代码清单 3.14:BusinessClass.java
package business;

public class BusinessClass {
}

如果你的类是在一个包中声明的,比如 business,你的类必须放置在应用程序文件夹根目录下的一个名为 business 的子文件夹中。这是编译器和类加载器在文件系统中查找 Java 文件的方式。你可以在一个子包中声明你的类,比如 engine。所以完整的包是 business.engine,并且类必须放置在 business 子文件夹中的一个名为 engine 的子子文件夹中(而不是在一个名为 business.engine 的文件夹中)。

导入和类使用

[编辑 | 编辑源代码]

使用包中声明的类的最简单方法是在类名前面加上它的包名

Example 代码段 3.88:包声明。
business.BusinessClass myBusinessClass = new business.BusinessClass();

如果你正在从同一个包中的类使用该类,你不需要指定包名。如果另一个包中存在具有相同名称的类,它将使用本地类。

上面的语法有点冗长。你可以使用 import Java 关键字在文件顶部导入类,然后只指定它的名称

Computer code 代码清单 3.15:MyClass.java
import business.BusinessClass;

public class MyClass {
  public static void main(String[] args) {
    BusinessClass myBusinessClass = new BusinessClass();
  }
}

注意,你不能在两个不同的包中导入两个具有相同名称的类。

IntegerString 属于包 java.lang,但它们不需要导入,因为 java.lang 包在所有类中都是隐式导入的。

通配符导入

[编辑 | 编辑源代码]

可以使用星号导入整个包

Example 代码段 3.89:通配符导入。
import javax.swing.*;

虽然这看起来很方便,但如果出现打字错误,可能会导致问题。例如,如果你使用上面的导入来使用 JFrame,但然后输入 JFraim frame = new JFraim();,Java 编译器将报告一个类似于“无法找到符号:JFraim”的错误。即使它看起来像是被导入了,编译器会在你第一次提到 JFraim 时给出错误报告,而这时你的代码已经进行了一半,而不是在你导入 JFrame 以及 javax.swing 中所有其他内容的地方。

如果你将其改为 import javax.swing.JFraim;,错误将在导入处出现,而不是在代码中。

此外,如果你 import javax.swing.*;import java.util.*;,并且 javax.swing.Queue 在 Java 的未来版本中被添加,你使用 Queue(java.util)的代码将无法编译。这个特定的例子不太可能发生,但如果你正在使用非 Oracle 库,它发生的可能性更大。

包约定

[编辑 | 编辑源代码]

包名应该以小写字符开头。这有助于区分包名和类名。在一些操作系统中,目录名不区分大小写。因此包名应该小写。

Java 包需要在不同厂商之间保持唯一性,以避免命名冲突。为此,厂商通常使用反转的域名。这样可以保证唯一性。例如,一家名为“您的公司有限公司”的公司可以使用类似于这样的包名:com.yourcompany.yourapplicationname.yourmodule.YourClass

从 .jar 文件导入包

[编辑 | 编辑源代码]

如果你正在导入位于 .jar 文件中的库包和类,你必须确保该文件在当前类路径中(在编译和执行时)。除了这个要求之外,导入这些包和类与它们位于完整的扩展目录结构中时相同。

例如,要编译和运行项目顶层目录中的一个类(包含两个目录 /source/libraries),你可以使用以下命令

Computer code 编译
$ javac -classpath libraries/lib.jar source/MainClass.java

然后运行它,类似地

Computer code 执行
$ java -classpath libraries/lib.jar source/MainClass

以上是简化的,并且要求 MainClass 在默认包中,或者在名为 source 的包中,这不是很理想。

使用 BlueJ,只需点击“工具、首选项、库”,然后逐个添加 .jar 文件。

类加载/包

[编辑 | 编辑源代码]

Java 中一个类的运行时标识由其完全限定类名及其定义的类加载器决定。这意味着同一个类,由两个不同的类加载器加载,在虚拟机看来是两种完全不同的类型。



华夏公益教科书