2011-12-25 12 views
2

静的メソッドは静的変数と静的メソッドのみを使用できますが、静的メソッド以外は静的でない変数とメソッドを使用できることはわかります。静的メソッドが静的変数/メソッドにしかアクセスできない理由を説明していますか?静的でないメソッドや変数にはアクセスできません。静的メソッドと変数

+0

[静的関数?](http://stackoverflow.com/questions/8029845/cannot-be-referenced-from-a-static-function) –

+0

それは重複ではない、私の質問の内容はまったく異なります。 – KyelJmD

+2

この質問に対する回答は、この質問にも同様に適用されます。 –

答えて

8

非静的メソッド/フィールドにアクセスするには、そのクラスのインスタンスが必要です。

+0

...によって定義されています。 –

+0

しかし、OPは* why *を知りたがっています。これは何らかのルールですか、それとも理由がありますか?それは私たちに "はい、非常に重要な理由がある"と説明することになります。私見では... – paulsm4

+1

「静的」とは実際に何を意味するのか理解していれば、その理由は明らかです。 –

2

考えてみよう:

a)あなたが静的メソッドであったとします。

b)あなたは任意のオブジェクトインスタンスから独立して存在します。クラスインスタンスがない場合でも存在します。

c)静的でない変数にアクセスしたい。 1つのオブジェクトインスタンスにのみ存在する変数 - 特定のオブジェクトインスタンスに特化した変数。

d)どのオブジェクトインスタンスの非静的変数を使用しますか?

静的メソッドは、クラスの非静的メンバーにアクセスする可能性があります(ただし、クラス参照によって行います)。

そうでなければ - クラス参照なし - アクセス不可。

意味がありますか? ;)

+0

sooは、クラス参照がありません。インスタンス変数にアクセスできません。私は正しい? – KyelJmD

+0

まさに右:) – paulsm4

3

クラスをインスタンス化すると、クラスがヒープまたはスタックにロードされます。この場合、アプリケーションには、メモリインスタンスのその部分への参照があります。しかし、静的メソッドはメモリにロードされる関数です。そのため、静的メソッドがクラス変数またはメソッドにアクセスしようとしている場合、静的メソッドが存在する可能性があるため、そのクラスへの複数の参照がヒープ内に存在する可能性があるためです。

静的メソッドから非静的メソッドを呼び出す場合は、そのクラスへのインスタンス(または作成)を使用して、実際にクラス参照を定義できるようにする必要があります。

0

静的コンテキストでは、 'this'キーワードにアクセスできません。このキーワードは静的コンテキストでは使用できません。インスタンス変数は、コンストラクターが起動するときに初期化されます。しかし、静的変数は、クラスがロードされるときに初期化されます。クラスの読み込み中に、静的コンテキストでインスタンス変数を使用すると、この時点ではインスタンス変数は識別されません。そのときにコンパイル時エラーが発生します。

関連する問題