web-dev-qa-db-ja.com

'import' in Java vs。 '#include' in C / C ++

Javaの 'import'はC/C++の '#include'と同じように動作しますか?具体的には、インポートするライブラリ全体が含まれますか、それともクラスと後続のコードで呼び出されるメソッド?

21
Eamon Moloney

#includeは、ライブラリの「インポート」も、クラスやモジュールも、両方を実行しません。

#includeディレクティブは、別のテキストファイル(ソース)の内容を含めるようにプリプロセッサに指示するだけです。それで全部です。

ファイルA#includeingファイルBの前処理の結果は、ファイルBが#includeディレクティブが配置された位置でファイルAに貼り付けられた状態で、1つのファイルであるかのようにコンパイラーに渡されます。

わかりやすく説明すると、これは次のようになります。これはすべて、コンパイル、コード生成に対して発生します。

副作用として、C/C++プリプロセッサをコンパイラとは独立して使用して、any種類のテキストファイル入力を処理することができます。

#includeのようなプリプロセッサステートメントは、コンパイラに渡されることがないため、C/C++でプログラムを作成するために本質的に必要ではないため、「実際にはC/C++言語の一部ではない」と主張することができます。 。

importは、インポートするものがないため、(標準の)C/C++プログラミングのコンテキストでは使用されません。

C/C++モジュールは、ソースレベルでコンパイル前に、またはリンカーコンパイルによってまとめられます。

26
alk

#include<stdio.h>は、このファイルのstdio.hの内容をコピーすることを意味し、import Java.util.ArrayListは、このファイルでクラスが見つからない場合は、上記のインポート場所を調べてください。 Javaインポートによってファイルのサイズが大きくなることはなく、キーストロークを数回節約するだけです。

8
Ajay Sharma

Javaでは、importを使用すると、次のいずれかをインポートします。

  • 単一のクラス:import foo.bar.Baz
  • フルパッケージ:import foo.bar.*
  • クラスの単一の静的メンバー:import static foo.bar.Baz.GRUT
  • クラスのすべての静的メンバー:import static foo.bar.Baz.*
7
Jerome

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/

2
DejanLekic

Cに関して他の答えがクリアされていないかもしれない1つの側面は、

include in cは、関数プロトタイプを含むプリプロセッサフ​​ェーズのヘッダーファイルのみをコピーし、それ以上はコピーしません。実際の関数定義は、基本的なコードのコンパイル後もリンク時に配置されます。

ヘッダーファイルをインクルードし、ソースファイルをインクルードしてコードから関数を呼び出すことで簡単な検証を行うことができます。コンパイルエラーは発生せず、リンク時にのみ定義が見つからないと文句を言います。

1
fkl

一般的に:

C言語では、コンパイラーが#includeステートメントを検出すると、それらのヘッダーファイルを使用しているかどうかに関係なく、指定されたすべてのヘッダーファイルがインクルードステートメント時にのみロードされます。したがって、静的バインディングと呼ばれます。

ただし、Java言語の場合、コンパイラがインポートステートメントを検出すると、インポートステートメントの時点で.classファイルはロードされません。その時点でクラスを使用している場合は常に次のコード行で対応する.classファイルのみがロードされます。このタイプのロードは、動的ロードまたはロードオンデマンドまたはロードオンフライと呼ばれます。

0
Abhishek Luthra

実際にインポートするものによって異なります。最小のインポート可能なエンティティはクラスであり、最大のエンティティはパッケージです。
したがって、単一のクラスが必要で、完全なパッケージをインポートすると、完全なパッケージが取り込まれます。

0

import(Javaの場合)は(C++の場合)の使用に似ています-ご存知のとおり、これらは完全に同じではありませんが、非常に似ています。

importは、現在のクラスで使用されているクラス(またはサブパッケージ)を見つけることができるコンパイラーを示します。

含める-スヴェンはここでそれをよりよく説明しました- https://stackoverflow.com/a/3739563/13555

0
Narendra N