- ベストアンサー
mainメソッドと同じオブジェクト内のメソッドにはstaticを必ずつ
mainメソッドと同じオブジェクト内のメソッドにはstaticを必ずつけなければならないのでしょうか? そのような記述を見掛けたのですが、もしこれが正しいという場合、 それは、なぜなのでしょう? java初心者ですが、どうぞ宜しくお願いいたします。 class MainClass{ //先頭のstaticに注目 static void sub(){ ~~ } //mainメソッド public static void main(String[] args){ sub(); } }
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
static があるとクラスメソッドとなり, インスタンスなしで (クラス名だけで) 呼び出すことができます. static がないとインスタンスメソッドであり, 呼び出すためには必ずインスタンスが必要となります. ということで, sub から static を取り除くと main の中で MainClass のインスタンスを作る必要があります. 逆に言えば, MainClass のインスタンスを (何らかの理由で) 作るのであれば, static を付けてクラスメソッドとする必要はありません.
その他の回答 (3)
- nda23
- ベストアンサー率54% (777/1415)
#3です。 少し補足しますね。 staticなデータはプログラムのバイナリコード中に あります。つまり、ディスクにある時から存在して います。従って、実行時にはコードと共にメモリに ロードされるので、インスタンス化する必要はない わけです。そのかわり、この領域は複製できないので、 唯一無二の空間になります。 一方、インスタンス変数はバイナリコード中には存在 しません。実行時に「インスタンス化」することで、 メモリが割り当てられ、実体を持つことができます。 インスタンス化は何度でもできますから、その度に、 別のメモリ空間が割り当てられるという要領です。 質問にあるようにstaticなメソッドにインスタンスを 渡し、その中のメソッドを実行することは可能です。 まぁ。あまり見かけない方法ですが、場合によっては アリかなとも思います。
お礼
またしてもありがとうございます。 毎回、簡潔明瞭ズバリな回答に助けられております。 >従って、実行時にはコードと共にメモリに ロードされるので、インスタンス化する必要はない わけです。 実行時の「メモリの食い具合」、という観点でstaticを眺めると、 また違った視点で、staticの使用基準が見えてきそうですね。 また、ご指摘の特性があるからこそ、 mainメソッドにはstaticキーワードを付けるのかな、 と、そんなことも考えました。 >質問にあるようにstaticなメソッドにインスタンスを 渡し、その中のメソッドを実行することは可能 すみません、変な質問をしてしまって。 言語勉強中はどうも、重箱の隅をつつきながら、 その隅の存在を手探りで確認するとともに、 そのエリアの有益性を確認する、なんてことを無意識に行う癖があるようで…。苦笑 まるで、お掃除ロボ、ルンバ君のような動きだ…。 それでは、また機会がありましたら、色々と教えて下さい。 回答、ありがとうございました。
- nda23
- ベストアンサー率54% (777/1415)
問題はデータです。staticなデータは全てのインスタンスで 共通ですから、各インスタンスで無秩序に変更するとマズイ 結果になることはお分かりかと思います。 これに対して非staticなデータ(インスタンス変数)は それぞれのインスタンスに固有なものになりますから、 こういう心配はありません。 要するに、staticなメソッドはインスタンスに依存しないので、 インスタンス変数を参照したり、変更したりできません。何故なら、 データがどのインスタンスに属するかが分からないからです。 同じ理由で、staticなメソッドから非staticなメソッドを呼び出す こともできません。(インスタンスが無いから) このことから分かるように、インスタンス変数を持ち、これを扱う メソッドは必ずインスタンス(非static)メソッドでなければ なりません。まとめると以下のようになります。 (1)インスタンス変数を使わない→どちらでもよい (2)インスタンス変数を使う→インスタンスメソッドに限る
お礼
まずはお礼を。(場合によっては、さらに補足をさせていただくことも…) 回答を読ませて頂き、問題の核心部分に気付けたように思います。 <1>staticなデータは全てのインスタンスで共通 まず、この点がしっかり頭に入っていませんでした。 今回、ご指摘を受け、「あぁ、確かにそんな話がありました!」と思い出しました。 ということで、ここで考え方の視野がかなり広がり、また、その深度も増しました。 つまり、staticを付ける付けないは、結構大きな違いだということに気付いたわけです。 <2>同じ理由で、staticなメソッドから非staticなメソッドを呼び出す こともできません。(インスタンスが無いから) ここでも勉強させられました。 仮に、staticなメソッドから非staticなメソッドを使いたい、とした場合、 それを可能にする方法として、 そのstaticメソッドを「引数を取らせる仕様」にし、 さらに、その引数に、そのクラスのインタンスを渡し、 「staticメソッド内で、引数で受け取ったインスタンスをもとに、非staticなメソッドを使う」 なんて方法を考えてみたりしましたが、いかがでしょう? 原理上可能でも、実用上有益な方法とは言えない、かもしれないので、 ここでの質問の意図としては、 原理上可能かどうかが(もし可能であれば、実用上有益かどうかも)について、 お聞きしたいです。 (staticの動きを理解するためのナゾナゾ、といった性質の質問とご理解頂けると助かります。) ※初心者であるため、言語仕様を無視した、変な事を言っている可能性もあります。その場合はお許し下さい。 さて、今後の課題として、 まずは、staticなフィールド(staticなメソッドはその後にでも)について、 私はよく理解する必要がありそうです。 <1>のご指摘で、かなり目が覚めました。 どうもありがとうございます、また宜しければ、アドバイスをして頂けると嬉しいです。
- Tacosan
- ベストアンサー率23% (3656/15482)
そんなことはない. が, さりとて「static public な main メソッドを持つクラス」のインスタンスを作る必然性もあまりないような気はする.
お礼
仕様上、必ずそうしなければいけない、ということではない、という回答でよろしいでしょうか。 ちなみに、質問文のコードにおいて、subメソッドのstaticキーワードを取り去ると、 mainメソッド内の記述は変える必要が出てきますでしょうか? sub()から、staticを取り去ると、mainでの呼び出しでは、 インスタンスを作る必要があるのでしょうか? 同一クラス内での呼び出しだから、インスタンス化しなくても、 sub()をmainの中で使えたりしませんでしたっけ? なんだか、多少混乱しております。。。 またよろしければ教えて下さい。
お礼
なるほど、よくわかりました。 sub()からstaticを取り去ると、 mainの中で、MainClassのインスタンスを作り、 それをもとにsub()を呼び出すことになるわけですね。 sub()を使う上で、sub()を使うためにMainClassのインスタンスを作る必要はなく、 それだけのためにインスタンスを作るくらいなら、sub()をクラスメソッドにして 使えるようにした方が良い、ということですね。 ただ、sub()を使うため以外に何らかの理由で、MainClassnのインスタンスを作る機会があった場合には、 そのインタンスをもとにsub()を呼び出せるということですから、 それを考慮して、sub()にstaticを、その場合には付けなくても良い、 ということになるわけですね。 ただ、この場合、 sub()にstaticをつけてクラスメソッドにしていても良いわけですよね。 こういった場合、どちらで対応するのが良いのでしょうか。 大差なさそうですが、もし、何か大きな違いなどがあるようでしたら、 教えて下さい。 もっとも、こんなケースはまずなさそうですが…。 つまり、mainメソッドを含むクラスのインスタンスを作ることは まずないだろう、と私は思っているわけですが、 初心者の考えです、怪しい点などがあれば、またご指導いただけると嬉しいです。