1

statement_1: クラスのコンストラクターを定義するたびに、戻り値の型をスキップします。つまり、コンストラクターは何も返しません。したがって、無効と宣言することはできません。

statement_2: しかし、classname obj = new classname()遭遇すると、JVM はオブジェクトを作成し、変数への参照を返します。obj

これらのステートメントは両方とも真実です。statement_2 が statement_1 とどのように関連しているかを知りたいと思います。

私の質問はobj、コンストラクターが何も返さない場合、どのように初期化されるのですか? 何かを返すことを意味し、クラスの戻り値の型を持つ必要があります。

class Myclass{
              Myclass Myclass(){
                                   //return something of Myclass type 
               }

}

それならMyclass obj = new Myclass()もっと理にかなっているはずです。

トピックにもっと光を当てる

4

5 に答える 5

5

と書くと、オブジェクトを作成して返すのは演算子ですclassname obj = new classname()newコンストラクターは初期化 (フィールドの設定など) に使用されるため、何も返されません。

3つのステップと考えることができます

  1. newオブジェクトを作成します
  2. new作成したばかりのオブジェクトのコンストラクターを呼び出します
  3. new作成されたオブジェクトを返します

オブジェクトの作成について詳しくは、 Java チュートリアル を参照してください。

于 2012-09-23T08:55:24.420 に答える
2

それはルールです。コンストラクターには戻り値の型がありません。呼び出すnew Foo()ときは、new演算子の後にコンストラクター呼び出しを使用しています。

式を構成し、 type のオブジェクトを返すのはnew演算子です。Foo

コンストラクターに戻り値の型がある場合は、次のように書くことができます

Foo something = Foo();

または単に( return と仮定してvoid

Foo();

しかし、これらのコードは両方とも違法です。コンストラクター呼び出しの前には常にnew演算子が必要です。newオペレーターは an 型のオブジェクトを作成し(Fooたとえば、ストレージ用のスペースを割り当てます)、このオブジェクトをコンストラクターに渡して初期化し、最後に初期化されたインスタンスを呼び出し元に返します。

オブジェクト作成構文が通常のメソッド呼び出しに非常に近い理由を不思議に思うかもしれません。引数をコンストラクターに渡せるようにするためだと思います。彼らは次のような特別な構文を作ることができました

Foo foo = new Foo

括弧がないことに注意してください。これはメソッド呼び出しに似ていません。しかし、コンストラクターに引数を渡すにはどうすればよいでしょうか。多分単にそれらをリストすることによって

Foo foo = new Foo "Hello", "World"

ただし、この構文は、1 つのステートメントで 2 つ以上の変数を初期化する構文と競合します。つまり、

Number a = new Integer(12), b = new Float(1.2);

そのため、彼らは最終的にその構文を選択しました。

于 2012-09-23T08:56:10.723 に答える
0

コンストラクターは何も返しません。コンストラクターは、インスタンス変数を初期化することを目的としています。あなたが言う時

    Foo f = new Foo();

new演算子はFooオブジェクトを作成します。

于 2012-09-23T08:58:43.820 に答える
0

バイトコードレベルでも、コンストラクタは何も返しません。これは、戻り値を返すメソッドと同じ戻り値タイプを持ちます。void 代わりに、初期化する際の引数としてオブジェクトを受け取りthisます。

注:別のオブジェクトを返すオプションはありません。そのため、ファクトリメソッドが必要になる場合があります。

于 2012-09-23T08:58:56.620 に答える
0

ここでコンストラクターは何も返しません。このステートメントは、obj オブジェクトが割り当てられているメモリのアドレスを返すだけです。&それは新しいオペレーターの仕事です。これが、ここで新しいオペレーターが必要な理由です

于 2012-09-23T08:57:34.977 に答える