C では、次のように記述できます。
#define LOWER 0
Java では、次のように記述できます。
static int lower = 0;
これらのステートメントは、他のメソッドが変数をより低く使用できるようにするという同じ目的を持っていませんか?
それらはまったく異なります。定義は、C プリプロセッサが使用するコピー ペーストのようなものです。static は、Java クラスの属性修飾子です。静的属性は実行時に変更できます。
静的、いいえ。
最終はい。
final int LOWER = 0;
final
変数は一度だけ初期化できます。
static
変数はインスタンスではなくクラスに属します。
でも
機能は似ているかもしれませんが、操作方法はまったく異なります。
最終的な変数は、まさに変数です。C(++)の A#define
は、ビルド時に実際に解釈され、それに応じてバイナリ出力を変更し、実行時に値を定数にします。
#define
より効率的です。
in #define lower 0
lower は変数ではありません。コンパイル時に、コード全体で使用されている場所lower
に置き換えられます。0
一方static int lower = 0;
、変数を定義し、変数の値にアクセスするために実行時に実際のメモリ参照が行われます。これのプラス値は、コードで変更できます。
変更を避けるために、次のように定義できますstatic final int lower = 0;
最近のコンパイラは、最適化においてかなり良い仕事をしています。そのため、コンパイル時にこれのみlower
が に置き換えられ0
ます。
#define lower 0
したがって、C では同等であると「言う」ことしかできstatic final int lower = 0;
ませんが、同じではありません。後者は最適化フェーズ中に交換されたためです。最適化がオフの場合、コンパイル時に置き換えられません。
これが役立つことを願っています。
#define
はプリプロセッサ ディレクティブです。定義した値は、コンパイル前にコード内で言及されている場所にスワップされます。ただし、いくつかの落とし穴があります。他のグローバル変数と同様に、他の場所で同様の名前の変数と競合する可能性があります (とりわけ)。
定数が必要な場合は、const
代わりに使用してください。