2013-02-06 5 views
22

このトピックに関する記事を読んだ後、私は自分自身が少し混乱していることがわかりました。 もう一度尋ねるコンストラクタがJavaで返すもの

"javaコンストラクタは値を返しますか?"

書籍は、彼らは値を返しませんが、教授は言うことができると彼らはいつもやっていると言いますか? 何らかの値を持つものにコントロールを移す必要があるので、voidですか?

+3

あなたの教授は、新しいインスタンスを返すことを意味するのでしょうか? –

+0

これは役立つ可能性があります。http://docs.oracle.com/javase/specs/jls/se7/html/jls-12.html#jls-12.5 – kosa

答えて

7

コンストラクタは、明示的なreturn文がない場合でも、それが属するクラスの新しいインスタンスを返します。

+0

コンストラクタで何も返されない場合は、なぜこれが各コンストラクタ内で使用されるのですか?暗黙のうちにこれを返すコンパイラです。 –

27

これは少し混乱します。コンストラクタは実際には値を返しません。それはオペレータnewです。しかし、コンストラクタは常にnew*で使用されているので、のように見えます。は値を返します。


*これはわずかな単純化である:あなたが 反射を通過する場合は、 newなしコンストラクタを使用することができます。しかし、同じメカニズムが有効です。

+1

newは単なるキーワードなので、どのように値を返すことができますか? –

+10

@shivdhwajpndey私は 'new'キーワードが値を返すとは言いませんでした:' new' *演算子はそうしました。キーワードと特殊文字は構文要素です。彼らは何もしない。彼らが表現する演算子です。キーワード 'new'自体は、' + 'や' -'のように意味がありません。彼らにはオペランドが必要です。単項マイナスが1つのオペランドを取るのと同じように、演算子 'new'はコンストラクタでなければならない1つのオペランドをとります。演算子 'new'はメモリの割り当て、コンストラクタの呼び出し、必要なパラメータの受け渡し、値の返却を行います。 – dasblinkenlight

+1

優秀な答え –

6

私は混乱が純粋に表記であると思います。コンストラクタを宣言すると、次のようになります。

public class Foo { 
    public Foo() {} 
} 

ここでは明示的な戻り値はありません。あなたがオブジェクトのインスタンスを作成するとき、次のように

はしかし、構文は次のとおりです。

Foo foo = new Foo(); 

これは、メモリを割り当て、コンストラクタを呼び出すことによって、新しいオブジェクトを作成します。ここで、結果は明らかにFooのインスタンスです。

明らかに矛盾する表記法を調整する1つの方法は、コンストラクタを構築中のオブジェクトを返すように考えることですが、暗黙的に行うことです。

+0

しかし、コンパイラは、コンストラクタから返ってきたことをチェックすると他の人に言っています。 –

+0

@shivdhwajpandey 'this'は構築されているオブジェクトです。 – 2rs2ts

1

私は2つの説明上記に同意し、より明確にするためにいくつかのステートメントを追加したい:

質問:コンストラクタは何ですか: 回答:クラスとしてのそのメソッドた名前と同じ。

質問:コンストラクタは何かを返しますか? 回答:いいえ、VOIDさえありません。

質問:コンストラクタを呼び出す方法は?または、コンストラクタはどのように呼び出されますか? 回答:NEWキーワードを使用してオブジェクトを作成します。

質問:オブジェクトを作成する方法は? 回答:オブジェクトを作成する方法の1つは、オブジェクトのインスタンスを返すNEW演算子を使用することです。定義により

+0

コンストラクタが何も返さない場合、これを暗黙的にコンパイラによって各コンストラクタ内で使用する理由を返します。 –

-2

暗黙的にクラス型を返すコンストラクタ........

0

は、コンストラクタから値を返す可能性はありません。コンストラクタは戻り値の型をサポートしていません

3

コンストラクタは特別なメソッドです。 はまあコンストラクタとメソッドでの基本的な違いは

コンストラクタ

  • は、戻り値の型
  • オーバーライドオーバーロードされなくできていないクラス
  • と同じ名前を持っているということです。

    方法

    • 月またはクラスと同じ名前を持っていない可能性があり、一方、

  • 戻り値の型があります。
  • オーバーロードおよびオーバーライドできます。
    :コンストラクタのためにのpublic static無効メイン(文字列[] args)

    構文:

メソッドの構文:
AccessModifierがReturnTypeクラス(...)
EG AccessModifier No ReturnTypeクラス(...)
EG:のpublic staticメイン(文字列[] args)を

注意してください:

は、Javaは強く型付けされた言語であるので、各機能は、その戻り値の型を持っており、コンストラクタは常にクラスのインスタンスを返します。

0

あなたがイーグルをスケッチするように指示されている状況を想像してください。

最初のシナリオ:あなたはどのように見えるべきかについて話されていません。あなたは何色を使用するとイーグルがある、姿勢が

今すぐ最初のシナリオは、正確に何を描いている

スケッチされるように正確に言われている:あなたが知っているすべては、イーグル

2つ目のシナリオの簡単なスケッチを作ることです2番目のシナリオは、オブジェクトを作成する方法に関する情報がある場合です。しかし、あなたが鉛筆と紙をとり、スケッチを始めるまでは、何も返されません。

したがって、新しいキーワードを使用してコンストラクタを呼び出すと、オブジェクトが取得されます。明示的に何かを返すのではなく、クラスのインスタンスとして使用できるものを作成または構築します。

0

はい、現在のクラスインスタンスです。 (戻り値型は使用できませんが、戻り値は返されます)。

0

コンストラクタは、非常に低いレベル(データとメソッドでどれくらいのメモリ空間を使用するかなど)でコンストラクタ内に記述されたコードを実行します。 new演算子は、オペランドとしてコンストラクタの戻り値をとり、実行時にメモリを割り当て、そのハンドラをクラス変数に返します。

1

私は心配しているコンストラクタです。参照IDをそのクラスの参照変数に戻します。例を挙げる:

class demo 
{ 
demo{} 
} 
class demo1 
{ 
public static void main(String as[]) 
{ 
demo d = new demo(); 
System.out.println(d); 
} 
} 

出力:7d4991ad @デモそれはコンストラクタによって返されたクラスのデモのオブジェクト「D」の参照IDです。 uがコンストラクタを定義しない場合、jvmはこのIDをデフォルトのコンストラクタから取得します。

この行でチェックすることができます: System.out.println(new demo()); 出力:デモ@ 1b6d3586。 すべてのオブジェクトはメモリ内に別々のヒープ領域を持っているため、各オブジェクトの参照IDも異なります。

+1

読みやすくするためにコードを少しインデントするのは難しいですか? –

関連する問題