• ベストアンサー

インスタンス変数へのアクセスについて

理論的な質問ですが・・ public class pra extends JFrame{ JLabel myj; public pra(){ ~初期化 } public static void main(String args[]){ pra p=new pra(); p.myj.setText("ready"); *1 p.jlset(); } private void jlset(){ myj.setText("go"); *2 } } *1では変数myjにアクセスするのに、オブジェクト参照 変数p が必要ですが、*2では、必要ありません。 この違いがよくわかりません。理屈では*2でもpを つけるべきだと思いますが(p.myj)、これをつけると エラーになってしまいます。 なにかアドバイスお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.1

mainはstaticがついているから特殊なメソッドなのです。 クラスの中身で、staticがついているもの(変数・メソッド)は、中途半端な位置にいます。 「お客さん」といった感じです。 本来、staticがついているものは、同じクラスの中にある必要はないのです。 ただ、関係の深いデータや、よく使うメソッドをいっしょに記述すると便利なので、 staticという宣言によって、クラスの中に共存させています。 staticでないメソッドは、(staticでない)変数を自由に使えます。 メソッドの中でmyjとなっていたら、 「メソッドを呼びだされたときのオブジェクトにある 変数myj」を意味します。 ところが、mainはstaticがついているので、 クラスの中身を自由に使えません。 だから、他のクラスから使うときのようにする必要があります。 逆に、staticのつかない普通のメソッドでオブジェクトpとかあると、 「そのpはなんだ!? 宣言してないぞ?!」 となります。 (宣言はメソッドの中だけが有効期限なので、 メソッドを離れると宣言されていないことになります。 たとえmainから呼びだしたメソッドでも同じです) 上の説明でわかりにくかったらごめんなさい。 この質問はかなり本質的です。 これがわかるとオブジェクト指向が半分くらい理解できたことになります。

noname#10667
質問者

お礼

回答ありがとうございました。 非常に参考になりました(本はたくさんありますが こういう説明の仕方ははじめてでした)。 まだ完全には理解していませんが、これをきっかけに 理解できそうな気がします。

その他の回答 (2)

  • Bonjin
  • ベストアンサー率43% (418/971)
回答No.3

staticなものとstaticでないものの違いについて、しっかりと理解しておくべきでしょう。

参考URL:
http://msugai.fc2web.com/java/static.html
noname#10667
質問者

お礼

回答ありがとうございます。 本当、JAVAのエラーはstatic関連ばっかりです。 参考URLは参考になりそうです。 またお願いします。

noname#17227
noname#17227
回答No.2

main メソッドは static がついているので、「クラスメソッド」です。jlset メソッドは、 static がついていないので「インスタンスメソッド」です。インスタンスメソッドはインスタンス変数にアクセスできます。 オブジェクト p は main メソッド内のローカル変数ですので、jltest() メソッドからアクセスすることはできません。 もし、 private void jlset() { pra p = new pra(); p.myj.setText("go"); } とした場合は、コンパイルエラーはでないはずです。ただし、この記述をした場合は、自分のインスタンス内の myj オブジェクトを操作しているわけではないので注意が必要です。 ・クラスメソッドとインスタンスメソッド ・クラス変数とインスタンス変数 ・スコープ これらについて学習した方がいいと思います。

noname#10667
質問者

お礼

回答ありがとうございました。 クラスメソッドとインスタンスメソッドについて、 今回の質問をきっかけにもう一度、よく 考えてみようと思います。

関連するQ&A