Java

出典: フリー教科書『ウィキブックス(Wikibooks)』
ナビゲーションに移動 検索に移動
Wikipedia
ウィキペディアJava言語の記事があります。
Wiktionary
ウィクショナリーJavaの記事があります。

メインページ > 工学 > 情報技術 > プログラミング > Java


本書は、Javaの技術を全体的に見渡すことができるように、いくつかのパートに分けて解説を進めます。 なので読者は、本書の解説は知りたい部分だけを選んで読んでも構いません。

入門の文法[編集]

  • 概要
Javaクイックツアー (Javaとはどんなものか / Javaの現状)
  • かんたんなJava入門
プログラミングのための準備 (インストール方法など)
Hello world (コンパイル方法、実行方法、printfとprintln など)
  • かんたんな基礎
算術演算
変数と代入演算
反復処理
条件分岐
  • クラスとメソッド
クラス

発展事項[編集]

クラスの書式 / 継承
/文法 メソッド ※ クラスでメソッドを説明したので、一旦リンク除去
フィールドと変数
変数とは / フィールドとは / データ型の種類 / ラッパークラス
パッケージ
ジェネリクス
アノテーション
オートボクシング

J2SE / Java SE[編集]

基本的なAPIの使い方
Calendar
Date
String
StringBuffer

※ 未作成[編集]

※ 下記の記事は、教科書本体ができて、ある程度の完成度になったら、「未作成」以外の独立した節に移動してください。

テスティング[編集]

テスティング入門
テストとは何か / テストはなぜ重要か / テスト駆動はなぜ重要か
テストを書いてみよう

J2EE / Java EE[編集]

JSP入門
サーブレット入門

歴史[編集]

アメリカの代表的なコンピュータ企業の1つに、サン・マイクロシステムズという大企業がありました。

サン・マイクロシステムズ社は、1995年5月23日に、新しいプログラミング言語と、それを稼働させるプラットフォームを公式発表しました。 その言語とプラットフォームには、その総称として、Javaという名が付けられていました。 すなわち、本書で解説する技術の誕生です。 Javaは“未来を変える技術”として、当時耳目を集め、大いに喧伝されました。

その後のJavaの歩みは、必ずしも当時描かれた夢のとおりだったとは限りません。 しかし、多少の曲折を経ながらもJavaは急速に、そして深く浸透し、現在では欠かすことのできない主要な開発技術の1つとして数えられるに至っています。 その技術的な蓄積も、ドッグイヤーと呼ばれる急速な流れの中で、すでに簡単には語り尽くせぬ厚味ができていると言ってよいでしょう。

GUIツール

かつて「Javaアプレット」という、JavaでGUIなどを簡単に作れるツール群が開発されていましたが、現代ではJavaアプレットは廃止されています。しかし別のツール群で21世紀の現代(2021年に本文を記述)でも容易にGUIをJavaで作れます。awtやswing、JavaFXなど(それぞれ別ツール)のJava用 GUI制作ツール群により、現代でもJavaでGUIアプリの制作が可能です。GUIについては、他の単元で説明します。

国際規格は無い

Javaは国際規格には、なっていません。かつて1990年代の後半頃、Javaの国際規格化が議論されましたが、そのまま国際規格にならないまま、現代に至っています。なお(Javaと比較される事も多い)C#には国際規格が存在します。)

執筆者むけの告知[編集]

執筆者は、既存のページを修正できるだけでなく、Javaに関するまだ書かれていない重要な分野について、いつでも新規に書き起こし、それをこのページからリンクすることができます。

もちろんJavaは、現在も発展し続けています。その学習や、あるいはその情報伝達のために、ぜひ本書を活用してください。

関連項目[編集]

ライブラリ[編集]

Apache Commons Lang

※記述中[編集]

GUI[編集]

※ GUIアプリをどこの単元に入れればいいか分からないので、とりあえず目次ページに間借りします。Java詳しい人がいれば、適切なページに移動してください。
※ Javaアプリの解説をしたいので、GUI関連の単元はwikibooksにも欲しい。

GUI をJavaで表示するには、awtというライブラリをインポートします。標準的なJavaをインストールしてあれば、下記のようにimport 命令をコード中に書くだけでインポートできます(コード外でのインストール作業は不要です。)

WindowsだけでなくLinuxのopen-jdkでもawtは使えてGUI表示できるので、安心して使って良い。(※ Fedora 35 で 2021年11月4日に実機で下記コードを実行して確認済み。)

sample.java
import java.awt.*;
import java.awt.event.*; // これないとウィンドウ閉じられない

