LoginSignup
1
3

More than 3 years have passed since last update.

Java初学者による、初学者のための、初学者のmainメソッド解説

Last updated at Posted at 2020-03-20

はじめに

Java初心者による、情報の整理としての記事です。
修正点・記載すべき追加情報などありましたらご指摘いただけると幸いです。

mainメソッドとは

public static void main(String[]args){
//statement
}

・多くの場合この形で定義されるメソッド(例外パターンは記事後半に記載)

・Javaプログラムの起点となるメソッド(エントリーポイント)

Javaのプログラムを起動した際に一番最初に参照されるポイントです。mainメソッドが起点となるため、他のクラスで定義したメソッドなどはmainメソッド内で呼びださない限り実行されることはありません。

また、mainメソッドが存在しない場合、このようなエラーが発生します。

 Exception in thread "main" java.lang.NoSuchMethodError: main

mainメソッドを分解する

public修飾子

public修飾子は全てのクラスからのアクセスを許可する修飾子です。
mainメソッドにおいては、Javaプログラムの起点となるメソッドであり、様々なクラスからのアクセスを想定してpublic修飾子をつけることが必要です。

static

staticキーワードがつけられたフィールドやメソッドの総称を静的メンバと呼称します。
その中でもstaticキーワードがついたメソッドは静的メソッド(クラスメソッド)と呼称されます。つまり、mainメソッドは静的メソッドであるということが言えます。

静的メソッドは以下の三つの特徴を持ちます。
   1.メソッド自体がクラスに属するようになる
   2.インスタンスにメソッドの分身がセットされる
   3.インスタンスを生み出さなくとも呼び出せる

ここで、重要なのは3番目の特徴です。
mainメソッドはJavaプログラムの起点となるメソッドなので、起動時点ではJava仮想空間には1つもインスタンスが生成されていない状態が考えられます。
この状態に対処するために、mainメソッドはstaticキーワードをつける必要があるということになります。

補足的内容になりますが、他のクラス内に記述され、一旦オブジェクトを生成してから記述されたメソッドはプログラムの起動時に呼びだされる必要性がないため、staticキーワードをつける必要がないということになります。

void

このメソッドが戻り値を返さないことを示しています。

main

メソッド名。JVMが参照する識別子。

String[]args

ここでのルールとしては、String型の配列、またはString型の可変長引数を指定する必要があるというものです。
なので、argsの部分については変更可能ということになります。
しかし、一般的にはargsが使用される例が多いようです。

mainメソッドの使用上の注意点

ここまでの流れで、mainメソッドは特殊なメソッドであるということが分かりました。
ここで、実際に使用する上で注意したいパターンを一つ挙げておきます。


public class Cleric {

    String name = "ユウダイ";
    int hp = 50;
    int mp = 30;

    public static void main(String[] args) {
      // TODO 自動生成されたメソッド・スタブ
      Cleric cleric = new Cleric();
      cleric.selfAid();
    }

    public void selfAid() {
      System.out.println(this.name + "は『自己回復』を唱えた!");
    }

このように一つのクラスの中に、mainメソッドと別のメソッド(ここではselfAidメソッド)が同居しているパターンです。
ここではmainメソッドはClericクラス内に記述されていますが、実際にmainメソッドはあらゆるクラスの起点となるメソッドなので、Clericクラスの持つ振る舞いとは関係がありません。しかし、この形だとあたかもmainメソッドがClericクラスと関連性のあるメソッドのように見えてしまい、コード量が増えてきたときに混乱が発生する恐れがあります。

なので対処法として独立したクラス(例えばMainクラス)を生成し、mainメソッドのみを実行するクラスとして用意するのが無難かと思います。

また、補足として基本的に1ファイルに対して1クラスでコードを記述するということも覚えておくと良いと思います。
(ただし、クラスは入れ子構造にして記述していくこともできるので、あくまでも慣れるまではという認識で)

いろいろなmainメソッドの書き方


public static void main(String args[]) { }
public static void main(String...args) { }
public static void main(final String[]args) { }

ありがとうございました。
以上

【参考文献】
・『スッキリわかるJava入門 第3版』
【参考URL】
・【Java入門】mainメソッドとその引数(args)、戻り値について解説
 https://www.sejuku.net/blog/65082
・Javaのmain()メソッドの説明
 https://www.codeflow.site/ja/article/java-main-method
・mainメソッドとクラスの関係
 https://www.javadrive.jp/start/about/index4.html
・最初に呼び出されるクラスのメソッド
 https://www.javadrive.jp/start/const/index3.html
・【しっかり押さえたい】Javaのmainメソッドとは?と使い方
 https://eng-entrance.com/java-basic-main

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3