Programming 3 / Java

トップに戻る

mainメソッド・コマンドライン引数・Mathクラス

Javaプログラムがどこから始まるのか、実行時の値がどこへ入るのか、インスタンスを作らずに使える数学機能を順番に確認します。

1

Javaプログラムの開始地点

Javaの実行環境は、決められた形の main メソッドを探し、そこから処理を始めます。

mainメソッドの基本形
public static void main(String[] args) {
  // 最初に実行される処理
}
部分意味
publicJavaの実行環境から呼び出せるように公開する
staticインスタンスを作らず、クラスメソッドとして呼び出せるようにする
void戻り値がないことを表す
mainプログラムの開始地点として決められた名前
String[] argsコマンドラインから渡された文字列を格納する配列
main にも static が付いています。Javaの実行環境は MainSample のインスタンスを作らずに、このクラスメソッドを実行します。
2

コンパイルして実行する

MainSample.java
public class MainSample {
  public static void main(String[] args) {
    System.out.println("Javaプログラムを実行しました");
  }
}
ソースファイルMainSample.java
コンパイルjavac MainSample.java
MainSample.class を生成
実行java MainSample
従来のコンパイル後の実行では、java MainSample.java.class を付けません。また、公開クラス名とファイル名を一致させます。
近年のJavaで使える直接実行について

java MainSample.java としてソースファイルを直接実行する方法もあります。この教材では、javac でコンパイルしてから java で実行する流れを扱います。

3

コマンドライン引数

実行するクラス名の後ろに書いた値が、左から順番に文字列配列 args へ格納されます。クラス名自体は配列に入りません。

cmd
java MainSample apple バナナ
MainSample実行するクラス名
argsには入らない
appleargs[0]
バナナargs[1]

すべての引数を表示する

MainSample.java
public class MainSample {
  public static void main(String[] args) {
    System.out.println("コマンドライン引数は以下の通り");

    if (args.length >= 1) {
      for (int argumentIndex = 0;
           argumentIndex < args.length;
           argumentIndex++) {
        System.out.println("引数[" + argumentIndex + "] = "
            + args[argumentIndex]);
      }
    } else {
      System.out.println("コマンドライン引数はありません");
    }
  }
}

args は慣習的な仮引数名です。別の名前にもできますが、この教材では一般的な args を使用します。

apple と バナナを指定した実行結果
output
コマンドライン引数は以下の通り
引数[0] = apple
引数[1] = バナナ
引数を指定しなかった実行結果
output
コマンドライン引数は以下の通り
コマンドライン引数はありません
4

配列の長さと空白

args.length で引数の個数を取得できます。配列の番号は0から始まるため、最後の要素番号は args.length - 1 です。

実行コマンドargs.length配列の中身
java MainSample0要素なし
java MainSample apple バナナ orange3args[0]args[2]
java MainSample red apple2"red""apple"
java MainSample "red apple"1"red apple"
空白を含む文字列を1つの引数として渡すときは、ダブルクォーテーションで囲みます。
5

Mathクラスのメソッド

java.lang.Math は数学計算のためのクラスです。メソッドはクラスメソッドなので、new Math() でインスタンスを作らず、クラス名から呼び出します。

MathSample.java
public class MathSample {
  public static void main(String[] args) {
    int firstNumber = 10;
    int secondNumber = 20;

    System.out.println("大きい値: " + Math.max(firstNumber, secondNumber));
    System.out.println("小さい値: " + Math.min(firstNumber, secondNumber));
    System.out.println("25の平方根: " + Math.sqrt(25));
    System.out.println("2の3乗: " + Math.pow(2, 3));
    System.out.println("-10の絶対値: " + Math.abs(-10));
  }
}
実行結果を確認する
output
大きい値: 20
小さい値: 10
25の平方根: 5.0
2の3乗: 8.0
-10の絶対値: 10
Math クラスのコンストラクタは外部から呼び出せないため、new Math() はできません。
6

Mathクラスの定数

円周率 Math.PI と自然対数の底 Math.E も、クラス名から利用できます。

CircleSample.java
public class CircleSample {
  public static void main(String[] args) {
    double radius = 10.0;
    double circumference = 2 * Math.PI * radius;
    double area = Math.PI * Math.pow(radius, 2);

    System.out.println("円周: " + circumference);
    System.out.println("面積: " + area);
    System.out.println("自然対数の底: " + Math.E);
  }
}
定数およその値
Math.PI3.141592653589793
Math.E2.718281828459045
7

インスタンスメソッドとの違い

種類呼び出し方計算に使うもの
インスタンスメソッドsmallRectangle.getArea()特定のインスタンスが持つ幅と高さ
クラスメソッドMath.sqrt(25)引数として渡した値
main もクラスメソッドの一種です。Math.sqrt と同様に、インスタンスを作らずクラスに定義されたメソッドとして呼び出されます。
8

確認問題

  1. java MainSample one two と実行したとき、args.length はいくつですか。
  2. red apple を1つの引数として渡すには、どう書きますか。
  3. Math.sqrt(25) を呼ぶ前に new Math() が不要なのはなぜですか。
解答を確認する
  1. 2です。args[0]"one"args[1]"two" です。
  2. java MainSample "red apple" と書きます。
  3. sqrt はクラスメソッドであり、クラス名から直接呼び出せるためです。