• ベストアンサー

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

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

  • Java
  • 回答数4
  • ありがとう数6

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

  • ベストアンサー
  • 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の中で使えたりしませんでしたっけ? なんだか、多少混乱しております。。。 またよろしければ教えて下さい。

関連するQ&A

  • mainクラス内に書いたメソッドの宣言の仕方(staticの必要性)

    java を勉強中の超初心者です、宜しくお願いします。 main と同じクラスに disp というメソッドを作成してやり、” void disp(int a , int b )”と書いてやりましたが、mainからアクセス出来ません。 そこで、” static void disp(int a , int b )” という風に” static ” を先頭につけてやりましたら、うまく動きました。 これは、mainメソッドから他のメソッドにアクセスする場合には、必ず” static ” をつけてやる必要があるということでしょうか。 ======================================================= class クラス練習 { public static void main(String[] args) { disp(5,10); } /*static*/ void disp(int a , int b ) { System.out.println("a+b = " + (a+b)); } }

    • ベストアンサー
    • Java
  • メインメソッドのstatic

    javaでstaticは静的という意味があると思うのですがメインメソッドにも使われていますよね? public static void main(String[] args) publicはどこからでもアクセスできるという意味だったと思うのですが メインメソッドにstaticがついている意味などはあるのでしょうか? 素朴な疑問です。

    • ベストアンサー
    • Java
  • クラスメソッドのみのクラスのオブジェクト生成は不可??

    あるテキストのjavaの問題です。 public class Draw{   static void pixel(int x,int y){     /*座標(x、y)に点を描画*/   }   static void line(int x1,int y1,int x2,int y2){     /*座標(x1、y1)~(x2、y2)に線を引く*/   } } で、これを実行するための以下のようなクラス public class TestDraw{ <ここに入力> } という問題なのですが2つまでは絞れたのですが、 (1) public static void main(String args[]){   Draw d = new Draw().line(10,10,20,30); } ↑× (2) public static void main(String args[]){   Draw.line(10,10,20,30); } ↑○ (2)はlineメソッドがstaticメソッドだからオブジェクト生成しなくても良い、ということなんですが (1)も正解のような気がするのですが・・・ 解説によると「lineはvoidなのでnew Draw().line(10,10,20,30);とすれば正解、とあります。 どうもいまいち理解できません。 クラスメソッドはオブジェクト生成しなくとも良い→オブジェクト生成できない ということなのでしょうか? それからちなみに、public classって2つ記述できないんではありませんでしたか?

    • ベストアンサー
    • Java
  • mainクラスのpublicの意味を教えて下さい

     お早う御座います、JAVA初心者です、宜しくお願いします。  main クラスの public をコメントアウトしてもエラーもなく走ります。  これは、「public static void main(String[] args)」を持っているクラスを自動的に「main クラス」と判断しているということでしょうか。 ============================================================ class Sub { void disp() { System.out.println(" a "); } } /*public*/ class Main { public static void main(String[] args) { Sub s = new Sub(); s.disp(); } }

    • ベストアンサー
    • Java
  • メインメソッドの記述について

    メインメソッドを記述する際に、   public static void main(String[] args){     ~~~~~~~~~~~~~   } と書くと思いますが、なぜpublicを付けなければならないのでしょうか? 簡単に考えるために、1つのクラスのみで実行してみたのですがやはりpublicをつけないとエラーになってしまします。 1つのクラスしかないので、どこからも参照されないからpublicでなくても良いと思ったのですが・・・ ちなみに以下の様なとても簡単なもので考えました。 class E_1{ static void main(String[] args){ System.out.println("実験です"); } }

  • javaのmainメソッド

    public static void main(String args[]) と public static void main(String[] args) の違いを説明してくれないですか? 小さい質問ですいませんが、回答よろしくおねがいします!

  • public static void main(String args

    public static void main(String args[]) { と public static void main(String[] args) { は何が違います?

    • ベストアンサー
    • Java
  • staticなフィールドをstaticじゃないメソッドで使うには?

    いつもお世話になっています。よろしくお願いします。 javaで、staticなメインメソッドからも、staticじゃないメソッドからも1つの メンバ変数(フィールド)を処理したいと思います。 private static String nr; というフィールドを宣言しました。 (staticであるmainメソッドの中で使えるようにstaticで宣言しようと思いました。) 次に、 private void Kensaku() { このstaticではないメソッドの中でString nrを使って処理を行いたいです。 } 初歩の初歩なことを質問してすみませんが、調べても分かりませんでした。 どうか、よろしくお願いします。

    • ベストアンサー
    • Java
  • javaのpackageのMainとは?

    古い本の初心者プログラムでは、 class Hello{ public static void main(String[] args){ System.out.println("Hello!"); } } だけなんですが、統合環境の Intellij IDEAですと、 package com.company; public class Main { public static void main(String[] args) { // write your code here } } となっていて、mainメソッドを含むクラスのMainを含むpackageが必要になっています。どうしてクラスMainは他のpackageで宣言されてないとならないのですか?

    • ベストアンサー
    • Java
  • Javaについて教えてください!

    sampleパッケージに属するMain.javaとSub.javaがあり、Main.javaのmainはSub.javaのsubメソッドを呼び出して「OK」と表示させるプログラムを教えてください! //Main.java package sample; public class Main{ public static void main(String[] args){ Sub.sub(); }} //Sub.java package sample; public class Sub{ static String str = "OK"; public static void sub(){ System.out.println(str); }} String型の変数strはクラス変数で行いたいのですが、どこを改善すれば良いでしょうか?

    • ベストアンサー
    • Java

専門家に質問してみよう