• ベストアンサー

mainメソッドと同じオブジェクト内のメソッドにはstaticを必ずつ

mainメソッドと同じオブジェクト内のメソッドにはstaticを必ずつけなければならないのでしょうか? そのような記述を見掛けたのですが、もしこれが正しいという場合、 それは、なぜなのでしょう? java初心者ですが、どうぞ宜しくお願いいたします。 class MainClass{  //先頭のstaticに注目  static void sub(){   ~~  }  //mainメソッド  public static void main(String[] args){   sub();  } }

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

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

static があるとクラスメソッドとなり, インスタンスなしで (クラス名だけで) 呼び出すことができます. static がないとインスタンスメソッドであり, 呼び出すためには必ずインスタンスが必要となります. ということで, sub から static を取り除くと main の中で MainClass のインスタンスを作る必要があります. 逆に言えば, MainClass のインスタンスを (何らかの理由で) 作るのであれば, static を付けてクラスメソッドとする必要はありません.

nbsp0606
質問者

お礼

なるほど、よくわかりました。 sub()からstaticを取り去ると、 mainの中で、MainClassのインスタンスを作り、 それをもとにsub()を呼び出すことになるわけですね。 sub()を使う上で、sub()を使うためにMainClassのインスタンスを作る必要はなく、 それだけのためにインスタンスを作るくらいなら、sub()をクラスメソッドにして 使えるようにした方が良い、ということですね。 ただ、sub()を使うため以外に何らかの理由で、MainClassnのインスタンスを作る機会があった場合には、 そのインタンスをもとにsub()を呼び出せるということですから、 それを考慮して、sub()にstaticを、その場合には付けなくても良い、 ということになるわけですね。 ただ、この場合、 sub()にstaticをつけてクラスメソッドにしていても良いわけですよね。 こういった場合、どちらで対応するのが良いのでしょうか。 大差なさそうですが、もし、何か大きな違いなどがあるようでしたら、 教えて下さい。 もっとも、こんなケースはまずなさそうですが…。 つまり、mainメソッドを含むクラスのインスタンスを作ることは まずないだろう、と私は思っているわけですが、 初心者の考えです、怪しい点などがあれば、またご指導いただけると嬉しいです。

その他の回答 (3)

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.4

#3です。 少し補足しますね。 staticなデータはプログラムのバイナリコード中に あります。つまり、ディスクにある時から存在して います。従って、実行時にはコードと共にメモリに ロードされるので、インスタンス化する必要はない わけです。そのかわり、この領域は複製できないので、 唯一無二の空間になります。 一方、インスタンス変数はバイナリコード中には存在 しません。実行時に「インスタンス化」することで、 メモリが割り当てられ、実体を持つことができます。 インスタンス化は何度でもできますから、その度に、 別のメモリ空間が割り当てられるという要領です。 質問にあるようにstaticなメソッドにインスタンスを 渡し、その中のメソッドを実行することは可能です。 まぁ。あまり見かけない方法ですが、場合によっては アリかなとも思います。

nbsp0606
質問者

お礼

またしてもありがとうございます。 毎回、簡潔明瞭ズバリな回答に助けられております。 >従って、実行時にはコードと共にメモリに ロードされるので、インスタンス化する必要はない わけです。 実行時の「メモリの食い具合」、という観点でstaticを眺めると、 また違った視点で、staticの使用基準が見えてきそうですね。 また、ご指摘の特性があるからこそ、 mainメソッドにはstaticキーワードを付けるのかな、 と、そんなことも考えました。 >質問にあるようにstaticなメソッドにインスタンスを 渡し、その中のメソッドを実行することは可能 すみません、変な質問をしてしまって。 言語勉強中はどうも、重箱の隅をつつきながら、 その隅の存在を手探りで確認するとともに、 そのエリアの有益性を確認する、なんてことを無意識に行う癖があるようで…。苦笑 まるで、お掃除ロボ、ルンバ君のような動きだ…。 それでは、また機会がありましたら、色々と教えて下さい。 回答、ありがとうございました。

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.3

問題はデータです。staticなデータは全てのインスタンスで 共通ですから、各インスタンスで無秩序に変更するとマズイ 結果になることはお分かりかと思います。 これに対して非staticなデータ(インスタンス変数)は それぞれのインスタンスに固有なものになりますから、 こういう心配はありません。 要するに、staticなメソッドはインスタンスに依存しないので、 インスタンス変数を参照したり、変更したりできません。何故なら、 データがどのインスタンスに属するかが分からないからです。 同じ理由で、staticなメソッドから非staticなメソッドを呼び出す こともできません。(インスタンスが無いから) このことから分かるように、インスタンス変数を持ち、これを扱う メソッドは必ずインスタンス(非static)メソッドでなければ なりません。まとめると以下のようになります。 (1)インスタンス変数を使わない→どちらでもよい (2)インスタンス変数を使う→インスタンスメソッドに限る

nbsp0606
質問者

お礼

まずはお礼を。(場合によっては、さらに補足をさせていただくことも…) 回答を読ませて頂き、問題の核心部分に気付けたように思います。 <1>staticなデータは全てのインスタンスで共通 まず、この点がしっかり頭に入っていませんでした。 今回、ご指摘を受け、「あぁ、確かにそんな話がありました!」と思い出しました。 ということで、ここで考え方の視野がかなり広がり、また、その深度も増しました。 つまり、staticを付ける付けないは、結構大きな違いだということに気付いたわけです。 <2>同じ理由で、staticなメソッドから非staticなメソッドを呼び出す こともできません。(インスタンスが無いから) ここでも勉強させられました。 仮に、staticなメソッドから非staticなメソッドを使いたい、とした場合、 それを可能にする方法として、 そのstaticメソッドを「引数を取らせる仕様」にし、 さらに、その引数に、そのクラスのインタンスを渡し、 「staticメソッド内で、引数で受け取ったインスタンスをもとに、非staticなメソッドを使う」 なんて方法を考えてみたりしましたが、いかがでしょう? 原理上可能でも、実用上有益な方法とは言えない、かもしれないので、 ここでの質問の意図としては、 原理上可能かどうかが(もし可能であれば、実用上有益かどうかも)について、 お聞きしたいです。 (staticの動きを理解するためのナゾナゾ、といった性質の質問とご理解頂けると助かります。) ※初心者であるため、言語仕様を無視した、変な事を言っている可能性もあります。その場合はお許し下さい。 さて、今後の課題として、 まずは、staticなフィールド(staticなメソッドはその後にでも)について、 私はよく理解する必要がありそうです。 <1>のご指摘で、かなり目が覚めました。 どうもありがとうございます、また宜しければ、アドバイスをして頂けると嬉しいです。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

そんなことはない. が, さりとて「static public な main メソッドを持つクラス」のインスタンスを作る必然性もあまりないような気はする.

nbsp0606
質問者

お礼

仕様上、必ずそうしなければいけない、ということではない、という回答でよろしいでしょうか。 ちなみに、質問文のコードにおいて、subメソッドのstaticキーワードを取り去ると、 mainメソッド内の記述は変える必要が出てきますでしょうか? sub()から、staticを取り去ると、mainでの呼び出しでは、 インスタンスを作る必要があるのでしょうか? 同一クラス内での呼び出しだから、インスタンス化しなくても、 sub()をmainの中で使えたりしませんでしたっけ? なんだか、多少混乱しております。。。 またよろしければ教えて下さい。