2016-04-06 13 views
-6

私はC++から来ており、私が知る限り、Java import ...;ステートメントは#include <...>ステートメントと非常によく似ています。しかしJavaの "インポート"ステートメントの意味

#include「D:\挿入\ディレクトリ\名\ここで」の形式でファイルディレクトリを使用しながらimportで使用されるよう「com.example.something.here」の背後にある意味が混乱している、私に。

質問:

  1. 誰かがこの奇妙な逆URL構文が実際に何を意味するのか(素人の用語で)私に説明してください、と
  2. は、私はこの文を使用することができます方法の例を提供することができ他のファイルからリソースにアクセスしますか?
+5

これはQ&Aサイトの幅広いトピックです。言語を使うことを学ぶときに学ぶコアコンセプトです。例えば。 Javaチュートリアル:https://docs.oracle.com/javase/tutorial/java/package/usepkgs.htmlを参照してください。基本的な研究をして、特定の質問に戻ってきたら、それはいいでしょう。 –

答えて

1

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ディレクトリへのパスを指定できます。

3

「逆URL構文」は、パッケージ構造の配置方法に関するJavaの規約です。目標は、Javaパッケージが半永久的にユニークであることです。つまり、すべての組織がその組織のWebサイトに対応するパッケージをコーディングすると、名前空間の衝突は発生しません。

一般に、C++とは異なり、Javaのimportは決して厳密には必要ありません。

class MyList extends java.util.AbstractList<MyClass> { 
    public void forEach(java.util.function.Consumer<? super MyClass> consumer) { 
    ... 
    } 
} 

のようなJavaファイル全体を明示的に修飾するだけで、すべてのJavaファイルを作成できます。しかし、それは事実上判読できないので、誰もが参照したいクラスをインポートし、それらを無修飾の名前で参照します(この例ではAbstractListConsumer)。

1

com.example.something.hereはJavaでcom/example/something /ここでいくつかのjavaクラスを使用していることを意味します。ここで各ディレクトリはパッケージと見なされます.....