つまり、変数の中身の値だけが渡されるためメソッド内で引数の値を変更しても渡した引数の値は変更されないということです。, などがあります。 Java では配列もオブジェクトです。 ... 5}; // 配列はヒープ上のアドレスm ... メソッドの返り値を実引数 x に代入すれば、x の配列が丸ごと入れ替わる。 このメソッドは値を返すことで有意義なことをしている。 Javaのプログラムを実行する時は、以下のように実行するクラスを指定します。すると、指定されたクラスにmainメソッドがあるかをJavaが調べて、あればそこから実行を始めます。これは、Eclipseのような統合開発環境で実行する時も、裏でやっていることは同じです。, そして、指定されたクラスにmainメソッドがなければ、以下のようなエラーが出てしまいます。mainメソッドがない(Main method not found)と言っていますね。, これは、例えばjarファイルの中にあるクラスを実行する時でも同じです。jarファイルの中に仕様どおりのmainメソッドを持つ別のクラスがあったとしても、指定したクラスにきちんとしたmainメソッドがなければ駄目なのです。, プログラムへは処理に使うパラメータ(プログラムへの引数)を渡したいですよね。mainメソッドのString配列には、Java実行時にコマンドラインで指定されたパラメータの文字列が設定されています。, パラメータとしては空白で区切られた単位でString配列に設定されますが、クォーテーションなどでくくると、空白などもまとめて一つの文字列にできます。ただし、どういう記述をすればいいかは、コマンドプロンプトやUnixでのシェルの文法に依存します。, そして、mainメソッドの引数のString配列は、パラメータが指定されていなくてもnullにはならず、長さ0の配列になります。, なお、数字をパラメータとして渡しても全てStringになりますので、数字として扱いたいならプログラム側で数値として変換しなければなりません。, javaコマンド(Java仮想マシン)向けの特別なパラメータは、mainメソッドのString配列には設定されません。これらは、javaコマンドと実行するクラス名の間で指定するものです。以下の例では、“java”と“Main”の間にある「-dsa -Dxxx=test -Xmx100m -XX:-Inline」です。, ただし、実行するクラス名の後ろに指定したならプログラムへのパラメータになりますので、mainメソッドの引数から参照できます。そして、javaコマンドへのパラメータとしては使われません。これは地味に間違えやすいので注意しましょう。, mainメソッドが終わるということは、(原則として)Javaのプログラムとしての実行も終わるということです。終わらせ方はいくつかありますので、順に紹介していきます。, mainメソッドはプログラム中で一番最初に動くものだとは言え、普通のメソッドです。ですので、mainメソッドの最後までたどり着けばmainメソッドは終わりますし、途中でreturnすれば、途中で終わらせられます。, ですが、単純にreturnした場合は、プログラムからの戻り値を指定できません。上の例では、プログラムからの戻り値が設定される変数“ERRORLEVEL”の内容が0ですが、これはJavaの中で戻り値を指定せず、プログラム実行中にエラーが起きなかった場合のデフォルトです。, プログラム中でエラーが起きた場合などは、戻り値をエラーの種類を表す何かの数字にしたいことはあります。その場合は、後述するSystem.exitやRuntime.exitを使って、数字を指定します。, あと、スレッドというものを使ったプログラミングをしている時は、mainメソッドが終わってもJavaのプログラムが終わらないことがあります。これについてはmainメソッドの戻り値がvoidであることにも関係しますので、詳しくは後述します。, mainメソッドを終わらせるreturnの他に、Javaプログラムを終了させるなら、System.exit(int)、Runtime.exit(int)、Runtime.halt(int)が使えます。これらはmainメソッドの外でも使うことができ、実行した時点ですぐにJavaプログラム全体が終了します。, しかも、これらのクラス・メソッドを使うと、プログラムからの戻り値を整数(int)で指定できます。, なお、Runtime.exitとhaltの違いは、例えば以下のようなJavaの終了時に行いたい処理を実行するかどうかです(exitは実行し、haltは実行しない)。ただ、この動きの詳細はこの記事の範囲を超えますので、興味があれば「java addShutdownHook」などで検索してみてください。, ここまで説明してきたとおり、Javaのmainメソッドはpublic static void main(String[])でなければなりません。そのようにJava仕様で決められている…とだけ覚えていても、もちろん実用上は構いません。, でも、ここまで読み進めていただいた方へは、せっかくですから「Javaのmainメソッドはなぜそういう決まりなの?」の観点から、mainメソッドに関する話題をお伝えしてみましょう。, mainメソッドがpublicなのは「仕様でそう決まっている」だけです。mainメソッドをprivateやprotectedにもできてしまうと、アクセス修飾子を何にすべきか混乱や議論が生じるので、仕様でpublicとするようあらかじめ決めてあるだけなのかもしれません。, さらになぜを進めるなら、Java仮想マシンにとってmainメソッドがpublicであるべき理由はないからです。mainメソッドがprotectedでもprivateでも、そういうメソッドがあることはクラスファイルを調べればJava仮想マシンはわかりますし、そのメソッドを呼び出すこともやろうと思えば当然できるからです。, 普通のJavaクラスからでも、標準APIのリフレクションを使えば、以下のようにprivateなstaticメソッドを別のクラスから呼び出せます。ということは、Javaそのものを動かしているJava仮想マシンが、単なるprivateなstaticメソッドを呼び出せないなどとは、到底思えませんよね。, それに実際のところ、ずっと昔のバージョンのJavaでは、privateなmainメソッドでも実行できてしまうことが、仕様どおりでない動きのJava仮想マシンのバグとして、開発中に顔を出していたくらいなのです。, mainメソッドがstaticメソッドでなければならないということは、逆に言えばインスタンスメソッドでは駄目だということです。その理由は、「クラスの詳細を知らなくても、絶対確実にインスタンスを生成できる方法がJavaにはない」からです。, 前述のとおり、Java仮想マシンの観点ではアクセス修飾子はないも同然ですが、インスタンスの生成はクラスが持つコンストラクタだけしか使えません。例えば、引数のあるコンストラクタしかないクラスなら、newする時にコンストラクタの引数に何を指定すればいいのか、Java仮想マシンは分からないですよね。, ですから、mainメソッドはstaticメソッドでなければならないのです。もちろん、staticメソッドを呼び出すにしてもクラスの読み込みが正常に終わらなければなりません。それでも、インスタンスを生成することに比べれば、制約がはるかに緩いのはお分かりいただけるでしょうか。, mainメソッドの戻り値がvoidなのは、スレッドを使ったプログラミングをしている場合は、mainメソッドが終わってもJava仮想マシンそのものの実行は終了しないことがあるから…とも考えられます。, 例えば、以下のようにmainメソッドの中でスレッドを生成して実行してみます。mainメソッドはすぐ終わりますが、その後でも生成したスレッドが動いていることがわかります。Java仮想マシンが終わるのは、実行しているスレッドが全て終わった時なのです。, ですから、mainメソッドの戻り値としてプログラム全体の戻り値を指定できてはまずいケースがあります。なぜなら、スレッドでの実行結果を戻り値にしたいことがあるからです。そのために、System.exit(int)、Runtime.exit(int)、Runtime.halt(int)があるのです。, mainメソッドの名前が“main”なのは、JavaがC言語の流れをくむプログラミング言語だからでしょう。Javaのプログラミング言語としての文法はC言語が基になっていますので、C言語の経験者もとっつきやすいよう、C言語のエントリーポイントであるmain関数と同じ“main”にしたのだと考えられます。, なお、JavaやC言語以外のプログラミング言語でも、mainあるいはそれに近い言葉は大変よく使われます。おおよそ、プログラムのエントリーポイントに関連することなので、覚えておけばいいことがあるかもしれませんよ。, 例:Pythonではmain関数そのものはないが、”__main__”というものが使える, mainメソッドの引数がStringの配列だけなのは、これまたJavaはC言語の仕様が基になっているからとも言えるでしょう。それに、mainメソッドのオーバーロードを許した場合、引数違いのどのメソッドを呼べばいいのか、Java仮想マシンの立場で考えると簡単には決められないですよね。, C言語のmain関数の引数は、プログラムへのパラメータの数と、文字列を格納しているchar配列へのポインタです。でも、Javaにはポインタはありませんし、配列の要素数は配列のlengthで分かるので、String配列だけでC言語とほぼ同じ意味になりますし、それ以上の情報はいりません。, Stringであるのは、パラメータとしてもっとも扱いやすいからということもあるでしょう。何番目のパラメータが何の型かは、Javaで作られるすべてのプログラムで同じにはできませんから、一番無難で扱いやすいな文字列にしておいて、必要ならプログラム側で都度変換をしてください、ということです。, 他のプログラミング言語では、Javaとは違ってエントリーポイントとする関数・メソッドが選べるものは多いです。そのようなものだと、引数や戻り値を必要・不要のどちらにするかプログラマが選べたりします。, 例えば、C# 7.0なら以下のどれかであればOKです。なんと、C#ではエントリーポイントからの戻り値もintとvoidから選べるようですね。C言語も、基本的には三つのパターンからどれかを選びます(二番目と三番目は実質的には同じです)。, ですので、使っているプログラミング言語のエントリーポイントについてきちんと学んでおけば、いざと言う時に便利に使えるかもしれませんよ。, この記事では、Javaプログラムのエントリーポイントであるmainメソッドについてお伝えしてきました。mainメソッドには5つのルールがあります。きちんと覚えておられますか?

