私は2つの用語の間で非常に混乱しています. 私はstackoverflowをチェックしましたが、C++には同様の質問がありますが、Javaにはありません。
誰かがJavaの2つの用語の違いを説明できますか?
私は2つの用語の間で非常に混乱しています. 私はstackoverflowをチェックしましたが、C++には同様の質問がありますが、Javaにはありません。
誰かがJavaの2つの用語の違いを説明できますか?
概念的な違いは単純です。
宣言:クラス、関数、変数など、何かが存在することを宣言しています。そのクラスや関数がどのように見えるかについては何も言わず、それが存在すると言うだけです。
定義:クラス、関数、変数などの実装方法を定義します。つまり、それが実際に何であるかを言います。
Javaでは、この 2 つの間にほとんど違いはなく、正式に言えば、宣言には識別子だけでなく、その定義も含まれます。私が個人的に用語を詳細に解釈する方法は次のとおりです。
クラス: Java は、C++ のように (ヘッダー ファイルと cpp ファイルで) 宣言と定義を分離しません。それらを宣言する時点でそれらを定義します。
関数: インターフェイス (または抽象クラス) を作成しているときは、関数を定義せずに宣言していると言えます。ただし、通常の関数は常に宣言されている場所で定義されます。必要に応じて、関数の本体をその定義として参照してください。
変数: 変数宣言は次のようになります。
int x;
x
(変数が存在し、 type を持つことを宣言していますint
)それがローカル変数またはメンバーフィールドである場合。x
Java では、を定義するための情報は残っていませんが、それが保持する可能性のある値は、その割り当てによって決定されます。
私が用語をどのように使用するかについての大まかな要約は次のとおりです。
abstract class SomeClass { // class decl.
// \
int x; // variable decl. |
// |
public abstract void someMethod(); // function decl. |
// |
public int someOtherMethod() { // function decl. |
// | class
if (Math.random() > .5) // \ | def.
return x; // | function definition |
else // | |
return -x; // / |
// |
} // |
} // /
Java 言語仕様では、「宣言」という用語を広範囲に指定して使用していますが、通常の英単語以外では「定義」を使用していません。
私の証拠は、「宣言」という用語が JLS の目次と索引に何度も出てくることです。対照的に、「定義」という言葉はどちらにも現れません。
そのため、誰かが Java のコンテキストで「定義」という言葉を使用しているのを見た場合、彼らはそれを非技術的な意味で使用しているか、用語がずさんになっています。
後者の場合、「宣言」という専門用語と同じ意味かもしれませんし、別の意味かもしれません。そして、彼らが何か他のことを意味している場合は、彼らが何を意味しているのかを尋ねる必要があります. 彼らがそれを定義しているなら...十分に公平ですが、それは標準的な用語ではありません.
「定義」が変数が初期化されるポイントを指すという回答は、特にサポートできません...Javaのコンテキストでは。Java では、変数の初期化は、宣言の時点で発生するか、後の代入で発生します。後者の場合、特別な用語は使用されません...または必要です...代入および/または初期化を除いて。変数にストレージが割り当てられる特定のポイントはありません。実際、宣言に到達する前に、変数自体のスペースが割り当てられる可能性があります。
JLS 仕様の Java で「定義」という用語が使用されていないのは、それが必要ないからです。
(Java で宣言と定義を使用した可能性がある唯一の場所は、抽象メソッド内です。例外として、使用した場合、通常のメソッド宣言を定義として参照する必要がありました...一貫性のために...そしてそれ紛らわしいので、彼らは単に「抽象」サブケースを抽象メソッドの宣言と呼んでいます。)
C と C++ ではこれらの処理が異なるため、技術的な説明では「宣言」と「定義」という用語を区別する必要があります。「Sun Glossary」の定義に対する私の見解は、それらが C / C++ 中心であるということです。
Sun用語集の定義から:
宣言:
識別子を確立し、そのストレージ (データ用) を予約したり (メソッド用) 実装を提供したりする必要なく、属性を関連付けるステートメント。
定義: ストレージを予約する (データ用) または実装を提供する (メソッド用) 宣言。
私が Sun 用語集を読む方法は次のようになります。
List i; // declaration - variable on the stack
i = new ArrayList(); // definition - gives variable a reference
1.宣言とは、を作成することを意味しますがprimitive or Object reference variable
、それぞれ値またはオブジェクトの割り当てはありません..
例えば:
int x; // declaration of x of type int
Cat myCat; // declaration of myCat an Object of type Cat
2.定義は、値またはオブジェクトをそれらに割り当てるときです。
int x = 5;
Cat myCat = new Cat();
3.メソッドの場合はこんな感じ…
public abstract void go(); // Method Declaration (Abstract method)
public void go(){ // Method Defination
// Your code
}
Java
言語は、定義を使用せずに宣言という用語のみを定義します。
宣言:
class A{}// class declaration
String str;// variable declaration
この質問を次のように説明できると思います。
次のシナリオを考えてみてください。
あなたの会社にソフトウェアエンジニアの新しいポストがあります。これは、あなたがこの役職に就くために選んだ人物がソフトウェア エンジニアであることを意味します (このポストにマーケティング担当者を選ぶことはできません)。したがって、この投稿を作成することは宣言に似ています。
このポストを持つ人ができる/できないこと、彼が持っている権限、彼の制限は何かを定義すると、これは定義と呼ばれます.
そう言って
SoftwareEngineer se;
宣言を意味します。
と
class SoftwareEngineer {
// define role and responsibilities
}
定義を意味します。お役に立てば幸いです。