Javaの開発環境が構築できていない方は、以下をご参考にしてください。

  1. 【Java】開発環境を構築しよう
  2. 【Java】Visual Studio CodeでHello World

Javaの基本的な書き方や特徴について、初めてJavaを学習する方向けの教材となります。

JDK: AdoptOpenJDK
バージョン: OpenJDK 11(LTS)

Java File

以下のコードは 【Java】Visual Studio CodeでHello World で作成し、実行したものです。

まずは、このコードを元にJavaの基礎を学習しましょう。

QuickStart.java
/**
 * QuickStart
 */
public class QuickStart {
    public static void main(String[] args) {
        System.out.println("Hello World");
    }
}
                

System.out.println("Hello World");はターミナルに引数 を出力します。
この場合は、ターミナルにHello Worldと出力されます。

クラスについて

Java OOP

Javaは、オブジェクト指向プログラミングという オブジェクトに役割を持たせ複数のオブジェクト間で作用しあいながらプログラムを構築する手法 で開発します。

この、オブジェクトの設計図 となるものが class(クラス)といい、Javaのプログラムは一部を除いて多くの場合では クラス内に機能をコーディングします。

クラスの定義の仕方や詳しい説明は、これからの学習で行いますので、今は、 
public class クラス名 {}
と書くと定義できる ということだけで十分です。

  • クラスはオブジェクトの設計図です。

ファイル名とクラス名の関係性

クラスにはそれぞれ名前をつける必要があり、このクラス名がそのままファイル名となります。

クラスの命名規則は、先頭が大文字の英字で単語ごとに大文字で連結するキャメルケースとなります。

例えば、quick start を この命名規則どおりに変換すると QuickStart となり、それぞれ以下のようになります。

クラス名: QuickStart
ファイル名: QuickStart.java

  • クラス名は先頭が大文字のキャメルケースで命名します。
  • クラス名とファイル名は同じ名前にします。(ファイル名には拡張子が必要です)

メソッドについて

クラスの中には method(メソッド)という関数のような機能を持たせることができます。

プログラム中で繰り返し使用する処理をまとめて メソッドとして定義したり、他のメソッドを呼び出して処理を実行したりします。

このメソッドは、作成する機能に応じて 自由にコーディングして定義します。Javaの開発では 大半がメソッドのコーディングになります。

JavaScript の function(関数) とは 構文 は異なりますが、やっていることは似ています。関数がクラス内に定義されると メソッド と呼ばれるようになります。

メソッドの定義の仕方についても、これからの学習で行います。

  • メソッド内にプログラムをコーディングします。
  • メソッドの命名規則は、先頭が小文字のキャメルケースになります。

エントリポイントについて

Entry point(エントリポイント)

プログラムを実行したときに一番最初に呼ばれるメソッドのことを エントリポイント といいます。

Javaでは、public static void main(String[] args) {} という メソッド が実行時に最初に呼び出されるエントリポイントになります。

このエントリポイントの書き方など、分からないことだらけだと思いますが現時点では  おまじない のようなものだと考えて大丈夫です。

エントリポイント は、Javaのプログラム中に 必ず一つだけ定義する必要があります

この エントリポイント を持っているクラスのことを main routine(メインルーチン)といい、その他のクラスのことを sub routine(サブルーチン)といいます。

  • エントリポイントはプログラム実行時に最初に呼び出されるメソッドです。
  • エントリポイントはプログラムの中に必ず一つだけ定義します。

System.out.println()

System.out.println()はターミナルに引数 を出力します。

今回のコードでは引数に"Hello World"を渡しているので、ターミナルにはHello Worldと出力されます。

println() は引数の値を出力し、最後に改行文字を設定することで行を終了します。

  • printlnプリントライン と読みます。

終端文字

Javaでは、命令文の行末には終端文字が必要です。

この終端文字はセミコロン(;)となります。

コメント文の書き方

Javaのコメント文の書き方についてですが、ここはJavaScriptと同じです。

