第2章 Java プログラムの作成
このプリントでは、Java プログラムの開発に JDK とよばれるコマンドライン上の開発環境を用いる。JDK はいくつかのプログラムから成り立っているが、主に用いるのは、javac という Java コンパイラーと javaという中間コード実行プ
ログラム（JVM エミュレーター） である。
統合開発環境 (IDE) としては、Oracle 社（かつては Sun Microsystems 社）のNetBeans, IBM（現在は IBM とは独立した組織 Eclipse Foundation で開発されている。）によって開発された Eclipse (https://www.eclipse.org/) ,JetBrains 社の IntelliJ IDEA (https://www.jetbrains.com/ja-jp/idea/) ,Microsoft 社の Visual Studio Code (https://code.visualstudio.com/) などがある。 IDE は、エディター・コンパイラー・デバッガーなどが統合された環境で、プログラムを迅速に開発することができる。画面上でボタンなどの GUI
部品を配置することができるものもある。
この章では JDK によって Java のプログラムを作成する方法を説明する。
JDK 以外に Java のプログラム開発でよく使われるツールとしては、バージョン
管理ツールの Git やビルド自動化ツールの Maven あるいは Gradle などがある。
これらについては別のドキュメントで説明する。

2.1 コンパイルと実行
新しいプログラミング言語を学習するときの慣習により、最初に、画面に“Hello
World!”と表示するだけのプログラムを作成する。

2.1.1 Javaコンソールアプリケーション
例題 2.1.1 まず、通常のアプリケーション（つまり後述の GUI を用いない）
Hello World プログラムは次のような形になる。このファイルを好みのエディター（メモ帳、秀丸、Notepad++、Sakura、Emacs など）で作成する。
ファイル Hello0.java
1 public class Hello0 {2public static void main(String args[]) {3
System.out.printf("Hello World!%n");4}
5 }Hello0.java を Java 仮想機械 (JVM) のコードにコンパイルするには、 javacというコマンドを用いる。
> javac Hello0.java
コンパイルが成功すれば、同じディレクトリーに Hello0.class というファイ
ルができている。これが、JVM のコードが記録されているファイルである。このことを確認して、Hello0 を java で実行する。
> java Hello0

オブジェクト指向言語 第 2 章 p.1

（.classはつけない）すると “Hello World!” と画面に表示される。
javac — Javaのソースから中間コード（JVMコード）へのコンパイラー
java — JVMのエミュレーター
参考: エラーメッセージのリダイレクト Java のソースファイルをコンパイルすると、エラーメッセージが大量に出力されて、最初の方のメッセージが見えないという事態が起こることがある。この場合は、エラーメ
ッセージを別のファイル（ログファイル）に書き込んで（リダイレクトという）、あとでログファイルをメモ帳などで見るようにすると良い。
リダイレクトは次のような方法で行なう。
> javac ソースファイル 2> ログファイル
Q 2.1.2 Foo.java という（無名パッケージの） Java のソースファイルを中間言語にコンパイルするためのコマンドを書け。
答:
Q 2.1.3 Bar.class という main メソッドを含む（無名パッケージの）クラスの Java の中間言語ファイルを実行するためのコマンドを書け。
答:
Hello0.java の意味を簡単に説明する。
public class Hello0 は Hello0 というを作ることを宣言している。（クラスなど、オブジェクト指向の概念の詳しい説明は、後述する。ただし、Java では、どんな簡単なプログラムでもクラスにしなければならないことになっているので、とりあえずこの形のまま使えば良い。）Java では public な
クラス名（この場合 Hello0）とファイル名（この場合 Hello0.java）の java
。 ⦅ public でないクラス名に対してを除いた部分はは、この規則は強制されない。⦆この例の場合はどちらも Hello0 でなければならない。この後の開ブレース ({) と対応する閉ブレース (}) の間がクラスの定義である。ここに変数（フィールド）や関数（メソッド）の宣言や定義を書く。
参考: クラス名に使える文字の種類 Java では、クラス名に次の文字が使える（変数名、メソッド名なども同じ。）このうち数字は先頭に用いることはできない。
アンダースコア （“_”）, ドル記号（“$”）, アルファベット（“A”〜“Z”, “a”〜“z”）, 数字（“0”〜 “9”）, かな・漢字など（Unicode 表 0xc0 以上の文字）
Java は C 言語と同じようにアルファベットの大文字と小文字は、区別する。 その他にクラス名は大文字から始める、などのいくつかの決まりとまでは言えない習慣がある。public や void, for, if のように Java にとって特別な意味がある単語（キーワード ）はクラス名などには使えない。

オブジェクト指向言語 第 2 章 p.2

ドル記号とかな・漢字を用いることができるところが C や C++ との違いである。
Q 2.1.4 Java のクラス名として（文法的に）使える名前には○、使えないものには×をつけよ。
123Daaah
Foo777

Kagawa-U
Bar__

Drag'n'Drop

HelloWorld!

2_1

AreYouHappy?

Java アプリケーションの場合も C 言語と同じように、 mainという名前のメソッド（関数）から実行が開始されるという約束になっている。 main メソッドの型は C 言語の main 関数の型とは異なり、 void main(String args[])という型になっている。（C 言語の main 関数の型は int main(int argc,
char** argv)） public や static というキーワード（修飾子）については後述する。とりあえず、この形（public static void main(Stringargs[])）の形のまま使えば良い。
なお、String は Java の文字列の型である。C 言語と違い、String は charの配列ではない。しかし、文字列リテラル （String型の定数）は、C 言語と同様二重引用符（" 〜 "）に囲んで表す。
System.out.printf は C 言語の printf に相当するメソッドで文字列を変換
指定 に従って画面に出力する。 つまりこのプログラムは、 単に “Hello World!”という文字列を出力するプログラムである。%d（10進整数）、%c（文字）、%x（16進整数）、%s （文字列）、%f（浮動小数点数）、などの変換指定は C 言語の printf と同じように使用することができる。一方、 %n は Java の変換指定に特有の書き方でシステムに依存する改行コード（Unixでは \x0A, Windows では、\x0D\x0A）を表す。
Q 2.1.5 Java の main メソッドの型（つまりメソッド定義の「{」の手前の部
分）を修飾子を含めて書け。
答:

2.1.2 Java GUI アプリケーション
例題 2.1.6 次に GUI (Graphical User Interface, グラフィカル・ユーザー・インタ
ーフェイス)を持つ Java プログラムの書き方を紹介する。このテキストでは、Swing という Java の標準的な GUI ライブラリーを紹介する。なお、JavaFX という Swing より後に登場した Java の GUI ライブラリーも存在するが、Swing ほど普及していないこと、将来が不透明なこと、このテキストで扱う範囲の基本的な考え方は Swing と大差ないこと、などから、ここでは Swing を紹介する。
次のようなファイル（Hello.java）をエディター（秀丸、メモ帳、 Emacs など）で作成する。
ファイル Hello.java
1 import javax.swing.*;
2 import java.awt.*;
3
4

オブジェクト指向言語 第 2 章 p.3

5 public class Hello extends JPanel {6public Hello() {7
setPreferredSize(new Dimension(250, 50));8}910@Override11
public void paintComponent(Graphics g) {12super.paintComponent(g);13g.drawString("HELLO WORLD!", 50, 25);
14
}
15
16
public static void main(String[] args) {17
SwingUtilities.invokeLater(() -> {18
JFrame frame = new JFrame("Hello"); // Title
19
frame.add(new Hello());
20
frame.pack();
21
frame.setVisible(true);
22
frame.setDefaultCloseOperation(JFrame.EXIT_O
23
});
24
}
25 }

Hello.java を JVM のコードにコンパイルするためには、やはり javac コマ
ンドを用いる。
> javac Hello.java
コンパイルが成功すれば、同じディレクトリーに Hello.class というファイ
ルができている。これが、JVM のコードが記録されているファイルである。このことを確認して、Hello を java で実行する。
> java Hello
すると、右のような画面が表示されるはずである。

Javaのコメント
Java のコメントには C と同じ形式のとの間、という形の他にも、から行末まで、という形式も使える。（C++ と同じ。最近の C の仕様(C99) でも //〜形式のコメントが使えるようになっている。） また、との間、という形は、ドキュメンテーション・コメントといって javadocというプログラムにとって特別な意味をもつコメントで、Java のソースファイ
ルから API ドキュメントを生成するときに利用される。

2.2 Helloクラス
これで、Java の GUI アプリケーションを一つ作成し実行することができた。続いて、プログラム（Hello.java）の意味を説明する。
最初の 2 行の import文 は、 javax.swingとjava.awt という二つの部品群（パッケージ , package）をプログラム中で使用することを宣言している。

オブジェクト指向言語 第 2 章 p.4

「*」は、このパッケージのすべてのクラスを使用する可能性があることを示している。典型的な GUI アプリケーションの場合、この 2 行の import 文を用いることが多いので、以降のプリント中の例では自明な場合、この 2 行は省略す
ることがある。
詳細: パッケージは OS のディレクトリーやフォルダーがファイルを階層的に整理するのと 同じように、クラスを階層的に管理する仕組みである。 JPanel クラスの正式名称は、パッケージの名前を含めた
javax.swing.JPanel なのであるが、これを単に JPanel という名前で参照できるようにするのにimport javax.swing.JPanel;という import 文を使う。javax.swing というパッケージに属するクラスすべてをパッケージ名なしで参照できるようにするのが、
import javax.swing.*;という import 文である。
自作のクラスを他のクラスから利用する場合は適切なパッケージに配置するべきである。自作のクラスをパッケージの中に入れるためにpackage 文（後述）というものを使う。このテキストで紹介するようなmain メソッドを持つクラスや、サーブレットの場合は、他のクラスから利用するわけではないので、パッケージなしでも良いだろう。正確に言うと package 文がないときは、そのファイルで定義されるクラスは無名
パッケージ というパッケージに属することになる。
注意: Java のソース (.java) ファイルやクラス (.class) ファイル
は、そのパッケージに対応するディレクトリーに配置することになっている。このテキストでは当面の間、無名パッケージのクラスのみを作成するので、カレントディレクトリーの直下にソース (.java) ファ
イルもクラス (.class) ファイルも置かれていると想定する。他の場所に置くと、コンパイルや実行ができないことがある。
Java の既成のクラスを利用するためには、そのクラスが属するパッケージを調べて、それに応じた import 文を挿入する必要がある。もしくは、クラスをパッケージ名を含めたフルネームで参照する。ただし、java.lang という基本的なクラスを集めたパッケージは import しなくてもクラス名だけで使用できる。例えば String クラスは java.lang パッケージに属する。
次の public class Hello extends JPanel は、JPanel というクラスを継承して（つまり、ほんの少し書き換えて）、新しいクラス Hello を作ることを宣言している。（このとき、Hello クラスは JPanel クラスのサブクラス、
逆に JPanel クラスは Hello クラスのスーパークラスと言う。）
JPanel クラスは、 GUI アプリケーションを作成するときによく使われるクラスで、基本的なメソッドが既に定義されている。このため、必要な部分だけを追加定義すれば済む。

オブジェクト指向言語 第 2 章 p.5

行の最初の public はアクセス修飾子と呼ばれ、このクラスの定義を外部に公開することを示している。（このテキストでは、はじめのうちは、 public な
クラスしか定義しない。）
次の、public Hello() { 〜 } はコンストラクターの定義である。コンスト
ラクターはクラスと同じ名前の特別なメソッドである。他のメソッドの場合と異なり、コンストラクターの定義のときは戻り値の型は指定しない。 publicはやはりアクセス修飾子である。コンストラクターはインスタンスが生成されるときに初期化の役割を担う。このクラスの場合、コンストラクターは画面上のサイズの指定を行っているだけである。
さらに、Hello クラスは JPanel クラスの paintComponent という名前のメ
ソッドを上書き （）している。クラスを継承するときは元のクラス（スーパークラス ）のメソッドを上書きすることもできるし、新しいメソ
ッドやフィールドを加えることもできる。このメソッドの中身については次節で説明する。 paintComponent メソッドの定義の前の行の @Override はJDK5.0から導入されたというもので、スーパー

クラスのメソッドをオーバーライドすることを明示的に示すものである。これにより、スペリングミスなどによるつまらない（しかし発見しにくい）バグを減らすことができる。
最後に main メソッドの中では、 “枠”である、JFrame 型のオブジェクトを生成し、この枠に Hello クラスの新しいインスタンス new Hello() を追加 (add)
して表示している。
SwingUtilities.invokeLater(() -> { 〜 }); については、スレッドのところで説明する。
このテキストの以降のプログラム例では、コンストラクター名 (Hello) の部分
だけが変わるので、このような main メソッドの部分は掲載を割愛することがある。
Q 2.2.1 Qux という名前の JPanel を継承するクラスを定義するときの、
import 文と public class に続く 3 ワードを書け。
答: public class

2.3 Graphics クラスのメソッド
JPanel にはいくつかのメソッドがあり、必要に応じて呼び出される。例えば、
paintComponent メソッド は、画面をときに呼び出される。
paintComponent メソッドは
public void paintComponent(Graphics g)という部分から、Graphics 型 のオブジェクトを引数として受け取ること、戻り値はないことがわかる。public というキーワードがついていることと、
class の定義の中に埋め込まれていることを除けば、C 言語の関数定義の方法と同じ書き方である。

オブジェクト指向言語 第 2 章 p.6

paintComponent メソッドは、その中で super.paintComponent(g) を呼び出している。 super.〜 はスーパークラスで定義されているメソッドを呼び出すための書き方である。super.paintComponent(g) は背景を再描画する働きがある。
Graphics クラスはいわば絵筆に対応するデータ型で、“絵の具の色”や“字の形”にあたるデータを構成要素（フィールド）として持っている。このクラスのオブジェクトを使って画面上に文字や絵をかくことができる。 Hello クラスでは、この Graphics クラスの drawString というメソッドを使って、“HELLOWORLD!” という文字列を書いている。後ろの 50 と 25 は、表示する位置である。
void drawString(String str, int x, int y)
座標(x,y)に文字列strを描画する。
注意: Java のグラフィックスの座標系は左上の点が原点で、x 軸は通常と同じく右に向かって増えていくが、y 軸は数学で使われる座標軸と違って、下に向かって増えていく。単位はピクセル（画素）である。

2.4 メソッド呼出し
このように Java ではオブジェクトのメソッドを呼び出すために、
オブジェクト.メソッド名(引数 1, …, 引数 n)という形を用いる。また、フィールド（インスタンス変数）をアクセスするときは、
オブジェクト.フィールド名という書き方を用いる。前述したようにオブジェクトはいくつかのデータをまとめて一つの部品として扱えるようにした物であり、.（ドット）演算子は、オ
ブジェクトの中から演算子である。つまり、

g.drawString(…) は、g という Graphics クラスのオブジェクトから
drawString というメソッドを取り出して引数を渡す式である。Java のメソッ
ドは必ずクラスの中で定義されている。そのため、同じオブジェクトのメソッ
ドを呼出すなど特別な場合をのぞき、Java のメソッド呼出しには、このドットを使った記法が必要である。メソッドのドキュメントにはこの部分は明示されないので注意が必要である。
参考: .（ドット）演算子の前に書く値も、メソッド名の後の括弧の間に,（コンマ）区切りで書く値も、どちらもメソッドに渡されるデータという意味では違いはないが、上述のようにイメージが異なる。. 演算子の前にあるのは“主語”で、括弧の間にある通常の引数は“目的語”のようなイメージである。
メソッドはクラスの中に定義されているので、同じ名前のメソッドが複数のクラスで定義されていて、同じ名前のメソッドでもクラスが異なれば実装が異なることがある。.演算子の前のオブジェクトが、どのメソッドの実装を呼び出すかを決定する。
この点は動的束縛を説明するときに、より詳しく説明する。

オブジェクト指向言語 第 2 章 p.7

Q 2.4.1 g という名前の変数が Graphics 型のオブジェクトのとき、座標 (12,34) に “Thank You!” という文字列を表示するメソッド呼出しの式を書け。
答:
問 2.4.2
1. Hello.java の "HELLO WORLD!" の部分を書き換えて、他の文字列を表示させよ。
2. Hello.java の 50, 25 の部分を書き換えて表示する位置を変更せよ。

2.5 Java のグラフィクス (AWT) — 色とフォント
Hello.java では、Graphics クラスの drawString メソッドを使って、画面に文字を表示したが、ここではこのクラスの他の描画メソッドを紹介する。
Graphics オブジェクトの色とフォントは次のメソッドで変更することができる。
void setColor(Color c)void setFont(Font f)

する。

する。

例題 2.5.1 ファイル ColorTest.java
1 import javax.swing.*;
2 import java.awt.*;
3 // import static java.awt.Color.*;
4 // import static java.awt.Font.*;
5
6 public class ColorTest extends JPanel {7
public ColorTest() {8
setPreferredSize(new Dimension(150, 100));
9
}
10
11
@Override12
public void paintComponent(Graphics g) {13
super.paintComponent(g);14//((Graphics2D)g).setRenderingHint(Rendering
15//
Rendering
16
String msg = "Hello, World!";
17
g.setColor(Color.BLUE);
18
g.setFont(new Font(Font.SERIF, Font.PLAIN, 14));19
g.drawString(msg, 20, 25);
20
g.setColor(Color.ORANGE);
21
g.setFont(new Font(Font.SERIF, Font.BOLD, 14));22
g.drawString(msg, 20, 50);
23
g.setColor(Color.RED);
24
g.setFont(new Font(Font.SERIF, Font.ITALIC, 14))25
g.drawString(msg, 20, 75);
26
}
27
28
public static void main(String[] args) { /* 省略 */29 }オブジェクト指向言語 第 2 章 p.8

コンストラクターでは、領域の高さを増やしておく（100くらい）必要がある。実行すると左の図のよ
うになる。
変数の宣言
変数の宣言は C と同様、
変数名の形式で行なう。型名は int, double などのプリミティブ型か、クラス名である。ただし、使用する前に宣言すれば C と違って、必ずしも関数定義の最初に宣言する必要はない。初期値を指定するときは、変数名の後に「=」に続けて書く。
色を指定するためには、Color クラス のインスタンスを使う。上のプログラムのように、Color.BLUE, Color.RED など定数（正確にはクラス変数）として用意されているインスタンス ⦅BLUE, RED, ORANGEの他に BLACK, CYAN,DARKGRAY, GRAY, GREEN, LIGHTGRAY, MAGENTA, PINK, WHITE, YELLOWが用意されている。⦆を用いる方法の他にも RGB 値を直接指定して新しい Color クラスのインスタンスを生成する方法もある。
Tips: Java のグラフィックス関数では標準ではアンチエイリアシングを行わないので、斜めの線の輪郭がギザギザに見えて美しくない。アンチエ
イリアシングをするには、描画の前に((Graphics2D)g).setRenderingHint(RenderingHints.KEY_ANTIALIA
RenderingHints.VALUE_ANTIALという呼出しをしておけば良い。 setRenderingHint はGraphics のサブクラスの Graphics2D クラス のメソッドである。 JPanel のpaintComponent メソッドに渡される引数は、実際には Graphics2Dであるが、普段は Graphics クラスとして扱われるので、Graphics2D
クラスのメソッドを利用するためにキャスト（型変換）を行っている。

2.6 図形の描画
Graphics クラスは、直線、長方形、多角形、楕円、円などさまざまな図形を描画するためのメソッドを持つ。
void drawLine(int x1, int y1, int x2, int y2)(x1, y1) から (x2, y2) まで直線を引く。
void drawRect(int x, int y, int w, int h)
左上の点が (x, y) で幅 w, 高さ h の長方形を描く。
void clearRect(int x, int y, int w, int h)
左上の点が (x, y) で幅 w, 高さ h の長方形の領域をバックグラウンドの色で塗りつぶす。
void drawOval(int x, int y, int w, int h)
左上の点が (x, y) で幅 w, 高さ h の長方形に内接する楕円を描く。
void drawPolygon(int[] xs, int[] ys, int n)(x[0], y[0])〜(x[n - 1], y[n - 1]) の各点を結んでできる多角形を描

オブジェクト指向言語 第 2 章 p.9

void fillRect(int x, int, y, int w, int h)
左上の点が (x, y) で幅 w, 高さ h の長方形を描き塗りつぶす。
一般に、draw〜という名前のメソッドは内部を塗りつぶさず、 fill〜は内部を塗りつぶす。
重要: Java のクラスやメソッドは Java API 仕様 というドキュメントにまとめられている。 Java 17 の場合、https://docs.oracle.com/javase/jp/17/docs/api/ からモジュール（このプ
リントで扱うのはほとんどが java.base）・パッケージ・クラスを選択することによって、そのクラスに定義されているメソッド・フィール
ド・コンストラクターなどの仕様が上の Graphics クラスのメソッドの説明のような形式で示されている。今後は必要に応じてこのドキュメントを調べると良い。
例題 2.6.1 ファイル ShapeTest.java
1 import javax.swing.*;
2 import java.awt.*;
3 import static java.awt.Color.*;4
5 public class ShapeTest extends JPanel {6public ShapeTest() {7
setPreferredSize(new Dimension(200, 150));8}910@Override11
public void paintComponent(Graphics g) {12//((Graphics2D)g).setRenderingHint(Rendering
13//
RenderingHints.VALUE_ANTIAL
14super.paintComponent(g);15int[] xs = {100, 137, 175, 175, 137, 100};16
int[] ys = { 0,0, 25, 50, 50, 25};
17
18
g.setColor(RED);
19
g.drawLine(0, 0, 75, 50);
20g.setColor(GREEN);
21
g.drawRect(0, 0, 75, 50);
22g.setColor(BLUE);
23
g.drawOval(0, 75, 75, 50);
24
g.setColor(ORANGE);
25
g.drawPolygon(xs, ys, 6);26
g.setColor(CYAN);
27
g.fillRect(90, 65, 75, 50);
28
g.setColor(MAGENTA);
29
g.fillRect(100, 75, 75, 50);
30
g.setColor(YELLOW);
31
g.fillRect(110, 85, 75, 50);
32
}
33
34
public static void main(String[] args) { /* 省略 */35 }drawLine, drawRect などはすべて Graphics クラスのメソッドであるので、Graphics クラスのオブジェクト g のメソッドを呼び出すため、オブジェクト指向言語 第 2 章 p.10という形式で使用されていることに注意する。
このプログラムでは、2 つの変数 xs, ys を宣言している。これらの変数は、メソッド
paint の中で drawPolygon の引数として用いられている。
このプログラムの実行結果は左の図のよう
になる。
配列の宣言
配列の宣言の
int[] xs ={ 100, 137, 175, 175, 137, 100 };は、C言語では
int xs[] ={ 100, 137, 175, 175, 137, 100 };と書くべきところだが、Java ではどちらの書き方（[]の位置に注意）も可能である。[]は型表現の一部であるということを強調するため、 Java では前者の書き方が好まれる。
問 2.6.2 ShapeTest.java の数値・色などをいろいろ変えて試せ。
問 2.6.3 その他の Graphics クラスのメソッド:
void draw3DRect(int x, int y, int w, int h, boolean raised)void drawArc(int x, int y, int w, int h, int angle1, int angle2)
void drawRoundRect(int x, int y, int w, int h, int rx, int ry)
void fillOval(int x, int y, int w, int h)void fillPolygon(int[] xs, int[] ys, int n)void fill3DRect(int x, int y, int w, int h, boolean raised)void fillArc(int x, int y, int w, int h, int angle1, int angle2)
void fillRoundRect(int x, int y, int w, int h, int rx, int ry)
はどのような図形を描くか、GUI アプリケーションを作成して試せ。
boolean 型
boolean型は真偽値（

かの 2 つの値）を取り得る型である。

問 2.6.4 指定された文字が最初に出現する位置（最初から数えて何文字めか）を返すメソッド indexOf の使用例にならい、String（正式にはjava.lang.String）クラスのドキュメントで、次のような機能を持つメソッ
ド:
1. 指定された文字が最後に出現する位置（最初から数えて何文字めか）を返す。
2. 文字列の m 文字目から n - 1 文字目までの部分文字列を取り出す。
の使い方を調べて、実際にそれらを使用して、次の要件を満たす一つの Java コ
ンソールアプリケーションを作成せよ。（いずれも最初の文字は 0 文字目と数える。空白も 1 文字と数える。）

オブジェクト指向言語 第 2 章 p.11

1. 同じ文字列 msg の中で最後に 文字 'e' が現れる位置を表示する。（33
文字目のはず）2. 同じ文字列 msgの 11 文字目から 20 文字目を取り出して表示する。
（"rown fox j"になるはず）
なお、文字リテラル（定数）は C 言語と同様、一重引用符に囲んで 'a' のように表す。
解答のテンプレート
ファイル StringExample.java
1 public class StringExample {2public static void main(String[] args) {3
String msg = "The quick brown fox jumps over th
4
System.out.printf("文字 'a' は %d 文字目に現れます5
msg.indexOf('a'));6// ...
7}8 }

2.7 クラスフィールドとクラスメソッド（クラス変数）はクラスに属するオブジェクトから共通にア
クセスされる変数であり、は、通常のフィールドにアクセスせずクラスフィールドだけにアクセスするメソッドである。どちらも、クラスによって決まるので、.（ドット）演算子の左にクラス名を書くことによってアクセスできる。以前に登場した System.out も System（正確に言うと
java.lang.System）というクラスの out という名前のクラスフィールドである。
クラスメソッド・クラスフィールドのことを、それぞれスタティック メソッ
ド・ スタティックフィールド と呼ぶこともある。これは、クラスフィールドや
クラスメソッドを定義するときにという修飾子をつけるためである。

API 仕様のドキュメントにも static と付記される。例えば、Colorクラスのドキュメントの中では、
static Color BLACK
Math (java.lang.Math) クラスのドキュメントの中では、
static double cos(double a)のように説明されている。これはそれぞれ使用するときには、Color.BLACK,
Math.cos(0.1) のようにクラス名.メソッド名（またはフィールド名）
形に書かなければいけないということを示している。
なお、Java の static は、C 言語での staticの使い方とはあまり関連がない。

オブジェクト指向言語 第 2 章 p.12

また、Java アプリケーションで必ず定義する main メソッドも、スタティック
メソッドでなければならない。
参考: Java 5.0 以降では static importという仕組みを利用することで、クラスフィールド・メソッドの前のクラス名を省略することができるようになった。例えば、プログラムの先頭に、import static java.lang.Math.cos;// cos 関数だけの場合、または// Math クラスのすべてのクラスフィールド・クラスメソッドの場合
import static java.lang.Math.*;と書くと、単に cos(0.1) のように書くことができる。
Q 2.7.1 g という名前の変数が Graphics 型のオブジェクトのとき、以後の描画を緑色にするメソッド呼出しの式を書け。ただし、import java.awt.*;
はしているが import static java.awt.Color.*; はしていないと仮定する。
答:
Q 2.7.2 円周率 π を表す定数は java.lang.Math クラスの中で
public static final double PI = 3.141592653589793;と宣言されている。（final 修飾子は後述するが、この問に関しては無視してよい。）（static import を使わないとき） 円周率を表す Java の式を書け。
答:

メソッド呼出しのまとめ
結局、Java のメソッド呼出しは、次の 3 通りの形式が存在することになる。
1. オブジェクト.メソッド名(引数の並び)
例: g.drawString("Hello", 20, 75)
2. クラス名.メソッド名(引数の並び)
例: Math.cos(0)3. メソッド名(引数の並び) ⋯ ドットを使わない形
例: setPreferredSize(new Dimension(150, 100))
このうち、1. が、もっとも普通のメソッド呼出しである。通常、API ドキュ
メントでは、次のようにメソッド名と引数の型だけが紹介される。
void drawString(String str, int x, int y)
座標 (x,y) に文字列 str を描画する。
しかし、使うときには、 g.drawString("HELLO WORLD!", 50, 25)のように、オブジェクトを表す式とドットを前につける必要がある。
また、2. はクラスメソッドの呼出しである。API ドキュメントでは、クラス
メソッドは次のように static というキーワードを伴って紹介される。

オブジェクト指向言語 第 2 章 p.13

static double cos(double a)
この場合は、 Math.cos(Math.PI) のように、クラス名（この場合はMath）とドットを前につける必要がある。
ここまではいずれにしても「.」（ドット）とその前に何かが必要である。ドットを使わず、3. のように書くのは、以下の 2 つの場合である。
クラスメソッドに対し static import を使っている場合、同じオブジェクトのメソッドを呼出す場合、
例えば、 import static java.lang.Math.*; のような宣言があれば、クラスメソッドの Math.cos は単に cos(PI) のように呼出すことができる。
また、setPreferredSize メソッドは、JPanel クラス（正確には、
JPanel のスーパークラスの JComponent クラス）に用意されているメソ
ッドなので、 JPanel を継承するクラスの（非 static な）メソッドからは、
単に setPreferredSize(new Dimension(100, 100)) のように呼出すことができる。

2.8 インスタンスの生成
一般に、あるクラスのインスタンスを生成するには、う。new の次にという演算子を使（constructor）という、クラスと同じ名前のメソッドを呼び出す式を書く。コンストラクターに必要な引数は各クラスにより異なるので API ドキュメントを調べる必要がある。また、ひとつのクラスが引数の型が異なる複数のコンストラクターを持つ場合もある。
Color クラスの場合、代表的なコンストラクターは 3 つの int型の引数をとる。それぞれ 0 から 255 の範囲で赤 (R)・緑 (G)・青 (B) の強さを表す。つまり、new Color(255,0,0) は純粋な赤を表す Color オブジェクトになる。
g.setColor(Color.RED); は g.setColor(); でも同じ色になる。
Font クラスのコンストラクター は、フォントの種類（Font.SERIF の他、Font.MONOSPACED, Font.SANS_SERIF, Font.DIALOG,
Font.DIALOG_INPUT のどれかかプラットフォーム依存フォント名）、スタイ
ル （Font.BOLD （太字体）, Font.ITALIC （斜字体）, Font.PLAIN （通常の字体）の 3 つの定数のどれか、または Font.BOLD | Font.ITALIC）、サ
イズを表す整数、の 3つの引数をとる。new Font(Font.SERIF,
Font.BOLD, 16) は、セリフ体の太字体の 16 ポイントのサイズのフォントである。
Q 2.8.1 g という名前の変数が Graphics 型のオブジェクトのとき、以後の文字列の描画に使うフォントの、サイズを 12 ポイント、種類をFont.MONOSPACED（等幅のフォント）、スタイルを通常、にするメソッド呼出しの式を書け。ただし、import java.awt.*; はしているが、 static
import はしていないと仮定する。

オブジェクト指向言語 第 2 章 p.14

答:
問 2.8.2 例題を改造して、いろいろな色・フォント・文字列を組み合わせを試せ。

2.9 キーボードからの入力
Java でキーボードからの入力を扱うときは java.util.Scanner というクラスを用いる。次の例は、このクラスのオブジェクトの典型的な使用例である。
ファイル ScannerExample.java
1 import java.util.Scanner;2
3 public class ScannerExample {4public static void main(String[] args) {5
Scanner
sc = new Scanner(System.in);6
7
int i = sc.nextInt(); // 他に nextDouble, nextLi
8
System.out.printf(" %d の 2乗は %d です。%n", i,
9
}
10 }

このクラスの nextInt というメソッドは、次の単語を int としてスキャンする。他に同じクラスのメソッドとして、 次の単語を double としてスキャンする nextDouble や、次の単語（単語の区切りは空白またはタブ文字）をスキャ
ンする next、次の改行までスキャンする nextLine などのメソッドがある。
問 2.9.1 java.util.Scanner クラスの nextDouble, next, nextLine メソッドを使用したプログラムを作成せよ。
キーワード
JDK、class、javac、java、main メソッド、import、JFrame クラス、
JPanel クラス、 継承、extends、オーバーライド、paintComponent メソ
ッド、 Graphics クラス、drawStringメソッド、フィールド、クラスフィー
ルド、クラスメソッド、new 演算子、 コンストラクター、 Java API 仕様、配列、 boolean 型、

オブジェクト指向言語 第 2 章 p.15