Java
メインページ > 工学 > 情報技術 > プログラミング > Java
本書は、Javaの技術を全体的に見渡すことができるように、いくつかのパートに分けて解説を進めます。 なので読者は、本書の解説は知りたい部分だけを選んで読んでも構いません。
入門の文法[編集]
- 概要
- Javaクイックツアー (Javaとはどんなものか / Javaの現状)
- かんたんなJava入門
- プログラミングのための準備 (インストール方法など)
- Hello world (コンパイル方法、実行方法、printfとprintln など)
- かんたんな基礎
- クラスとメソッド
発展事項[編集]
バージョンごとの主な新機能[編集]
- Java 7 の主な新機能の一覧
- アンダースコア: 数値リテラルにおいて、読みやすさを向上させるために、桁区切りに使用されます。
- 文字列のswitchステートメント:文字列を使用してswitchステートメントを作成できるようになりました。
- 数値リテラルのアンダースコア:大きな数値リテラルをより読みやすくするために、アンダースコアを使用して数字をグループ化できるようになりました。
- ダイヤモンド演算子:Java 7.0では、ジェネリッククラスのインスタンス化時に、右側のジェネリック引数を省略できるようになりました。
- ジェネリック例外の型推論:Java 7.0では、catchブロックでジェネリック例外をキャッチするときに、ジェネリック型の推論ができるようになりました。
- 可変長引数の改善:可変長引数を使用して、他の引数と組み合わせて使用できるようになりました。
- インスタンス化されたジェネリック型の引数の型推論:コンパイラが、ジェネリック型の引数の型を自動的に推論できるようになりました。
- Java 6.0の主な新機能の一覧
- コンパイル時定数(Compile-Time Constants):Java 6.0では、定数式が宣言された場所で評価されるようになりました。これにより、実行時のコストが削減され、コードの簡潔性が向上しました。
- リテラル文字列の自動的な連結(Automatic Concatenation of Literal Strings):Java 6.0では、複数のリテラル文字列が隣接している場合、自動的に連結されるようになりました。これにより、コードの可読性が向上し、記述の簡略化が可能になりました。
- Java 5.0の主な新機能の一覧
- ジェネリクス: 型安全なコレクションを実現するための機能で、コンパイル時に型チェックを行い、実行時のキャストエラーを回避することができます。
- アノテーション: クラス、メソッド、変数などに付与することができるメタデータで、コンパイル時や実行時に利用される。
- オートボクシングとアンボクシング: プリミティブ型とそのラッパー型の間で自動的に変換を行うことができます。
- 列挙型: 列挙型は、定数の集合を表現するために使用されます。列挙型は、コンパイル時の型検査に役立ちます。
- 静的インポート: 静的メンバーをインポートすることができます。
- 可変長引数: メソッドが可変数の引数を取ることができるようになります。
- 拡張forループ(Enhanced For Loop):Java 5では、配列やコレクションなどの要素に対して、より簡単かつ安全にループ処理を実行するための拡張forループが導入されました。
J2SE / Java SE[編集]
※ 未作成[編集]
- ※ 下記の記事は、教科書本体ができて、ある程度の完成度になったら、「未作成」以外の独立した節に移動してください。
テスティング[編集]
- テスティング入門
- テストとは何か / テストはなぜ重要か / テスト駆動はなぜ重要か
- テストを書いてみよう
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は、現在も発展し続けています。その学習や、あるいはその情報伝達のために、ぜひ本書を活用してください。
関連項目[編集]
- 基本情報技術者試験 - 国家試験(情報処理技術者試験)。Javaに関するプログラミングの問題が出題される。
ライブラリ[編集]
※記述中[編集]
JavaFX[編集]
JavaFXは、JavaでGUIアプリケーションを開発するためのツールキットです。JavaFXを使用すると、豊富なUIコントロール、グラフィックス、レイアウト、CSSスタイルシートなどを使用して、美しい、インタラクティブなデスクトップアプリケーションを作成できます。
JavaFXアプリケーションは、JavaFX Scene Graphと呼ばれるグラフィカルなオブジェクトツリーで構築されます。このScene Graphを構築するには、FXMLというXMLベースのマークアップ言語を使用することもできます。FXMLを使用すると、GUIのレイアウトとデザインを分離し、デザイナーとプログラマーが分業できます。
JavaFXには、JavaFXアプリケーションを構築するための豊富なAPIが用意されています。これには、UIコントロール(ラベル、ボタン、テキストボックスなど)、レイアウトマネージャー、アニメーション、トランジション、CSSスタイルシートなどが含まれます。また、FXMLを使用して、JavaコントローラクラスにUIコントロールをバインドし、ユーザーのアクションに応答するコードを記述できます。
JavaFXは、Java SE Development Kit(JDK)の一部であり、JavaFXを使用するためにはJDKをインストールする必要があります。また、JavaFXの最新バージョンは、OpenJFXプロジェクトとしてオープンソースで開発されており、多くのIDEがJavaFXプロジェクトをサポートしています。
FXML[編集]
FXMLとは、JavaFXのUIを宣言的に記述するXMLベースのマークアップ言語です。 FXMLを使用することで、JavaFXのUIをより簡単に作成できます。
以下は、FXMLの例です。
- sample.fxml
<?xml version="1.0" encoding="UTF-8"?> <?import javafx.scene.layout.StackPane?> <?import javafx.scene.text.Text?> <StackPane prefHeight="200.0" prefWidth="250.0" xmlns="http://javafx.com/javafx/16" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample" fx:stylesheet="sample.css"> <children> <Text text="Hello, JavaFX!" /> </children> </StackPane>
FXMLでは、UI要素を定義するためにXMLタグを使用し、その属性を使用してUI要素の属性を設定します。 FXMLファイルの最上位の要素はルート要素であり、この場合はStackPaneです。 StackPane要素のchildrenタグ内に、Text要素があり、そのtext属性にはテキストコンテンツが設定されます。
FXMLファイルは、JavaFXのアプリケーションクラスからロードされます。例えば、FXMLLoaderクラスを使用してロードできます。 以下は、FXMLを使用してJavaFXアプリケーションを初期化するためのコードの例です。
- sample.java
import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.scene.Scene; import javafx.stage.Stage; public class sample extends Application { @Override public void start(Stage primaryStage) throws Exception { primaryStage.setTitle("ここはタイトル"); primaryStage.setOnCloseRequest(e -> System.exit(0)); FXMLLoader loader = new FXMLLoader(getClass().getResource("sample.fxml")); StackPane root = loader.load(); Scene scene = new Scene(root, 250, 200); primaryStage.setScene(scene); primaryStage.show(); } public static void main(String[] args) { launch(args); } }
FXMLを使用する場合、start()メソッド内でFXMLファイルをロードする必要があります。 FXMLLoaderクラスを使用して、FXMLファイルを読み込み、FXMLのルート要素を取得します。 これをJavaFXのSceneに追加し、Stageに表示することができます。
CSS[編集]
JavaFXはCSSを使用して外観をスタイリングできます。CSSを使用すると、ボタン、ラベル、テキストフィールドなど、JavaFXの多くのUIコントロールの外観をカスタマイズできます。
- sample.css
.root { -fx-background-color: #f2f2f2; /* ルートノードの背景色 */ } .text { -fx-font-size: 24pt; /* テキストのフォントサイズ ''/ -fx-text-fill: #ff0000; /'' テキストの文字色 */ }
JavaFX/CSSの主なプロパティ プロパティ名 説明 -fx-alignment コントロール内のコンテンツの配置位置を指定する -fx-background-color コントロールの背景色を指定する -fx-background-image コントロールの背景画像を指定する -fx-background-insets コントロールの背景画像の余白を指定する -fx-background-position コントロールの背景画像の位置を指定する -fx-background-radius コントロールの背景画像の角丸のサイズを指定する -fx-background-size コントロールの背景画像のサイズを指定する -fx-border-color コントロールの枠線の色を指定する -fx-border-insets コントロールの枠線の余白を指定する -fx-border-radius コントロールの枠線の角丸のサイズを指定する -fx-border-style コントロールの枠線のスタイルを指定する -fx-border-width コントロールの枠線の太さを指定する -fx-font コントロールのフォントを指定する -fx-font-family コントロールのフォントファミリーを指定する -fx-font-size コントロールのフォントサイズを指定する -fx-font-style コントロールのフォントスタイルを指定する -fx-font-weight コントロールのフォントの太さを指定する -fx-text-alignment テキストの水平方向の配置位置を指定する -fx-text-fill テキストの色を指定する -fx-padding コントロールの内側の余白を指定する -fx-opacity コントロールの不透明度を指定する -fx-cursor マウスポインタの形状を指定する -fx-effect コントロールに対して適用するエフェクトを指定する -fx-focus-color フォーカスがあたったときの色を指定する -fx-focus-traversable コントロールがフォーカスを受け取るかどうかを指定する -fx-highlight-fill 選択範囲の背景色を指定する -fx-highlight-text-fill 選択範囲内のテキストの色を指定する
AWT、Swing、JavaFXの特徴を比較[編集]
以下にAWT、Swing、JavaFXの特徴を表形式で比較します。
AWT、Swing、JavaFXの特徴を比較 AWT Swing JavaFX 機能 基本的なGUIコンポーネント 豊富なGUIコンポーネント モダンなGUIコンポーネント 外見 プラットフォームごとの外観 独自の外観 独自の外観 イベント処理 非常に単純 比較的単純 比較的高度 カスタマイズ カスタマイズできるが、限界がある カスタマイズ可能 カスタマイズ可能 レイアウト 相対的に単純 比較的複雑 比較的簡単 モダンな特徴 なし なし アニメーション、3D、レスポンシブなレイアウト、FXML
- AWTは基本的なGUIコンポーネントを提供しますが、外観やイベント処理には限界があります。
- SwingはAWTよりも豊富なGUIコンポーネントを提供し、外観やイベント処理にも多くのカスタマイズオプションがあります。
- JavaFXはSwingと同様に多くのGUIコンポーネントを提供し、レスポンシブなレイアウト、アニメーション、3Dグラフィックス、FXMLといったモダンな特徴を持っています。
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型追加された[1]。レコードという名前のとおり、インスタンス作成時の一度しか書き換えをしない記録を書くためのものである。
クラスを用いても同じ動作のものを作れるが、レコード型を使うことによりコード量が短くなるし、意図も明確になる等、利点がある。
- コード例
- 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 をつけてインスタンスを作成しても、正常に動く(結果は上記と同じ)。
用語集[編集]
- abstract(抽象)
- インスタンスを作成できない抽象クラスや抽象メソッドを定義するための修飾子。
- annotation(アノテーション)
- ソースコードにメタデータを追加するための機能。
- Array(配列)
- 同じ型の複数の要素を保持するためのデータ構造。
- ArrayList(動的配列)
- 可変長配列を実現するためのクラス。
- assert(アサート)
- 条件が正しいことをチェックするために使用されるキーワード。
- binary operator(二項演算子)
- 2つのオペランドを持つ演算子。
- boolean(論理値)
- 2つの値、trueまたはfalse、を持つデータ型。
- break(ブレーク)
- ループやswitch文から抜け出すためのキーワード。
- byte(バイト)
- 8ビットの符号付整数型のデータ型。
- case(ケース)
- switch文内で、評価式の値と一致する場合に実行されるブロック。
- catch(キャッチ)
- tryブロック内で発生した例外を処理するためのブロック。
- char(文字)
- 16ビットUnicode文字のデータ型。
- class(クラス)
- データとその操作を定義するための構造体。
- class variable(クラス変数)
- クラスのすべてのインスタンスで共有される変数。
- compiler(コンパイラ)
- ソースコードを機械語に変換するプログラム。
- constructor(コンストラクタ)
- オブジェクトを作成する際に呼び出されるメソッド。
- continue(コンティニュー)
- ループ内で次の反復処理に進むためのキーワード。
- do-while(do-while文)
- 条件式がfalseでない限り、ブロックを実行し続けるループ。
- double(倍精度浮動小数点数)
- 64ビットの浮動小数点数のデータ型。
- encapsulation(カプセル化)
- データとそれに対する操作をまとめ、外部からのアクセスを制限する機能。
- enhanced for loop(拡張forループ)
- 配列やコレクションの要素に対して繰り返し処理を行うための簡潔な構文。
- enum(列挙型)
- 一連の定数を表すための特殊なクラス。
- exception(例外)
- プログラムの実行中に発生するエラーを表すオブジェクト。
- extends(継承)
- クラスの継承に使用されるJavaのキーワード。
- final(最終)
- フィールド、メソッド、またはクラスに修飾子として付けられ、値の変更やオーバーライドを禁止する。
- finally(最後に)
- 例外処理ブロックの一部で、必ず実行されるコードを指定するために使用されるキーワード。
- float(浮動小数点数)
- 単精度浮動小数点数を表すJavaのプリミティブ型。
- for(forループ)
- 指定された回数または条件に基づいて、コードブロックを反復的に実行するために使用されるキーワード。
- foreach(拡張forループ)
- 配列またはコレクションに対して、簡単な反復処理を行うために使用されるJavaの構文。
- generic(ジェネリック)
- クラスやメソッドにパラメーターを追加し、異なるデータ型のオブジェクトを扱う汎用的なプログラミングの機能。
- getter(ゲッター)
- クラスのインスタンス変数の値を取得するためのメソッド。
- if-else(条件分岐)
- 条件が真の場合に1つのコードブロックを実行し、そうでない場合に別のコードブロックを実行するために使用されるJavaの構文。
- implements(実装)
- インターフェイスを実装するクラスに使用されるキーワード。
- import(インポート)
- 別のパッケージ内のクラスを使用するために、Javaに外部クラスを取り込むためのキーワード。
- instance variable(インスタンス変数)
- クラスのインスタンスの一部であり、オブジェクトの特定の状態を保持するために使用される変数。
- int(整数)
- 32ビットの整数を表すJavaのプリミティブ型。
- interface(インターフェイス)
- クラスのメソッドの集合であり、実装クラスによって実装されることを想定している。
- jar(JARファイル)
- Javaアプリケーションをパッケージ化するための標準的な形式のアーカイブファイル。
- java keyword(Javaのキーワード)
- Javaの構文で特別な意味を持つ予約語。
- java runtime environment(JRE)
- Javaアプリケーションを実行するためのランタイム環境。
- JDK
- Java開発キット。Java開発に必要なツール、コンパイラ、デバッガ、API、ドキュメントが含まれる。
- JRE
- Javaランタイム環境。Javaアプリケーションを実行するための環境。
- JVM
- Java仮想マシン。Javaアプリケーションを実行するための仮想コンピュータ。
- lambda expression
- Java 8で導入された無名関数の一種。
- long
- Javaのデータ型の一つで、64ビットの符号付き整数を表す。
- method
- クラス内で実行されるコードブロックのこと。
- modifier
- クラス、メソッド、変数などの属性を変更するために使用されるキーワード。
- new
- オブジェクトのインスタンスを作成するためのキーワード。
- null
- オブジェクトが存在しないことを示す値。
- NumberFormatException
- 文字列を数値に変換しようとした際に、文字列が数値に変換できない場合にスローされる例外。
- object
- データやメソッドを持つインスタンス。
- Object-Oriented Programming
- オブジェクト指向プログラミング。クラス、オブジェクト、継承、ポリモーフィズムなどを利用してプログラムを設計する方法。
- operator
- 演算子。算術演算子、比較演算子、論理演算子などがある。
- package
- クラスやインターフェースをグループ化するための仕組み。
- private
- クラスの外部からアクセスできないアクセス修飾子。
- protected
- サブクラスからのみアクセス可能なアクセス修飾子。
- public
- 全てのクラスからアクセス可能なアクセス修飾子。
- return
- メソッドから値を返すために使用されるキーワード。
- short
- Javaのデータ型の一つで、16ビットの符号付き整数を表す。
- static
- クラスレベルの変数やメソッドに使用される修飾子。
- String
- 文字列を表すクラス。
- super
- スーパークラスのインスタンスを参照するためのキーワード。
- switch
- 複数の条件分岐をまとめて表現するためのキーワード。
- synchronized
- (同期化) スレッド間で共有されるオブジェクトに対して、1つのスレッドが実行しているときは、他のスレッドが同時にそのオブジェクトにアクセスできないようにするためのキーワードです。
- this
- (this) オブジェクト自身を参照するためのキーワードです。
- throw
- (例外を投げる) メソッド内で明示的に例外を投げるために使用されるキーワードです。
- throws
- (例外をスローする) メソッドが例外を投げる可能性があることを示すために使用されるキーワードです。
- transient
- (一時的) シリアル化されたオブジェクトの一部でないことを示すために使用されるキーワードです。
- try-catch
- (例外処理) 例外が発生する可能性があるブロック内で、例外を捕捉して処理するための構文です。
- void
- (無効) 戻り値を返さないメソッドを定義するためのキーワードです。
- volatile
- (揮発性) 変数の値が、複数のスレッドから同時にアクセスされる可能性があることを示すために使用されるキーワードです。
- while
- (ループ) 条件が true の場合、ブロックを繰り返し実行するためのループ構文です。
脚註[編集]
- ^ “Record (Java SE 16 & JDK 16)” (2021年7月20日). 2022年7月1日閲覧。