1行をコメントアウト

1行をコメントアウトする場合は、コメント行の先頭に// を設定します。


public class QuickStart {
    public static void main(String[] args) {
        // ターミナルに値を出力します
        System.out.println("Hello World");
    }
}
                

また、行の途中から残りの行をコメントアウトする場合は次のようになります。


public class QuickStart {
    public static void main(String[] args) {
        System.out.println("Hello World");  // ターミナルに値を出力します
    }
}
                

複数行をコメントアウト

複数行をコメントアウトする場合は、 /* と */ で囲みます。


public class QuickStart {
    public static void main(String[] args) {
        /* ターミナルに
          値を出力します */
        System.out.println("Hello World"); 
    }
}
                

Javaの値と変数について

文字や文字列、整数値や浮動小数点数値、真偽値など、Javaにも値(データ)の型があります。

今回は文字列型と数値型について簡単に学習しましょう。

また、JavaScriptでは変数の宣言時に letconst を使用しましたが、Javaではそれぞれのデータ型(もしくはクラス型)を用いて宣言します

例えば、文字列型で宣言した変数に数値型の値を代入することはできません

データ型 値の種類 サイズ 詳細
byte 整数型 1バイト -128 〜 127 までの整数を格納します。
short 整数型 2バイト -32,768 〜 32,767 までの整数を格納します。
int 整数型 4バイト -2,147,483,648 〜 2,147,483,647 までの整数を格納します。
long 整数型 8バイト -9,223,372,036,854,775,808 〜 9,223,372,036,854,775,807 までの整数を格納します。
float 浮動小数点型 4バイト 誤差なく計算できる有効桁数は6〜7桁です。(例: 12.4 は 3桁)
double 浮動小数点型 8バイト 誤差なく計算できる有効桁数は15桁です。(例: 2.446 は 4桁)
boolean 論理型 1ビット true または false のどちらかの値を格納します。
char 文字型 2バイト 一文字を格納します。シングルクォート('')で囲った文字か、ASCIIコードを格納します。
String 文字列型 intと同じ (クラス型)文字列を格納します。ダブルクォート("")で囲った文字列を格納します。
  • 変数の宣言にはデータ型かクラス型を用いますが、両者の違いについてこの段階で意識しなくても大丈夫です。
  • 値は変数に代入して、変数を使用します。値をそのまま使用することはほとんどありません。

byte型を使用した例

例えば、byte型 は -128 〜 127 までの整数値を格納することができます。

この byte型 を用いて 変数 test を宣言したのが以下のコードです。


public class QuickStart {
    public static void main(String[] args) {
        byte test;
        System.out.println(test); // "The local variable test may not have been initialized"
    }
}
                

ただし、上記のコードを実行すると “The local variable test may not have been initialized(ローカル変数の test は初期化されてないかもしれません)” というコンパイルエラーが発生します。

変数の初期化

コンパイルエラーを無くすためには、以下のように初期化が必要です。


public class QuickStart {
    public static void main(String[] args) {
        byte test = 1;
        System.out.println(test); // 1
    }
}
                

final修飾子で再代入不可の定数を宣言

JavaScript の const のように、再代入ができない 定数 を宣言する場合は、以下のように final 修飾子 を先頭に付与します。


public class QuickStart {
    public static void main(String[] args) {
        final byte test = 1;
        test = 2; // "The final local variable test cannot be assigned. It must be blank and not using a compound assignment"
        System.out.println(test);
    }
}
                

上記コードでは、final修飾子で定義した定数に値2を再代入しようとしているので コンパイルエラーが発生します。

文字列(String)型について

単語や文章のような文字が集合したテキストのことを文字列といいます。

文字列は String型 という型になります。

String型の値を表現する場合は、ダブルクォート"")で値を囲みます。

変数の宣言には、String を用いて 変数名を定義します。

以下のコードでは String型の変数 greeting を宣言し、 値"こんにちは" を代入しています。