public class sample extends Frame {
    public static void main(String[] args) {
        sample sm = new sample();
    }
    sample() {
        super("ここはタイトル"); // ウィンドウのタイトル欄に表示される 

        addWindowListener(new closableWindowAdapter()); // 後述のウィンドウ閉じるようにクラスを読み込ませる必要あり

        setSize(250, 200); // ウィンドウサイズの設定
        setVisible(true); // 表示/非表示の切り替え。trueなら表示。falseなら非表示。
    }
}

// ウィンドウを閉じられるようにするのに必要
class closableWindowAdapter extends WindowAdapter {
    public void windowClosing(WindowEvent e) {
        System.exit(0);
    }
}

ウィンドウを作成するには、awtの Frame クラスを使います(コードの前半のextends の先に「Frame」があります)。上記コードのように main() メソッドの属するクラスが Frame クラスを継承します[1]

なお、コード後半にある、ウィンドウ閉じる関連のクラスのコード中の extends の先にある windowAdapterクラス というのは、一通りのイベントに対応したクラスです。上記コードでは可読性を考えてウィンドウ閉じる関連のクラスをmain()メソッドとは分離しましたが、別にmain()メソッド内でウィンドウ閉じる関連のクラスを記述しても、コードは実行可能です(コード例については省略する)。

なお、個別のイベントに対応したメソッドとしては、

windowOpened メソッド
windowClosing メソッド
windowClosed メソッド
windowIconified メソッド
windowDeiconified メソッド
windowActivated メソッド
windowDeactivated メソッド

があります。個別のメソッドを記述するのが面倒なら、WindowAdapterクラスでまとめてサンプルコードのように書くことも可能です。

windowClosing は java.awt.event.WindowListener のメソッドです。もしつづりを間違えてコード入力すると、ウィンドウが閉じなくなります。ウィンドウリスナーを作成したさい、用意されるメソッドの一種が windowClosing であり、文字通り「ウィンドウを閉じるメソッド」を意味します[2]

ウィンドウ終了させるには、入力ミスなどが無ければ、ウィンドウ右上のXボタン(閉じるボタン)をクリックすれば普通に終了します。

もし入力ミスなど何らかの原因でウィンドウが閉じなくなった場合、ウィンドウを終了させるには、Java起動に用いたコマンド端末(例えばWindowsの場合ならコマンドプロンプト)ごと終了します。

webサーバ[編集]

windows の場合[編集]

Java18から追加された機能で、簡単なwebサーバがあります。

コマンドライン(たとえばwindowsなら「コマンド プロンプト」)からコマンドjwebserverで呼び出して使えます。利用時、jwebserverコマンドはbin内に用意されているので、インストールしたjava18のbinフォルダを指定します。

つまり下記コマンドのようになります(一例)。

C:\Users\ユーザ名>C:\jdk-18\bin\jwebserver

もしこのコマンドに成功すれば、ルートディレクトリに、ホームフォルダの内容がアップロードされます。特に設定を変更して無い限り、ホームフォルダが対象になります(2022年4月21日に確認)。

コマンドライン上の表示では、コマンド実行後にたとえば下記のように表示されます。

C:\Users\ユーザ名>C:\jdk-18\bin\jwebserver
Binding to loopback by default. For all interfaces use "-b 0.0.0.0" or "-b ::".
Serving C:\Users\st and subdirectories on 127.0.0.1 port 8000
URL http://127.0.0.1:8000/
127.0.0.1 - - [21/4譛・2022:16:25:27 +0900] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [21/4譛・2022:16:26:05 +0900] "GET / HTTP/1.1" 200 -


このあと、webブラウザ(たとえばFirefoxなど)で、アドレスバーに http://127.0.0.1:8000/ を入力してアクセスします。

すると、たとえば下記のように、カレントディレクトリにあるファイル一覧が表示されます。つまり、カレントディレクトリのディレクトリ構成が表示されます。

aaa.txt
test.txt
hello.c

どのようなファイルがあるかは個々人のパソコン利用状況によって異なりますので、上記の表示例はあくまで一例です。

なお、 index.html というファイルがあれば、上記のディレクトリ構成に変わり、そのファイルの内容が表示されます。

Javaの webサーバを終了するには、Ctrl + C です。つまりコントロールボタンCtrl を押しながら Cボタン で終了です。


そのほか、java 18を使える環境なら、コマンド

java --module jdk.httpserver

でも可能です。

アドレスバーに http://127.0.0.1:8000/ を入力してアクセスすれば、ホームフォルダの内容があります。

Linux の場合[編集]

公式サイトのバイナリを使う方法[編集]

説明に簡単のため、ホームフォルダに公式サイトからダウンロードしてきたjdk-18以降のバイナリを置きます。

