Java 包:如何使用包构建 Java 代码项目
Java 中的包用于组织您的代码文件并防止命名空间冲突(其中两个类具有相同的名称)。
让我们看一个简单的例子。下面的示例假设您使用的是 Windows 平台,但 Java 在 UNIX 上的工作方式大致相同。
java包的使用
假设我们在一个名为c:work的目录中。
我们将在一个名为aquarium的包中放置一些代码。aquarium包本身就是一个Caveofprogramming包的子包。
我们将代码放在aquarium的一个子目录中,该子目录本身位于一个名为caveofprogramming的目录中。
所以目录结构如下所示:
工作目录:c:work
Java 代码:c:workcaveofprogrammingaquariumFish.java
代码(Fish.java):
package caveofprogramming.aquarium;
public class Fish {
public static void main(String [] args) {
System.out.println("hello");
}
}
请注意,在该文件的顶部,我们有一个包声明,说明Fish类位于名为aquarium的包中,该包是Caveofprogramming的子包。
现在,在c:work中,我们可以键入以下内容来编译 Fish.java:
javac caveofprogrammingaquariumFish.java
现在,我们如何运行这个程序?我们从哪里运行它?
这个问题的神奇答案是:我们可以从任何地方运行它。唯一的问题是我们必须告诉 java 期望在c:work中找到类。此外,我们必须告诉 java 运行Caveofprogramming.aquarium.Fish,为编译后的类提供其完全限定的名称。
有两种方法可以设置“class path”,它告诉 java 在哪些目录中查找类。
-
-
- 设置 CLASSPATH 环境变量。这是一个分号分隔的路径列表,java 应该在其中查找类。
- 将命令行上的类路径指定为 java(如果您正在使用,则在 IDE 中设置它)。
-
我们将在这里采用第二种方法。从我们喜欢的任何地方,我们输入命令:
C:>java -cp c:work caveofprogramming.aquarium.Fish
hello
如您所见,程序运行
请注意,当我们向 javac 提供文件名时,我们指定了实际文件——完整的以普通斜线分隔的目录路径和 .java 文件扩展名。
但是,一旦类编译完成,我们就不再使用目录或文件扩展名来引用编译后的类文件。相反,我们只使用点来形成包的“path”和类的名称,而不是包含它的文件:
( caveofprogramming.aquarium.Fish )
简而言之,javac处理文件,而java处理类。
强烈推荐
海量程序代码,编程资源,无论你是小白还是大神研究借鉴别人优秀的源码产品学习成熟的专业技术强势助力帮你提高技巧与技能。在此处获取,给你一个全面升级的机会。只有你更值钱,才能更赚钱
如果你是初级程序员可以研究别人的代码提高技术,如果你喜欢搞网盟或者外包,可以让你快速建站,还等什么赶快关注吧,我们会持续输出相关资源
多个类路径
如果你有几个类路径上的类怎么办?
首先,让我们看看编译一个应用程序,其中一些文件在一个类路径上,而其他文件在另一个类路径上。
我修改了 Fish.java 以使用另一个包中的 Java 类。这个包也是Caveofprogramming的一个子包,叫做stuff而不是aquarium(你应该为自己的包选择更具想象力的名字!)。
我们像这样导入stuff包中的所有类:
import Caveofprogramming.stuff.*;
…我们也可以像这样导入一个特定的类:
import Caveofprogramming.stuff.Bubble;
这是完整的代码。
Fish.java:
package caveofprogramming.aquarium;
import caveofprogramming.stuff.*;
public class Fish {
public static void main(String [] args) {
Bubble bubble = new Bubble();
bubble.blow();
}
}
Bubble.java 看起来像这样:
package caveofprogramming.stuff;
public class Bubble {
public void blow() {
System.out.println("Blowing bubbles!");
}
}
假设我们将 Bubble.java 放在名为c:workclasses的文件夹下。
由于它在Caveofprogramming.stuff包中,它实际上需要放在c:workclasses的一个Caveofprogrammingstuff子目录中。 所以现在我们有两个文件,如下 :我们需要告诉它c:work和c:workclasses下都有文件。
不需要指定 Bubble.java 本身;类路径和包名是 javac 找到它所需的全部内容。
所以从c:work我们可以发出以下命令;请注意以分号分隔的类路径列表:
javac -cp c:work;c:workclasses CaveofprogrammingaquariumFish.java
java 命令和之前完全一样,除了我们还需要指定额外的类路径(否则它怎么知道在哪里找到 Bubble.class?)。
java -cp c:work;c:workclasses Caveofprogramming.aquarium.Fish
在 Jar 文件中使用代码
如果您将一些类打包在一个 jar 文件中怎么办?
让我们进入c:workclasses并输入以下内容(如上编译以创建 Bubble.class 文件之后):
jar cvf test.jar Caveofprogramming
然后我们将test.jar移动到c:work。
现在我们可以像这样编译 Fish.java:
javac -cp c:work;c:worktest.jar CaveofprogrammingaquariumFish.java
只需在类路径中命名test.jar。
同样,当我们想要运行 Fish.class 时,我们可以再次将 jar 文件添加到类路径并从任何地方运行代码:
C:work>java -cp c:work;test.jar caveofprogramming.aquarium.Fish
Blowing bubbles!
将程序放入 Jar 文件中
当然,我们也可以将主类本身放在一个jar文件中(当然是在编译之后!):
c:work> jar cvf fish.jar caveofprogramming
added manifest
adding: caveofprogramming/(in = 0) (out= 0)(stored 0%)
adding: caveofprogramming/aquarium/(in = 0) (out= 0)(stored 0%)
adding: caveofprogramming/aquarium/Fish.class(in = 358) (out= 265)(deflated 25%)
adding: caveofprogramming/aquarium/Fish.java(in = 201) (out= 144)(deflated 28%)
所以现在我们把主程序放在fish.jar中,test.jar包含main.jar依赖的其他文件。我们可以这样运行程序:
java -cp c:worktest.jar;c:workfish.jar caveofprogramming.aquarium.Fish
Blowing bubbles!
常见问题FAQ
- 程序仅供学习研究,请勿用于非法用途,不得违反国家法律,否则后果自负,一切法律责任与本站无关。
- 请仔细阅读以上条款再购买,拍下即代表同意条款并遵守约定,谢谢大家支持理解!