これは面接で聞かれる質問です。以下のコーディング スニペットで何foo a
を意味し、何を示しているか。foo a()
class foo
{
foo a;
foo a();
}
foo a と foo a() は何をしますか? インタビュアーは、これが Java なのか C++ なのかについて言及しませんでした。彼らは私に C++ と Java の両方で答えてほしいと思っていました。
C++ では、最初の行はエラーです (クラスにそれ自体のインスタンスを含めることはできません)。2 行目では、値によってのインスタンスを返すメソッドを宣言していfoo
ます。また、最後にセミコロンがありません。
Java では、最初の行で への参照であるデータ メンバーを宣言しますfoo
。メソッドには本体が必要なため、2 行目はエラーです。
要約すると、これは 2 つの言語のどちらでも有効なコードではありません。:-)
構文的には、Java に関しては正しくありません。他の人はそれを説明しました。
ただし、それが疑似コードであると仮定すると、基本的な答えは次のようになると思います。
foo a;
a
タイプ の名前付き変数ですfoo
。
foo a();
a
型のオブジェクトを返すという名前のメソッドfoo
です。
foo a;
への参照であるフィールド を宣言します。a
foo
foo a();
Javaのエラーです。これはメソッド宣言 (本体のないメソッド) です。abstract
Java では、このような抽象メソッドは次のキーワードで修飾する必要があります。
abstract foo a();
これは、参照を返す抽象メソッドを宣言します。抽象メソッド宣言を含むすべてのクラス定義は、キーワード自体で修飾する必要があります。あなたの場合、クラス宣言は次のようになります。a
foo
abstract
abstract class foo {
Java言語仕様から - §8.1.1.1 :
通常のクラスは、抽象メソッド、つまり、宣言されているがまだ実装されていないメソッドを持つことができますが、それらが抽象クラスである場合に限られます。抽象ではない通常のクラスに抽象メソッドが含まれている場合、コンパイル時エラーが発生します。
Java の場合
class foo
{
foo a;
foo a();
}
最初の行は、「a」という名前の「foo」オブジェクトへの参照を宣言しています。値はヌルになります。
2行目はエラーです。「foo」を返す「a」というメソッドを宣言しようとしていますが、メソッドの本体がありません。これが機能するには、クラスとメソッドをabstractとして宣言するか、「a」メソッドに本体を指定する必要があります。
クラスは抽象コンパイラではないため、型fooを返すメソッドはエラーをスローします