所以我来自C ++,据我所知,Java import ...;
语句与我们的#include <...>
语句非常相似。
但是,虽然#include
使用“D:\ Insert \ Directory \ Name \ Here”形式的文件目录,但“com.example.something背后的含义。import
中使用的“对我来说很困惑。
问题:
答案 0 :(得分:3)
“反向URL语法”是关于如何安排包结构的Java约定;我们的目标是Java包是半通用的,这个想法是,如果每个组织在与该组织的网站相对应的包中编码,那么就不存在名称空间冲突。
一般来说,与C ++不同,Java中的import
绝对不是必需的。您可以编写完整的Java文件,如
class MyList extends java.util.AbstractList<MyClass> {
public void forEach(java.util.function.Consumer<? super MyClass> consumer) {
...
}
}
只需明确限定一切。但这实际上是不可读的,因此每个人都会导入他们想要引用的类,并通过他们的非限定名称引用它们(例如,在此示例中为AbstractList
和Consumer
)。
答案 1 :(得分:2)
Java中的#include
语句和C ++中的import
指令看起来看似相似,但实际上是非常不同的。 import
语句实际上并不会导致读取Java文件(这可以通过编译和类路径完成,即在命令行上为Java编译器指定的参数);相反,#include
语句只是用于避免在整个代码中使用完全限定名称的语法糖(否则,任何不在当前包中的类都需要完全限定名称)。相比之下,#ifndef ... #endif
不仅加载文件,而且通过盲目替换来实现,无论文件是否已被包含(这是标题通常包含package dagger
包括警卫的原因,尽管重复粘贴内容,但要防止标题内容多次处理。
Java包中使用的反向URL表示法是一种用于避免不同作者在库之间发生冲突的约定。这里的想法是,为了防止供应商/作者之间的名称冲突,您需要一些集中注册;使用现有的域名注册系统允许Java将该冲突避免卸载到现有系统而不是重新发明轮子。但是,这纯粹是惯例。包非必要与域相关联;例如,Dagger依赖注入系统使用package io.github.google.dagger
而不是#include "D:\Insert\Directory\Name\Here"
(即使后者是遵循使用反向域的标准约定时将使用的包名称。)
请注意,在C ++和Java中,使用绝对路径实际上被认为是不好的做法。也就是说,在C ++中,如果你一直在做#include "relative/path/to/headerfile.h"
......事实上,这不是一个好的工程实践。在C ++中,最好执行"D:\Path\To\Directory"
并通过编译器命令行指定header1 header2 header3
data data data
data data data
Amount: value
Shipping Cost: value
Total Amount: value
是开始搜索的根目录之一。这同样适用于Java。也就是说,通常,路径相对于存储库中的各种根,并且编译器的调用指示这些存储库目录的位置。这确保了代码是自包含和密封的,仅指存储库/项目中的其他代码(而不是恰好在系统上的任意代码/路径)。在Java中,这种搜索机制称为“类路径”;在C ++中,这是特定于编译器的,但是使用GNU C ++编译器,-I和-L标志允许您指定include目录和lib目录的路径,这些目录和lib目录用于定位要包含的头和要链接的库。
答案 2 :(得分:1)
com.example.something.here在java中意味着你在com / example / something / here中使用了一些java类,其中每个目录都被认为是一个包.....它是用来使用一些java的代码com / example / something / here
中的类