public class QuickStart {
    public static void main(String[] args) {
        String greeting = "こんにちは";
        System.out.println(greeting); // こんにちは
    }
}
                

System.out.println(greeting); としているので、変数greetingに代入されている Hello World がターミナルに出力されます。

  • シングルクォート('')で囲んだ場合は文字列ではなく文字(char)型となり、一文字しか表現できません。
  • String型で宣言した変数に値を代入(初期化)しなかった場合の初期値は null になります。

文字列の連結

JavaScriptと同様に文字列をプラス演算子(+)で連結することができます。


public class QuickStart {
    public static void main(String[] args) {
        String greeting = "こんにちは" + " " + "太郎さん";
        System.out.println(greeting); // こんにちは 太郎さん
    }
}
                
  • 変数同士を文字列結合する場合は、StringBuilderクラスを使用することがありますが、今回の学習では省略します。

以下のように数値型と連結するように記述することができます。


public class QuickStart {
    public static void main(String[] args) {
        String profile = "太郎さんは" + 24 + "歳です。";
        System.out.println(profile); // 太郎さんは24歳です。
    }
}
                

また、丸括弧(())で囲むことで計算結果を連結するように記述することもできます。


public class QuickStart {
    public static void main(String[] args) {
        String profile = "太郎さんは" + 24 + "歳です。"
            + "30歳まで約" + (30 - 24) + "年です。";
        System.out.println(profile); // 太郎さんは24歳です。30歳まで約6年です
    }
}
                

エスケープ

文字列の中で特殊文字を表現する場合に時々困ることがあります。

