staticについて調べているうちにわからなくなったのですが、
そもそもpublic static void main(String[] args)とは何なのでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
0
どんなプログラムも一番最初にどこかから始めなくてはなりません。このように一番最初に始めるところをエントリーポイントと言います。エントリーポイントがどこになるのか、どうやって探すのかはプログラミング言語によって様々です。
では、Javaの場合を見てみましょう。Javaを実行するには、java
コマンドでクラス名を指定する方法とjarファイルを指定する方法の二つがあるのですが、jarファイルを指定する方法はクラス名を指定する方法の応用(マニフェストファイルを使うなどちょっと複雑)なので、今回はクラス名を指定する方法だけについて解説します。
次のようにコマンドを実行したとしましょう。
java jp.example.sample.Hello 太郎 花子
指定されたクラス名はjp.example.sample.Hello
です。java
コマンドはこの指定されたクラスをクラスパスから検索し、ロードします。クラスパスはデフォルトで、
.
(カレントディレクトリ)- Javaシステムの標準ライブラリ(複数の場合があります)
が含まれます。また、CLASSPATH
環境変数や-classpath
オプションで任意の場所を追加可能です。(このとき、.
はクラスパスから除外されてしまいます。カレントディレクトリで引き続き検索を行うには、指定のクラスパスに.
も含める必要があります。)
jp.example.sample.Hello
をカレントディレクトリで探す場合は、カレントディレクトリのjpフォルダのexampleフォルダのsampleフォルダのHello.classファイルを探します。なければ、次のクラスパスでの場所で同じように探します。もし、jarやzipが指定されている場合は、それらを展開した場合のフォルダとフィイルの構成でそのファイルを探します。
該当するHello.classファイルが見つかったとします。java
はこのファイルをロードします。Javaではフォルダとファイルの構成でクラス名が決まるのでjp.example.sample.Hello
というクラスが書かれているはずです。そして、このjp.example.sample.Hello
クラスにある**main
という名前のstaticなメソッド(クラスメソッド)を呼び出します。このmain
がJavaのエントリーポイント**です。ただし、このmain
には制約があります。
main
はpublicでなければなりません。なぜならjava
のコマンドは同じパッケージでもサブクラスでもましてや同じクラスでも無いからです。全く無関係のクラスのメソッドを呼び出すには、そのメソッドはpublicである必要があります。main
はstaticでなければなりません。なぜならjava
が呼び出す時、まだ何もインスタンスを作成していないからです。インスタンスを作成せずにメソッドを呼び出すには、そのメソッドはstaticである必要があります。main
メソッドの戻り値は、無し(void
)でなければなりません。main
は始まりのみで、main
の終わりがプログラムの終わりを必ずしも意味するわけではない(特にマルチスレッドの場合)ため、戻り値があっても無意味だからです。main
メソッドの引数は、Stringの配列(String[] args)
、または、Stringの可変引数(String ... args)
でなければなりません。これらの引数にはクラス名指定の後の残りのコマンドライン引数が渡されます。
よって、main
は
Java
1public static void main(String[] args) { ... } 2public static void main(String ... args) { ... }
のどちらかになります。(args
は任意の名前に変更は可能ですが、それ以外は変更できません)
残りのコマンドライン引数である、太郎
と花子
がStringの配列としてargs
にセットされ、main
の中身が実行されます。main
が最後まで実行されると、(別スレッドを動かしている等がない限り)プログラムは終了します。
【まとめ】
main
メソッドはJavaのエントリーポイントである。正しく動作するには、pubicかつstaticで、戻り値が無く、Stringの配列または可変引数を引数ととして受け取らなければならない。
投稿2016/12/03 17:02
総合スコア21733
0
あなたはどのような理解をしていますか?
こういった質問では自分がどう理解していて、「この辺りがあやふやである」や「疑問がある」とあなたの理解と実際の齟齬を見つけることが重要です。
投稿2016/12/03 12:55
総合スコア18155
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ベストアンサー
public static void main(String[] args)
クラス内にこのメソッドを入れてそのクラス名のファイル名でコンパイルして実行すると、
メインメソッドとしてこのメソッドが実行される
このメソッドがなければ実行ができない
java ファイル名 文字列 文字列 文字列・・・
と入力して実行すると
仮引数String型配列args内に ファイル名の後に半角スペースで区切って入力した文字列が全部入っている
public static void main(String[] args)メソッドはstaticメソッドなので
このメソッド内からstaticでないクラス変数へのアクセスは基本的にできない
staticでないメソッドへのアクセスも基本的にはできない
メソッド内でクラスをインスタンス化してからだとアクセスできる
以下のようにするとインスタンス化してからだとアクセスできる事が分かります
java
1class OPP{ 2 3String t="staticでないクラス変数を参照できた!"; 4static String y="staticだから参照できた"; 5 6public static void main(String[] args){ 7 8System.out.println(y); 9 10OPP a=new OPP(); 11 12 13System.out.println(a.t); 14a.ff(); 15 16} 17 18 19void ff(){ 20 21System.out.println("staticでなくともメソッドを実行できた!"); 22 23} 24 25 26 27 28}
投稿2016/12/03 13:03
編集2016/12/03 13:26退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2016/12/03 13:18
退会済みユーザー
2016/12/03 13:36
退会済みユーザー
2016/12/03 15:26
退会済みユーザー
2016/12/03 22:39
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。