Javaのimport
ステートメントとC++の#include
ディレクティブは、誤って同様に見えますが、実際は非常に異なります。 import
ステートメントは、実際にJavaファイルを読み取らせることはありません(コンパイルとクラスパスの両方で実行されます。つまり、コマンドラインでJavaコンパイラに指定されたパラメータです)。むしろ、import
ステートメントは、コード全体で完全修飾名を使用することを避けるために使用される単なる構文上の砂糖です(そうでなければ、現在のパッケージに含まれていないクラスに対しては完全修飾名が必要です)。対照的に、#include
は、ファイルを読み込むだけでなく、ファイルが既に含まれているかどうかに関係なく、ブラインド置換によって行います(ヘッダーの内容が一般的には#ifndef ... #endif
に含まれているため、その内容が繰り返しペーストされているにもかかわらず、複数回処理されている)。
Javaパッケージで使用される逆URL表記は、異なる著者によるライブラリ間の衝突を避けるために使用される規則です。ここでの考え方は、ベンダーと著者の間の名前の衝突を防ぐためには、集中登録が必要だということです。既存のドメイン名登録システムを使用することで、Javaは、ホイールを再開発するのではなく、既存のシステムにその衝突回避をオフロードすることができます。しかし、これはまったく慣習である。パッケージがドメインと相関することは厳密には必要ではありません。たとえば、Dagger依存性注入システムでは、package io.github.google.dagger
ではなく、package dagger
が使用されます(後者は、逆ドメインを使用する標準的な規則に従う場合に使用されるパッケージ名です)。
C++とJavaの両方で、絶対パスを使用することは、実際には悪い方法であることに注意してください。つまり、C++では、もしあなたがしていたら、#include "D:\Insert\Directory\Name\Here"
...これは実際には良い工学的な習慣ではありません。 C++では、#include "relative/path/to/headerfile.h"
を実行し、コンパイラのコマンドラインで"D:\Path\To\Directory"
が検索を開始するルートディレクトリの1つであることを指定する方が適切です。 Javaでも同様です。つまり、一般に、パスはリポジトリのさまざまなルーツに関連し、コンパイラの呼び出しはこれらのリポジトリディレクトリの場所を示します。これにより、コードは自己完結型でハーメチックであり、リポジトリ/プロジェクト内の他のコード(システム上に存在する任意のコード/パスではない)のみを参照します。 Javaでは、この検索メカニズムは「クラスパス」と呼ばれます。 C++では非常にコンパイラ固有ですが、GNU C++コンパイラでは、-Iと-Lフラグを使用すると、インクルードするヘッダとライブラリをリンクするためのインクルードディレクトリとlibディレクトリへのパスを指定できます。
これはQ&Aサイトの幅広いトピックです。言語を使うことを学ぶときに学ぶコアコンセプトです。例えば。 Javaチュートリアル:https://docs.oracle.com/javase/tutorial/java/package/usepkgs.htmlを参照してください。基本的な研究をして、特定の質問に戻ってきたら、それはいいでしょう。 –