2012-10-17 5 views
7

標準のブックコンストラクターは、オブジェクトを初期化するために使用される特別なタイプの関数です。コンストラクターは関数として定義され、内部クラス関数は静的または非staticの2つの型しか持てません。疑問は何のコンストラクターですか?コンストラクタは、静的メソッドである場合コンストラクターは静的または非staticです

1.)As constructor is called without object so it must be static 

    Test test =new Test();//Test() is being called without object 
    so must be static 

私の疑問は、その後どのように我々は、頻繁に

Test(){ 
System.out.println(this); 
} 

コンストラクタ内でこれを使用することができている12aw212 @テストを与えるだろう、これはstatic..Kindlyが

+0

あなたが求めているものは完全にはわかりませんが、コンストラクタはJavaでは静的ではありません(スタティックブロックがあります)。コンストラクタは初期使用のためにオブジェクトを設定し、インスタンス化されると呼び出されます。 – Ben

+2

コンストラクタが静的なときからですか? –

+0

「標準本」とは何ですか?すべての[JLS](http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.8)は、「他のすべての点で[その名前以外の]コンストラクタ宣言*は、結果の型を持たないメソッド宣言のように見えます」(私の強調)。もしあなたの本がそれと異なるものを言うならば、それは定義上間違っています。 「コンストラクタは特殊な関数型です」ということは何もないので、静的/非静的の問題は発生しません。本当の質問ではありません。 – EJP

答えて

12
手の込んだ非なければならないことを意味

あなたの2番目の例がその場所に当たっています。 thisコンストラクタはコンストラクタで使用できます。コンストラクタは、現在作成されているオブジェクトに対して実行されます。

原則として(new演算子を使用して)新しいオブジェクトを作成すると、JVMはそのオブジェクト用にいくつかのメモリを割り当て、その新しく作成されたオブジェクトでコンストラクタを呼び出します。また、JVMはコンストラクタの前に他のメソッドが呼び出されていないことを確認します(それが特別なものになります)。

実際には、マシンレベルでは、コンストラクタは1つの特別な暗黙的なthisパラメータを持つ関数です。この特別なパラメータ(実行時に渡される)は、オブジェクトメソッドと静的メソッドの違いになります。言い換えれば:

最初のパラメータが this命名され
bar(foo, 42); 

foo.bar(42); 

に変換されます。一方static方法は、以下のように、あると呼ばれています。

Foo.bar(42); 

はに変換します。ここ

bar(42); 

Fooソースコードにかろうじて存在だけ名前空間です。

+0

私はあなたの意見を持っていますが、具体的に教えてください。特別な扱いをしている特別なものでは、そのコンストラクタは静的ではないと言うことができますか? – Arun

+0

@Arun:コンストラクタは例外を除いて通常のメソッドです。(1) (2)JVMは 'new'演算子で自動的に呼び出します。(3)コンストラクタの前にメソッドを呼び出すことはできません。 –

+0

ありがとうございました。 – Arun

0

コンストラクタは静的ではありません。すべてのメソッドの最初のパラメータは暗黙的にthis(静的を除く)で、コンストラクタはその1つです。

0

コンストラクターは静的関数ではありません。 Test test =new Test();を実行すると、新しいTestオブジェクトが作成され、そのオブジェクトに対してコンストラクタが呼び出されます(これは、新しく作成されたオブジェクトを指していることを意味します。this)。

0

ここではnewというキーワードがトリックです。一般に、オブジェクトなしで呼び出す場合、メソッドは静的であることに注意してください。しかしながら、この特別な場合(すなわち、newキーワードが先行する)、コンパイラはコンストラクタを呼び出すことを知っている。

0

newオペレータは、作成したオブジェクトへの参照を返します。

new Test(); // creates an instance. 

newオペレータが物体

-1

どちらインスタンス化した後System.out.println(this);が呼び出されます。

メソッドは、静的/非静的メソッド、別名クラス/インスタンスメソッドの2つのタイプに分けることができます。

しかし、コンストラクタはメソッドではありません。

0

スタティック: Temp t = new Temp();

演算子は、ヒープ領域にメモリを作成し、それを暗黙的にTemp(this)としてコンストラクタに渡します。次に、thisというクラスで定義された非静的インスタンス変数を、ローカルパラメータ変数thisに初期化します。オブジェクトを作成するために役立っている

  1. :ので

    class Temp{ 
        int a; 
        Temp this; //inserted by compiler. 
        Temp(Temp this){ //passed by compiler 
         this.this=this; // initialise this instance variable here. 
         this.a=10;//when we write only a=10; and all the non-static member access by this implicitly. 
         return this; // so that we can't return any value from constructor. 
        } 
    } 
    

    コンストラクタは静的です。

  2. オブジェクトなしで呼び出されます。
+0

、ありがとう! –

-3

コンストラクタはオブジェクトを初期化するために使用され、非静的メソッドはオブジェクトに属し、コンストラクタとしてもJVMによって呼び出され、オブジェクトの参照でオブジェクトを初期化する新しいオペレータによって作成されました

関連する問題