Java の「インポート」は C/C++ の「#include」と同じように動作しますか? 具体的には、インポートするライブラリ全体が含まれますか、それとも後続のコードで呼び出されるクラスとメソッドのみが含まれますか?
9 に答える
#include
ライブラリもクラスもモジュールも「インポート」しません。
この#include
ディレクティブは、別のテキスト ファイル (ソース) の内容を含めるようにプリプロセッサに指示するだけです。それで全部です。
ファイル A とファイル B の前処理の結果は#include
、1 つのファイルであるかのようにコンパイラに渡され、ファイル B はファイル A の#include
ディレクティブが配置された位置に貼り付けられます。
これを明確に述べると、これはすべて、コンパイル、コード生成の前に発生します。
副作用として、C/C++ プリプロセッサをコンパイラから独立して使用して、あらゆる種類のテキスト ファイル入力を処理することができました。
「実際には C/C++ 言語の一部ではない」などのプリプロセッサ ステートメント#include
は、コンパイラに渡されることはないため、C/C++ でプログラムを記述するのに本質的に必要ないため、と主張する人もいるかもしれません。
import
インポートするものがないため、式は (標準) C/C++ プログラミングのコンテキストでは使用されません。
C/C++ モジュールは、コンパイル前にソース レベルで、またはコンパイル後にリンカーによってまとめられます。
Java では、 を使用する場合import
、次のいずれかをインポートします。
- 単一のクラス:
import foo.bar.Baz
- フルパッケージ:
import foo.bar.*
- クラスの単一の静的メンバー:
import static foo.bar.Baz.GRUT
- クラスのすべての静的メンバー:
import static foo.bar.Baz.*
C/C++#include
ディレクティブは前処理段階で発生し、平易な英語では、「この場所に、パラメーターとして指定されたヘッダー ファイル全体 (または必要に応じて任意のテキスト ファイル) を貼り付ける」ことを意味します。新しい C++ 標準には (最終的に) モジュールがあり、Java のインポートに似ている場合と似ていない場合があります (実装方法によって異なります)。この C++ 提案の詳細: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3347.pdf
Java 8 では、モジュラー プログラミングのサポートも改善されます。参照: http://openjdk.java.net/projects/jigsaw/
cに関して他の回答がクリアしていない可能性のある側面の1つは、
include in c は、関数プロトタイプを含むプリプロセッサ フェーズのヘッダー ファイルをコピーするだけで、それ以上はコピーしません。実際の関数定義は、基本コードのコンパイル後、リンク時にまだ配置されています。
ソース ファイルではなくヘッダー ファイルをインクルードし、コードから関数を呼び出すことで、簡単な検証を行うことができます。コンパイル エラーは発生せず、リンク時にのみ、定義が見つからないというエラーが表示されます。
import (Java の場合) は using (C++ の場合) に似ています。
import は、現在のクラスで使用されているクラス (またはサブパッケージ) を見つけることができるコンパイラを示すことです。
include - Sven はここで説明しました - https://stackoverflow.com/a/3739563/135553
実際に何をインポートするかによって異なります。インポート可能な最小のエンティティはクラスであり、最大のエンティティはパッケージです。
したがって、単一のクラスが必要で完全なパッケージをインポートする場合、完全なパッケージが取り込まれます。