質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

5回答

1404閲覧

Javaについて

退会済みユーザー

退会済みユーザー

総合スコア0

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2016/12/03 12:51

staticについて調べているうちにわからなくなったのですが、
そもそもpublic static void main(String[] args)とは何なのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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

raccy

総合スコア21733

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

文化です!
郷に入れば郷に従えです。

この世の様々な文化の成り立ちにはそれなりの理由や経緯がありますが、理解しようとすには時間の無駄です。
その時間的リソースを他の努力へ向けましょう。

static maineで書け!それがjavaのルールだ!
と決められてそうなっているのでそう書きましょう。

あとは、そのルールに従い動くように作るのみです。

投稿2016/12/03 14:01

tomneco

総合スコア24

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

あなたはどのような理解をしていますか?

こういった質問では自分がどう理解していて、「この辺りがあやふやである」や「疑問がある」とあなたの理解と実際の齟齬を見つけることが重要です。

投稿2016/12/03 12:55

yona

総合スコア18155

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/12/03 13:07

回答ありがとうございます。 書かなければいけないものだと思って書いているだけで特に意味を考えたことはないのですが、 staticなメソッドから、非staticなメンバにアクセスすることはできないと知ってから問題を見るとpublic static void mainはstaticと書いていないものにもアクセスしているように感じたので質問しました。
guest

0

public…公開。どこからでもアクセス可能。
static…静的。インスタンスに結びつかず、クラスとして持つメンバ。
void…返り値なし。
main…メソッド名。
String[] args…String型の配列型の引数。

Javaがクラスからプログラムを起動する際に呼ぶメソッドです。

「何なのでしょうか?」と聞かれるとこういう答え方しかできないのですが…

投稿2016/12/03 15:39

swordone

総合スコア20649

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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

回答ありがとうございます。staticでないフィールドにアクセスすることは不可能なのでしょうか?
退会済みユーザー

退会済みユーザー

2016/12/03 13:36

public class Ka{ static int id; String name; static void printInfo(){ System.out.println(id + ":" + name); } public static void main(String[] args){ Ka k = new Ka(); k.printInfo(); } } これはどこをどのように直せば実行可能になるのでしょうか?
退会済みユーザー

退会済みユーザー

2016/12/03 15:26

以下のようにすれば実行可能になります public class APD{ static int id=11; String name="you"; static void printInfo(){ APD l = new APD(); System.out.println(id + ":" + l.name); } public static void main(String[] args){ APD k = new APD(); k.printInfo(); } }
退会済みユーザー

退会済みユーザー

2016/12/03 22:39

少し理解できた気がします。ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問