あとは下記のコマンド実行をするだけです。

/home/ユーザー名/openjdk-18.0.1.1_linux-x64_bin/jdk-18.0.1.1/bin/jwebserver

実行結果(ターミナル側)

[ユーザー名@fedora ~]$ /home/ユーザー名/openjdk-18.0.1.1_linux-x64_bin/jdk-18.0.1.1/bin/jwebserver
Binding to loopback by default. For all interfaces use "-b 0.0.0.0" or "-b ::".
Serving /home/ユーザー名 and subdirectories on 127.0.0.1 port 8000
URL http://127.0.0.1:8000/
127.0.0.1 - - [21/5月/2022:10:01:32 +0900] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [21/5月/2022:10:01:33 +0900] "GET /favicon.ico HTTP/1.1" 404 -

webブラウザ(たとえばFirefoxなど)で、アドレスバーに http://127.0.0.1:8000/ を入力してアクセスすれば、(windowsの場合と同様に)ホームフォルダの内容があります。


dnf や apt を使う入手経路の場合[編集]

パッケージマネージャ(dnf や apt など)によってディストリビューションなどがインストールしてくれる jdk を使う場合、

  • 事前の準備

なお、Fedora で dnf コマンドで openjdk-18 を探す場合、

sudo dnf reinstall java-latest-openjdk

または

sudo dnf install jave-18 

で見つかります。

なお dnf install jave-latest (不可)では見つかりません。(java-latest-openjdk がインストールされるにもかかわらず。)

インストールできたら、

sudo alternatives --config java

で、java-18 以降に、使用するjavaを切り替えます。


  • コマンド
java --module jdk.httpserver

でも可能です(Fedora 36 で確認)。


実行結果

[ユーザー名@fedora ~]$ java --module jdk.httpserver
Binding to loopback by default. For all interfaces use "-b 0.0.0.0" or "-b ::".
Serving /home/ユーザー名 and subdirectories on 127.0.0.1 port 8000
URL http://127.0.0.1:8000/
127.0.0.1 - - [21/5月/2022:10:13:35 +0900] "GET / HTTP/1.1" 200 -

アドレスバーに http://127.0.0.1:8000/ を入力してアクセスすれば、(windowsの場合と同様に)ホームフォルダの内容があります。

レコード型[編集]

Java16でrecord型追加された[3]。レコードという名前のとおり、インスタンス作成時の一度しか書き換えをしない記録を書くためのものである。

クラスを用いても同じ動作のものを作れるが、レコード型を使うことによりコード量が短くなるし、意図も明確になる等、利点がある。

コード例
sample.java
class sample {
    public static void main(String[] args) {
        record Person(String name, int year) {}

        var a = new Person("Tom", 13);
        System.out.println(a.name()); // Tom
        System.out.println(a.year()); // 13
        System.out.println(a); // Person[name=Tom, year=13]

        var b = new Person("John", 15);
        System.out.println(b.name); // John
        System.out.println(b.year); // 15
        System.out.println(b); // Person[name=John, year=15]
    }
}
実行結果
Tom
13
Person[name=Tom, year=13]
John
15 
Person[name=John, year=15]
レコード定義
record Person(String name, int year) {}

は、次の標準クラスと同等です

public final class Person {
    private final String name;
    private final int year;

    public Person(String name, int year) {
        this.name = name;
        this.year = year;
    }

    String name() { return this.name; }
    int year()  { return this.year; }

    // equals() と hashCode() を実装し、2つのレコードオブジェクトが同じ型であり、
    // 同じフィールド値を含む場合、等しいことを指定する。
    public boolean equals...
    public int hashCode...

    // toString() の実装で、レコードクラスのすべてのフィールドの名前と文字列表現を返す。
    public String toString() {...}
}

インスタンスの作成の際には上記コードのようにfinal var aのようにfinal修飾子をつけなくても、record型のインスタンスを作成する際は自動的にそのインスタンスがfinal になり、書き換え不能になる。

なお、final var a = new Person("Tom", 13);のようにfinal をつけてインスタンスを作成しても、正常に動く(結果は上記と同じ)。

脚註[編集]

  1. ^ フレームは、タイトルとボーダーを持つトップレベルのウィンドウです。
  2. ^ よく似たwindowClosed メソッドは、ウィンドウがクローズされたときに呼び出されます。
  3. ^ Record (Java SE 16 & JDK 16)” (2021年7月20日). 2022年7月1日閲覧。
このページ「Java」は、まだ書きかけです。加筆・訂正など、協力いただける皆様の編集を心からお待ちしております。また、ご意見などがありましたら、お気軽にトークページへどうぞ。