Java包和.Net程序集是否等价?

41

我是一名.NET开发人员,开始学习Android的Java开发,想知道是否可以将Java包看作.NET程序集。

5个回答

63

不。

最好的比较对象是Java Archive (Jar)文件。Java使用包(package)来控制命名空间,这与C#的命名空间非常相似。

以下是我如何比较这两个环境:

Java                    .Net
====                    ====
Class                   Class
Package                 Namespace
Jar                     Assembly

1
我要补充的是,.Net中的程序集比Java中的Jar具有更微妙的访问修饰符(至少我是这样理解的)。 这个答案解释了其中一个细节:https://dev59.com/12HVa4cB1Zd3GeqPqMzz#9808237 - Fuhrmanator

5

不,我认为Java包更类似于命名空间。

而程序集更像是一个jar文件(我对Java比.NET更熟悉...如果我说错了,请纠正我)。


2
没有任何东西能阻止我通过创建一个新的包将类添加到java.lang命名空间。打破检查异常的一种方法就是在编译时执行此操作(覆盖Exception和RuntimeException)。 - Joshua
@Joshua,将类添加到java.lang包中只有在将该类放入自己的jar文件中才可能实现。这也仅适用于添加的类。如果您试图替换Exception类,我不确定是否可能,因为即使没有定义CLASSPATH,JRE也会自行加载它。 - Kelly S. French
3
@Joshua: 我不确定你的意思,也不知道为什么你的评论会被点赞。将类添加到java.lang“命名空间”(不确定你对命名空间的定义是什么)并不需要“创建一个新包”。事实上,“从Java的角度来看,创建一个新包”甚至没有意义;包不是一个实体,而是一个命名结构。 - Mark Peters
1
@Joshua:但就那些恶意、好玩或巫术一类的事情来说,我认为这是可能的,但没有什么可以阻止你覆盖Exception和RuntimeException...你首先需要覆盖引导类装载器。 - Mark Peters
@Mark:在运行时确实是这样,但编译器并不知道。而我所遵循的特定过程只需要在编译时进行覆盖,而非运行时。 - Joshua

1

Java包就像.NET中的命名空间。

在Java中,相当于程序集的是jar文件。


1
Java中的包通常只是类和接口的命名空间,实际上意味着特定的目录结构。有时,.jar文件也被称为包。这可能是最接近程序集的东西了。.jar文件还可以包含其他数据,如图像,或者基本上是任何类型的文件,因为它只是一个带有一些特定内容结构的zip文件。
无论如何:通常在与“Java”相关的“包”中阅读时,指的是某种命名空间(通过文件夹结构,例如:com.mycompany.myproject)。一些构建工具将构建.jar文件的过程称为“打包”,这并没有什么帮助。

1
请注意,我远非Java专家,但无论如何,以下是我的看法:

正如其他答案所指出的那样,一个包并不等同于一个程序集。然而,我并不完全同意.jar文件就等同于程序集的观点。 对我来说,Java类(包含在.class文件中)比.jar文件更接近程序集。我这么说是因为,虽然CLR的加载单元是程序集(这意味着该程序集中包含的所有类都会被加载),但JVM的加载单元是一个类(当JVM需要一个类时,ClassLoader并不会加载容器jar中的所有类,它只会加载那个特定需要的类)。

您可以在此处阅读有关Java类加载的更多信息: JVM何时加载类?

以及在这里: http://www.lansa.com/support/notes/p0294.htm


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接