まえがき
コンピュータの仕組みをよく見てみると、2 つの数どうしの四則演算など、ごく単純な計算しか できないことがわかります。 そんなコンピュータが私たちの生活のすみずみを支える機械となって いるのは、プログラム(ソフトウェアとも呼ばれます)があるからです。 コンピュータの特徴は、四則演算のような単純な計算を、いろいろに組み合わせながら自動的に 繰り返し実行できることです。この組み合わせや繰り返しを制御するのがプログラムの役目です。 プログラムを変えることで、コンピュータにさまざまな仕事をさせることができます。プログラム があるからこそ、コンピュータは電子メールのやり取りや Web サイトの閲覧をする道具になること ができるのです。 プログラムとは、 簡単に言うと、仕事の開始から終了までの間に実行するべき演算を順番に並べ て書いたものです。本書のタイトルにもなっている「プログラミング」とは、このプログラムを書 く作業のことです。 本書は、プログラムを書く上で知っておかなければならない基本的な考え方や技術を解説した教 科書です。コンピュータにやってほしい仕事が簡単なら、実行すべき演算の数も少ないので、プロ グラムを書くのも簡単です。しかしコンピュータに少しでも役に立つ仕事をさせようとすると、実 行すべき演算の数がすぐに爆発的に増えてしまいます。そのような膨大な数の演算を扱うプログラ ムは、何らかの技術や方法論なしには、誤りなく書けません。本書の目的は、そのような技術や方 法論の基本を説明することです。 説明にあたっては、本書は Java 言語によるプログラミングを例に使います。 Java 言語を選んだ理 由の 1 つは、もちろん Java が実社会で広く使われている言語であることです。しかし、もう 1 つの 理由があります。それは Java 言語が比較的新しい言語であり、これを例に使うと、古いものから新 しいものまで、いろいろなプログラミング技術を説明できることです。 本書では Java 言語を使ってプログラミングの基礎技術を説明していきますが、例題は可能なら コンピュータ科学の基本的な話題からとるようにしました。たとえば、タートルグラフィックスや ニュートン法、フラクタル図形、リスト構造などを例題として使いました。これらの話題は、Java 言語に限らず、多くのプログラミング言語に共通です。本書で学んだ内容は、他の言語でプログラ ムを書くときにも役に立つはずです。 プログラミング一般の基礎を説明することに重点をおくと、その分、Java 言語の説明が不足して、 実際にプログラミングするときの助けに参考書がもう一冊必要になりがちです。本書では、この点 を少し欲張って、Java 言語でいろいろなプログラムを書くときの参考書、リファレンスとしても使 えるように、Java 言語の構文の比較的細部まで説明しています。その分、ページ数が多くなってい ますが、最初のうちは適宜読み飛ばすようにするとよいと思います。後から必要に応じて、読み返 すようにしてください。 本書は多くの人の支援によって完成しました。まず、本書の企画を立て、多大な努力で実現させた大澤武史氏に、そして編集作業を担当した佐藤英一、川崎晋二の両氏に感謝します。また、佐々 政孝、渡辺治、五十嵐淳、小薮隆史、河野健二の各氏には、本書の内容について助言してもらいま した。さらに、著者の研究室の学生である西澤無我、日比野秀章、熊原奈津子氏は、本書の草稿を 読み、読者の立場から数多くの有益な指摘をしてくれました。 最後に、妻典子と娘の阿月に感謝したいと思います。本書の草稿を呼んでくれた人達からの指摘 に基づいて原稿を直す作業は、ときに何ページにもわたる書き直しをともないましたが、途中で投 げ出さずにすんだのは家族の励ましのおかげです。毎晩「今日も Lesson7 を直しているの?」と心 配してくれたころを懐かしく思い出します。 千葉 滋
目次
まえがき
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・3
目次
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・5
項目別目次
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・14
本書の構成
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・18
第 1 部 基礎編
21
Lesson1
亀と遊ぼう
23
1.1
タートルグラフィックス
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・23
プログラムのコンパイルと実行・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・24 プログラムの構成・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・28 メソッドの定義・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・29 型と変数・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・29 メソッド呼び出し・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・31 最初に呼ばれる main メソッド・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・32 プログラムの構成要素のまとめ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・341.2
2 匹の亀
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・35
2 つのメソッド・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・35 コメント・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・36 クラスと型・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・38 変数への代入・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・401.3
プログラムの基本要素
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・44
識別子と予約語・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・44 空白文字と空行・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・451.4
演習問題
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・46
Lesson2
計算しよう
49
2.1
数を扱うプログラム
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・49
int 型・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・50画面表示・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・50 数とオブジェクトの両方を扱うプログラム・・・・・・・・・・・・・・・・・・・・・・・・・・・・51 int 型の変数への代入・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・52
2.2
基本データ型と参照型
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・54
整数を表す型・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・55 文字を表す型・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・56 小数を表す型・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・57 真偽値を表す型・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・58 オブジェクトを表す型・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・59 基本データ型の間の変換・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・602.3
文字列
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・61
文字列リテラル・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・61 文字列の表示・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・62 文字列の + 演算・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・63 文字列と基本データ型の間の変換・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・63 戻り値を返すメソッド・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・642.4
文字列の入出力
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・66
キーボードからの入力・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・66 文字列の表示・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・68 プログラムの終了・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・682.5
演習問題
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・69
Lesson3
変数宣言と式
71
3.1
式文と変数宣言文
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・71
3.2
式
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・72
単項演算子・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・73 キャスト演算・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・76 算術二項演算子・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・77 関係演算子・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・78 論理演算子・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・80 ビットごとの演算子・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・83 条件演算子・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・84 代入・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・85 演算子の優先順位・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・863.3
演習問題
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・87
目次
5.3
再帰呼び出し
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・133
再帰的な関数・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・133 再帰呼び出しのスコープとイクステント・・・・・・・・・・・・・・・・・・・・・・・・・・・・・135 フラクタル図形・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・137 末尾再帰・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1415.4
メソッドのまとめ
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・143
5.5
演習問題
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・144
Lesson6
配列
149
6.1
データ構造とアルゴリズム
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・149
6.2
配列の効用
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・150
6.3
配列の使い方
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・151
配列型の値・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・151 要素の利用・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・152 配列の長さ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1536.4
オブジェクトとしての配列
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・154
混乱しやすい例・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・155 配列の初期化・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・158 null と配列・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1596.5
配列を使ったプログラム
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・161
配列の要素のコピー・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・161 配列の比較・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・163 main メソッドの引数・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・165 配列要素の検索・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・166 配列要素の整列・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・168 動的計画法・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1696.6
多次元配列
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・172
2 次元配列・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・172 配列の配列・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・173 多次元配列の長さ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1746.7
配列のまとめ
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・175
6.8
演習問題
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・176
第 2 部 オブジェクト指向編
179
Lesson7
オブジェクト
181
7.1
再び亀と遊ぼう
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・181
ウィンドウに閉じこめられた亀・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・181 フィールドを持つオブジェクト・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・185 亀の数を増やす・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・188 リモコンの種類を増やす(クラスを増やす)・・・・・・・・・・・・・・・・・・・・・・・・190 情報隠蔽・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1937.2
クラスとオブジェクト
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・194
クラス・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・195 メソッド・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・196 フィールド・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・196 コンストラクタと new 演算子・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・198 this の省略・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・200 オブジェクトとインスタンス ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・2017.3
オブジェクトを使ったプログラムの例
・・・・・・・・・・・・・・・・・・・・・202
メソッドを持たないオブジェクト・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・202 引数の擬似的な参照渡し ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・204 伸び縮みする配列・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・2067.4
static フィールドと static メソッド
・・・・・・・・・・・・・・・・・・・・・208
static フィールド・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・209 static メソッド・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・211 クラス名の省略・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・214 static フィールドの初期化・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・215 main メソッド・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・216 static メソッドはなぜ this を使えないか ・・・・・・・・・・・・・・・・・・・・・・・・2177.5
メソッドのオーバーロード
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・219
7.6
演習問題
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・220
Lesson8
インタフェース
223
8.1
リスト構造
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・223
リスト構造を使った集合の表現・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・224 要素の削除とガベージコレクション・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・228目次 配列を使った集合の表現・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・230 IntList と IntArray の比較・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・232
8.2
インタフェースとポリモルフィズム
・・・・・・・・・・・・・・・・・・・・・・・・233
和集合の計算・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・234 インタフェースの定義・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・236 インタフェースの実装・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・238 ポリモルフィズムと is-a 関係・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・240 式の型とキャスト・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・242 インタフェースのフィールド・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・2448.3
インタフェースを使ったプログラム
・・・・・・・・・・・・・・・・・・・・・・・・245
作業の分割・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・245 定数の管理・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・2478.4
演習問題
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・249
Lesson9
クラスの継承
255
9.1
クラス定義の再利用
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・255
継承を利用しない例・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・255 継承を利用した例・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・258 メソッドのオーバーライド・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・259 オーバーライドとオーバーロード・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・260 サブクラスのコンストラクタ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・263 コンストラクタのオーバーロード・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・265 継承に関する規則・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・2669.2
継承とポリモルフィズム
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・267
メソッドディスパッチ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・269 継承とインタフェースの使い分け・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・272 継承による実装の再利用の問題・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・275 has-a 関係による実装の再利用・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・277 インタフェースの継承・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・281 instanceof 演算子・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・2849.3
演習問題
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・285
Lesson10 パッケージとアクセス制御
289
10.1
パッケージ
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・289
パッケージ宣言・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・289インポート宣言・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・291 コンパイル・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・292
10.2
メソッドやフィールドの修飾子
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・293
private なフィールドとメソッドによる情報隠蔽・・・・・・・・・・・・・・・・・・・・293 private 修飾子と継承・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・297 public、private、protected 修飾子・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・298 final 修飾子・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・299 abstract 修飾子・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・300 static 修飾子・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・303 コンストラクタの修飾子・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・303 インタフェースの修飾子・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・30410.3
演習問題
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・304
Lesson11 例外処理
307
11.1
ファイルの読み書き
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・307
ファイルの読み込み・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・307 オートマトンによる単語の認識・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・310 ファイルへの書き込み・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・313 ファイルの存在確認・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・31511.2
例外
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・316
throw 文・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・318 throws 節・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・319 さまざまな例外のクラス・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・322 try 文・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・324 catch 節の書き方・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・327 複数の catch 節・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・327 finally ブロック・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・32911.3
演習問題
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・331
Lesson12 構文のまとめ(オブジェクト指向編)
333
パッケージ宣言・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・333 インポート宣言・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・333 クラスの定義・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・334 インタフェースの定義・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・334 フィールドの定義・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・335 メソッドの定義・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・335目次 コンストラクタの定義・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・336 オブジェクトの作成と利用・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・337 throw 文と try 文・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・338 instanceof 演算子・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・339
第 3 部 発展編
341
Lesson13 スレッドと同期
343
13.1
スレッド
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・343
Thread クラスを使ったスレッドの作成・・・・・・・・・・・・・・・・・・・・・・・・・・・・・344 Runnable インタフェースを使ったスレッドの生成法・・・・・・・・・・・・・・348 run メソッドと例外・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・35113.2
同期
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・351
競合状態・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・352 synchronized 文・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・354 synchronized メソッド・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・356 static synchronized メソッド・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・35813.3
デッドロック
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・361
「食事をする哲学者」問題・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・36213.4
演習問題
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・364
Lesson14 内部クラスと無名クラス
367
14.1
図形の描画
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・367
円を描くプログラム・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・367 paintComponent メソッドと Graphics クラス・・・・・・・・・・・・・・・・・・・・369 ウィンドウを閉じたときのコールバック・・・・・・・・・・・・・・・・・・・・・・・・・・・・・37214.2
内部クラス
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・372
内部クラスの定義とオブジェクトの作成・・・・・・・・・・・・・・・・・・・・・・・・・・・・・373 外部クラスのオブジェクトの利用・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・374 内部クラスを使わずに書いたプログラム・・・・・・・・・・・・・・・・・・・・・・・・・・・・・375 static 入れ子クラス・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・37714.3
無名クラス
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・380
14.4
演習問題
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・384
Lesson15 標準クラスライブラリ
387
15.1
System クラス
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・387
java.io.PrintStream out・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・387static void exit(int status)・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・388
static long currentTimeMillis()・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・388
15.2
Object クラス
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・388
toString メソッド・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・389 equals メソッドと同値性・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・39015.3
文字列の操作
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・392
String クラス・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・392 StringBuffer クラス・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・393 immutable オブジェクト・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・39415.4
Math クラス
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・397
15.5
ArrayList と HashMap クラス
・・・・・・・・・・・・・・・・・・・・・・・・・・・・397
java.util.ArrayList クラス・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・398 java.util.HashMap クラス・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・399 ラッパークラス・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・40015.6
演習問題
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・403
付録 A
Turtle クラスの定義
405
付録 B
参考文献
411
索 引・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・415 著者紹介・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・423項目別目次
Java 言語
一般
プログラムのコンパイルと実行・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・24,292 プログラムの構成・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・28 プログラムの基本要素・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・44 コメント・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・36 プログラムの終了・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・33,68 文字列の表示・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・50,62,68 キーボードからの入力・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・66 ファイルの読み込み・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・307 ファイルへの書き込み・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・313型と変数、式、オブジェクト
クラスと型・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・29,38,194 オブジェクト・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・28,29,154,181,194,337 基本データ型と参照型・・・・・・・・・・・・・・・・・・・・・・・・・50,54,55,56,57,58,59,154 文字列・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・61 式・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・30,72,242 変数・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・29,40,71,114,120 定数・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・55,247 配列・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・149,206,230 多次元配列・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・172演算子
単項演算子・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・73 キャスト演算・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・76,242 算術二項演算子・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・77 関係演算子・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・78 論理演算子・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・80 ビットごとの演算子・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・83 条件演算子・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・84代入・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・40,52,85 new 演算子・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・198,337 instanceof 演算子・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・284,339 演算子の優先順位・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・86
制御構造
while 文・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・91 do 文・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・94 for 文・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・95 空文・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・100 if 文・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・101 break 文・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・107 continue 文・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・110 switch 文・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・111 return 文・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・113 throw 文・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・318,338 try 文・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・324,338メソッド
メソッドの定義・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・29,119,196,335 メソッドの呼び出し・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・31,121,132 this・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・121,200,217 仮引数・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・120,127,155,204 実引数・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・122,127,155,204 戻り値・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・64,130 return 文・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・113,130 main メソッド・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・32,165,216クラスとインタフェース
クラス・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・38,190,194 クラスの定義・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・190,195,334 メソッド・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・29,31,119,196,211,335 フィールド・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・185,196,208,293,335 コンストラクタと new 演算子・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・198,263,336 this・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・121,200,217 static フィールドと static メソッド・・・・・・・・・・・・・・・・・・208,211,215,217項目別目次 メソッドのオーバーライド・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・259,260 メソッドのオーバーロード・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・219,260 クラスの継承・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・255,267 アクセス制御・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・293 内部クラス・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・367,372 static 入れ子クラス・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・377 無名クラス・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・367,380 インタフェース・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・233 インタフェースの定義と実装・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・236,238,334 インタフェースの継承・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・281 ポリモルフィズム・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・233,240,267
パッケージ
パッケージ宣言・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・289,333 インポート宣言・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・67,291,333 アクセス制御・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・293 public 修飾子・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・298 private 修飾子・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・293,298 protected 修飾子・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・298 final 修飾子・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・299 abstract 修飾子・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・300 static 修飾子・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・208,211,303例外処理
例外・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・316 throw 文・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・318,338 throws 節・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・319 例外クラス・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・322 try 文・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・324,338 catch 節・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・327 finally ブロック・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・329スレッド
Thread クラス・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・344 Runnable インタフェース・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・348 synchronized 文・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・354Lesson4
制御構造
89
4.1
繰り返し構造の発見
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・89
4.2
while 文とブロック
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・91
4.3
do 文
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・94
4.4
for 文
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・95
入れ子の for 文・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・98 計算誤差 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1004.5
空文
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・100
4.6
if 文
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・101
ブロックの利用・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・105 余分なセミコロン・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1064.7
break 文
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・107
4.8
continue 文
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・110
4.9
switch 文
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・111
4.10
return 文
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・113
4.11
その他の文
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・114
4.12
変数のスコープ
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・114
4.13
演習問題
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・116
Lesson5
メソッド
117
5.1
メソッドの効用
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・117
メソッドの定義・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・119 メソッドの呼び出しと変数 this・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・121 スコープとイクステント・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・123 手続き抽象とパラメータ化・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・125 仮引数と実引数・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・127 引数の値渡しと参照渡し ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1285.2
戻り値
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・130
return 文・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・130 戻り値があるメソッドの呼び出し・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・132項目別目次 synchronized メソッド・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・356 static synchronized メソッド・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・358
コンピュータ科学
フラクタル図形・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・137 動的計画法・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・169 リスト構造・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・223 オートマトン・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・310 食事をする哲学者・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・362 ニュートン法・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・107 二分探索・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・167 選択ソート・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・168本書の構成
本書は 3 部で構成されます。第 1 部は基礎編で、制御構造や配列など、オブジェクト指向に直接 関係しない部分を説明します。第 2 部がオブジェクト指向編で、クラスやインタフェースなどにつ いて説明します。最後の第 3 部は発展編で、スレッドによる並列処理などについて説明します。 本書は、初めてプログラミングを学ぶ大学生向けのプログラミング演習の教科書として書かれて います。典型的なカリキュラムでは、1 年の半期で第 1 部をやり、残りの半期で第 2 部をやるのが よいでしょう。第 3 部は選択とすることが考えられます。半期で第 1 部から第 3 部までやる場合に は、各章の基本的な部分だけをやり、残りは実際にプログラムを書いていく中で、各自が必要に応 じて自習するという形が考えられます。 本書は Java 言語の教科書ですが、オブジェクト指向を教えない従来のプログラミングの演習にも 使えるように配慮しています。その場合は第 1 部だけを教えればよいでしょう。本書の第 1 部は、C 言語などの非オブジェクト指向言語を使った従来のプログラミング演習の内容に相当します。具体 的には、制御構造や手続き呼び出し、再帰呼び出し、配列の要素の検索や整列などの話題を扱って います。 なお、Java 言語はオブジェクト指向言語なので、第 1 部でも少しだけオブジェクトに触れていま す。Java 言語を使っていても、最初はまったくオブジェクトを使わずに教える方法もあります。し かし著者の経験では、その方法では、学生の側が非オブジェクト指向プログラミングになれすぎて しまって、後でオブジェクト指向プログラミングを理解するのが難しくなるようです。そこで本書 の第 1 部では、オブジェクトを完全に隠してしまうことはせず、必要に応じて簡単に説明するよう にしています。ただし、最初からあまり詳しくオブジェクトについて説明してしまうと初学者は混 乱してしまうので、適当にぼかして説明しているところもあります。本書を教科書にして講義する 場合は、第 1 部ではオブジェクトについてあまり詳しく説明しすぎないように、教員の側が注意す るとよいと思います。 また本書は Java 言語でプログラムを書くときに、リファレンスとしても使えるよう、Java 言語の 比較的細かい仕様についても説明するようにしています。たとえば、Lesson3 では、Java 言語で使え るすべての演算子を網羅的に説明しています。この中には、普通のプログラミングではめったに使 われない演算子の説明も含まれています。そのような重要性の低い演算子の説明は、本書の最後に まとめてもよかったのですが、そうすると説明が分散してしまい、リファレンスとして使いにくく なります。そこで本書ではあえて、すべての演算子の説明を Lesson3 にまとめています。そのよう な部分には、最初は適当に読み流してください、という指示がありますから、最初は軽く読み流し、 後で必要に応じて読み返すようにしてください。 本書の中のいくつかの節には、旗の絵がついています。これは内容が高度なので、難しいような ら読まずに飛ばしてもよいことを表します。また章末の演習問題の中には、問題番号の後ろに∗ が ついているものがあります。これは難易度の高い問題であることを示します。本書の構成
なお、本書では、Java 言語の処理系のインストール手順についての説明は割愛しました。インス トール手順が知りたい場合は、各種 Web サイトの情報や他の書籍を参考にしてください。たとえ ば、Sun Microsystems 社の Web サイト(http://java.sun.com/)には、同社の Java 言語処理系で ある J2SE SDK(Java 2 Standard Edition, Software Development Kit)の入手方法やインストール手順が 説明されています。また同社から J2SE のドキュメントを入手(Web サイト上でも公開されていま す)して、「Java 2 プラットフォーム API 仕様」を見れば、本書では Lesson 15 でごく一部を紹介す るだけの、標準クラスライブラリの細かい仕様を知ることができます。 本書の例題の多くは、著者が書いた Turtle.java というプログラムを利用します。このプログラ ムは本書の付録に収録してありますが、Web サイト上からも入手できます。株式会社アスキーの書 籍サポートページ(http://www.ascii.co.jp/pb/ant/gi4java/)を参照してください。本書に掲 載されている演習問題の解答や解説は、大学での演習に本書が使われる場合を考慮して、本書には 記載していません。ただし、一部の問題に関しては、前述の Web サイトにヒントを掲載しました。 本書で紹介しているサンプルプログラムは Windows 上で動作する Java 2 SDK(バージョン 1.4.2) でのコンパイル/実行の確認を行いました。 注意 著者および株式会社アスキーのいずれも、本書のサンプルプログラムの実行結果についての 責任は負いかねますので、あらかじめご了承ください。