.

Sendgrid Sms ɀ信 5, Beatjam Video Converter 9, Thinkcentre M73 Tiny DŽ線lan 14, Ƹ生会 dž本病院 2ch 4, Ǜ席食堂 You Hey 8, Âフトテニス ɫ校 ȩ合 4, Shizuka Âズカ Sz Hm10wh ǫ体型不織布マスク 4, Unity Android Build Support 9, lj島若利 Ť小説 ǔ 7, Oracle Sqlファイル Ů行 5, Pc Âーム Ãルスクリーン Âスクバー 8, Webex ȃ景画像 Windows 7, Ÿ団乾燥機 ɝ Âタッチメント 100均 48, Âチ恋口上 ƭい手 Ů悪 4, Âクヨ Ļ入帳 Âクセル 28, Ãケモンgo Hp ś復 10, ťきな人 ɀ絡こない ōい 11, Ãムスター ůる場所 Ťえる 10, Suh Dude Ƅ味 5, Ark Âロープ Ŝ台 47, Ȥ瘡 Ãザイン Ȧえ Ɩ 16, Ů蘭 Ƙ画 Âナ雪 4, Joycon Droid Amiibo 10, Âルグランド E52 Ãア Ãニター Ťし Ɩ 5, ĸ国志大戦 ȧ任 Ǝ示板 9, Greetings In The World Œ訳 4, 18歳 Ɛ帯契約 Ãコモ 4, DZ Ľ Ťきくなる 5, Secret Of Goddess The God World Only Know Œ訳 17,