例えば、文字の中でダブルクォート(")を表現したい場合です。この場合、文字列を囲むダブルクォートが閉じられてしまい、正しく表現できません。

このときに、ダブルクォート(")を正しく表現することをエスケープすると言います。

Javaでは、エスケープする対象の文字の前に バックスラッシュ(\)を用います。(Windowsの場合は ¥

ダブルクォートをエスケープする場合は \" となり、
バックスラッシュをエスケープする場合は \\ となります。


public class QuickStart {
    public static void main(String[] args) {
        System.out.println("文字列の中で\"を使用する場合");
        System.out.println("文字列の中で\\を使用する場合");
    }
}
                

整数値(int)型について

Java Integer Data Types(整数値のデータ型)

整数値型には複数のデータ型が存在しますが、最もよく使用される型がこの int型です。

この int型で宣言した変数には、-2147483648 から 2147483647 までの値を代入することができます。

これはint型で宣言した場合 32ビット(4バイト)の容量が使用され、このサイズで表現できる符号付き整数値の最小値と最大値になります。


public class QuickStart {
    public static void main(String[] args) {
        int num = 0;
        System.out.println(num); // 0
        num = 1234;
        System.out.println(num); // 1234
    }
}
                

int型より大きいlong型について

64ビット(8バイト)の容量が使用され、

-9223372036854775808 から 9223372036854775807 までの値を扱うことができます。

int型より大きい値を扱うことができるため、計算した結果の数値が int型のサイズ を超える場合などに long型 を使用します。

数値リテラルの(long型を値として扱う)場合は、数値の末尾に大文字の「L」または小文字の「l」を設定します。

例: 2147483648L;

小文字の「l」は数値の1と間違う可能性があるので「L」が使用されます。

  • 浮動小数点(1.355や-0.52のような値)を扱う場合は、float型もしくはdouble型を使用します。

算術演算子

JavaScript同様に、足算(+)、引算(-)、乗算(*)、除算(/)、剰余(%)を使用して計算を行えます。


public class QuickStart {
    public static void main(String[] args) {
        int num = 0;
        System.out.println(num + 100); // 100
        System.out.println(num - 50); // -50
        System.out.println(20 * 50); // 1000
        System.out.println(20 / 5); // 4
        System.out.println(20 % 3); // 2
    }
}
                

整数値を、0で除算したり、0で剰余を求めたりすると例外(エラー)が発生します。


public class QuickStart {
    public static void main(String[] args) {
        System.out.println(20 / 0); // java.lang.ArithmeticException
    }
}
                

インクリメントとデクリメント

JavaScriptと同様に、演算子 + または - を使用して「1を足すインクリメント)」「1を引くデクリメント)」をすることができます。

インクリメント

プラス記号(+)を用いることで下記のように 1を足した結果を変数に再代入することができます。


public class QuickStart {
    public static void main(String[] args) {
        // インクリメントを使わない場合
        int num1 = 0;
        num1 = num1 + 1;
        System.out.println(num1); // 1
        
        // インクリメントを使う場合
        int num2 = 0;
        num2++;
        System.out.println(num2); // 1
    }
}
                

デクリメント

マイナス記号(-)を用いることで下記のように 1を引いた結果を変数に再代入することができます。


public class QuickStart {
    public static void main(String[] args) {
        // デクリメントを使わない場合
        int num1 = 0;
        num1 = num1 - 1;
        System.out.println(num1); // -1
        
        // デクリメントを使う場合
        int num2 = 0;
        num2--;
        System.out.println(num2); // -1
    }
}
                

記号の前と後の違い

インクリメント/デクリメントでは、記号を前につけるか後につけるかで実行内容が変わります
前につけた場合は、すぐに演算が行われますが、後につけた場合は、行の処理が終了した後に演算が行われます。


public class QuickStart {
    public static void main(String[] args) {
        int num = 0;
        System.out.println(num++); // まだ 0 のまま
        System.out.println(num); // 1
        System.out.println(++num); // 2
    }
}
                

代入演算子

num = num + 5;のような処理を以下のように簡略化できます。


public class QuickStart {
    public static void main(String[] args) {
        int num = 0;
        num += 25;
        System.out.println(num); // 25
    }
}
                
  • 他の算術演算子でも同様に使用できます。
  • 文字列の結合にも使用できます。

キャストについて

データ型を変換することを キャスト すると言います。

int型 を long型 にキャストする場合は簡単です。以下のように書くことで暗黙的にキャストされます。

これは、long型のサイズ が int型のサイズ より大きいからです。


public class QuickStart {
    public static void main(String[] args) {
        int intNum = 256;
        long longNum = intNum; // 暗黙的なキャスト
        System.out.println(longNum); // 256
    }
}
                

逆に long型 から int型 にキャストするような場合は、以下のように明示的に書く必要があります。


public class QuickStart {
    public static void main(String[] args) {
        long longNum = 256;
        int intNum = (int)longNum; // 明示的なキャスト
        System.out.println(intNum); // 256
    }
}
                

上記のように、明示的なキャストは変数の前の丸括弧(())内に型名を設定します。

もし、変数longNumint型の最大値より大きい値が代入されていた場合、変数intNumint型に丸め込まれますこの丸め込まれた値は、正しい値を表現しないことに注意する必要があります。


public class QuickStart {
    public static void main(String[] args) {
        long num = 2147483648L;
        int intNum = (int)num;
        System.out.println(intNum); // -2147483648
    }
}
                

課題

開発を行う Javaファイルの拡張子 は何でしたか?

次のうち正しいものはどれですか?

  1. Javaでは、メソッドの中にクラスを定義する
  2. Javaでは、クラス内ごとに必ずエントリポイントを一つ作成する必要がある
  3. Javaでは、開発時にはクラス内のメソッドのコーディングが多くなる

文字列型の変数 myName にご自分の名前を代入し、ターミナルに出力するプログラムを作成して実行してください。

課題3の変数 userName に 文字列 "は、元気です。" を結合し、ターミナルに出力するプログラムを作成し実行してください。

int型の変数 i を定義し、インクリメントしてください。

課題5で作成した変数 i に、代入演算子を使用して 6000 を乗算した値を再代入してください。

課題6で再代入した変数 i を long型の変数 longNum を定義し、明示的にキャストしてください。