magazine.gif Head First Java 第2版

序章 この本の使い方

  • この本が対象としている読者
  • 本当に真面目なJavaプログラムの本なのか?
  • 単に読むだけではなく「学習」できる本
  • 自分の思考について考える
  • この本で著者が工夫したこと
  • この本を読むときに気を付けること
  • 用意するもの
  • その他の注意事項
  • テクニカルエディタの紹介
  • 謝辞

1章 Javaの世界に飛び込もう ― ともかくまずは始めてみる

  • Javaプログラムのできるまで
  • Javaプログラム作成の手順
  • Javaの歴史(概略)
  • Javaプログラム(ソースファイルの構造)
  • クラスの構造
  • mainメソッドを持つクラスの作成
  • mainメソッドの「中身」
  • 分岐
  • 本格的なJavaアプリケーション
  • PhraseOMaticプログラムの仕組み
  • 特別座談会(コンパイラとJVM)
  • エクササイズとパズル

2章 クラスとオブジェクト ― オブジェクト指向の国へ

  • 対決! オブジェクト指向対手続き指向
  • クラスを作る際に考えるべきこと
  • クラスとオブジェクトの違い
  • クラスの作成と使用
  • Movieクラスの作成とテスト
  • mainから外へ飛び出す
  • アプリケーションの実行
  • エクササイズとパズル

3章 プリミティブと参照 ― 変数の基礎知識

  • 変数の宣言
  • 「ダブルモカをください。intサイズで」
  • 変数に値を代入する際の注意
  • 名前付けのルール
  • オブジェクトを操作する
  • オブジェクトへの参照も変数の値である
  • Javaの真実(ゲスト:オブジェクトリファレンス)
  • オブジェクト、参照、ガーベージコレクション
  • オブジェクトの生と死
  • 配列はコップを並べたトレイのようなもの……
  • Dog型の配列を作る
  • Dogオブジェクトの操作
  • エクササイズとパズル

4章 メソッドとインスタンス変数 ― オブジェクトの「ふるまい」

  • クラスにはインスタンス変数とメソッドがある
  • メソッドの機能に影響するインスタンス変数(ステート)
  • メソッドに値を渡す
  • メソッドは値を戻す
  • メソッドには、複数のパラメータを宣言することもできる
  • 引数として指定された値の「渡され方」
  • パラメータ、戻り値の有効な使い方
  • カプセル化
  • データの保護
  • Javaの真実(ゲスト:オブジェクト)
  • Gooddogクラスをカプセル化する
  • 配列でのオブジェクトの扱い
  • インスタンス変数の宣言と初期化
  • インスタンス変数とローカル変数の違い
  • 変数の比較
  • エクササイズとパズル

5章 本格的なプログラムの作成 ― 本格的なプログラム(メソッド)を書く

  • バトルシップゲームプログラムを作る
  • プログラムの設計
  • 簡易版ゲームプログラム
  • クラスの作成
  • テストコードの作成
  • SimpleDotComクラスのテストコードを作成する
  • SimpleDotComクラスのテストコード
  • checkYourself()メソッド
  • 新しいテクニック
  • SimpleDotComクラスのコードとそのテストコードの最終形
  • SimpleDotComGameクラス(のmain()メソッド)の仮コード
  • SimpleDotComGameクラスのmain()メソッド
  • random()とgetUserInput()
  • GameHelperクラス
  • forループの基礎知識
  • ループの処理
  • 拡張forループ
  • Stringをintに変換する
  • プリミティブ型のキャスト
  • エクササイズとパズル

6章 Java APIの基礎 ― Javaライブラリを使用する

  • 簡易版バトルシップゲームプログラムのバグ
  • バグの原因は?
  • バグの修正方法
  • 方法1はあまりに複雑
  • Java APIのクラスを使う
  • ArrayListクラスの使い方
  • Javaの真実(ゲスト:ArrayListクラス)
  • ArrayListと配列の比較
  • ArrayListを使用したバグの修正
  • ArrayListを使って修正したコード
  • 「完全版」バトルシップゲームプログラムの作成
  • 簡易版から完全版への変更ポイント
  • DotComBustクラスの処理
  • DotComBustクラスの仮コード
  • DotComBustクラスのリアルコード
  • DotComクラスのリアルコード
  • 高度な条件判定式
  • GameHelperクラス
  • ライブラリ(Java API)の使用
  • APIの使い方
  • エクササイズとパズル

7章 継承とポリモーフィズム ― オブジェクト指向をより深く知る

  • 2章の復習
  • 継承について理解する
  • 動物シミュレーションプログラムを構成する
  • 重複を防ぐのに役立つ継承
  • 動物の「食べ方」はみな同じか
  • 継承関係を再検討する
  • 呼び出されているメソッドは?
  • 継承関係を図に表す
  • IS-A関係とHAS-A関係
  • IS-A関係に関する注意事項
  • クラスの継承関係が正しいことを確認する方法
  • サブクラスが継承できるもの、できないもの
  • 継承の適切な使用
  • 継承は何のために行う?
  • オーバーライドに関するルール
  • メソッドのオーバーロード
  • エクササイズとパズル

8章 インターフェースと抽象クラス ― ポリモーフィズムの高度な利用方法

  • 前章の例のおさらい
  • Animalオブジェクトはどんな動物を表す?
  • 抽象クラスのインスタンスは作成できない
  • 抽象クラスと具象クラス
  • 抽象メソッド
  • 抽象メソッドの本体はサブクラスで必ず作る
  • ポリモーフィズムの応用例
  • クラスの異なるサブジェクトを混在させる
  • Animalのサブクラス以外のオブジェクトを格納するにはどうするか
  • Objectクラスのメソッド
  • Objectクラスを使用する際の注意
  • DogオブジェクトがDogクラスのオブジェクトではなくなるとは?
  • 元のクラスのメソッドは使えない
  • すべてのクラスはObjectクラスの特性、機能を受け継ぐ
  • 「ポリモーフィズム」は元来「多くの形」を意味する
  • 利用できるメソッドを変更する
  • ペットショッププログラムのための修正方法
  • インターフェース
  • Petインターフェースの作成とインプリメント
  • スーパークラスバージョンのメソッドを使用する
  • エクササイズとパズル

9章 コンストラクタとガーベージコレクション ― オブジェクトの生と死

  • オブジェクトはどこに存在するか
  • メソッドはスタックに格納される
  • ローカル変数が参照型のものである場合は?
  • インスタンス変数の格納場所
  • オブジェクト誕生の神秘
  • コンストラクタのコード
  • オブジェクトのインスタンス変数の設定
  • コンストラクタを使用してオブジェクトのインスタンス変数の初期設定をする
  • 複数のコンストラクタを作る
  • 引数のないデフォルトコンストラクタはどのような場合でも必ず作られるのか
  • コンストラクタの復習
  • スーパークラスのコンストラクタとサブクラスのコンストラクタは同時に実行されるのか
  • オブジェクトのコンストラクタにおけるスーパークラスのコンストラクタの役割
  • Hippoオブジェクトを作るには、Animalオブジェクト、Objectオブジェクトとしての部分も必要
  • スーパークラスのコンストラクタを意図的に呼び出す場合は?
  • 親より先に子供は産まれるか?
  • スーパークラスのコンストラクタに引数がある場合
  • コンストラクタの中でコンストラクタを呼び出すには?
  • オブジェクトの「寿命」はどのくらい?
  • 参照型変数の場合
  • 特別座談会(インスタンス変数とローカル変数)
  • エクササイズとパズル

10章 数値の扱いとスタティック変数、メソッド ― 数値の扱い

  • Mathクラスのメソッド:「グローバル的」なメソッド
  • 通常のメソッドとスタティックメソッドの違い
  • スタティックメソッドを持つクラスを作る
  • スタティックメソッドではスタティックでない変数(インスタンス変数)は利用できない
  • スタティックメソッドの中で通常のメソッドを呼び出すことはできない
  • スタティック変数:クラスのすべてのインスタンスで値が同じになる変数
  • スタティック変数の初期化
  • static fi nalと宣言した変数は定数のようになる
  • finalは必ずしもstaticと同時に使用しなくてよい
  • Mathクラスのメソッドの概要
  • プリミティブのラッピング
  • プリミティブとオブジェクトの境界線を曖昧にする機能
  • さまざまなケースで行われる自動ラッピング、アンラッピング
  • ラッパに用意されているユーティリティメソッド
  • 数値を数字に変換する
  • 数値のフォーマッティング
  • フォーマッティングについての指示の仕方
  • "%"は「この部分にフォーマッティング対象の値が入る」ということを意味する
  • フォーマット文字列には独自の文法がある
  • フォーマッティング指示のコード
  • 必須なのは型の指定だけ
  • フォーマッティング対象を複数指定する
  • 日付のフォーマッティング
  • 日付の活用
  • 時間を進める、さかのぼる
  • Calenderを継承するオブジェクトの取得
  • Calenderオブジェクトを使う
  • Calender APIの主要機能
  • スタティックインポート
  • 特別座談会(インスタンス変数とスタティック変数)
  • エクササイズとパズル

11章 例外処理 ― 危険をともなうプログラムの作成

  • 音楽演奏プログラムを作る
  • 基礎的なことがらについて学ぶ
  • まず必要なのはSequencerオブジェクト
  • 正しく動作しない恐れがある(他人が書いた)メソッドを呼び出す
  • Javaのメソッドでは、実行中に何か例外が起きたことを呼び出し側のコードに知らせるために「例外」を発生させる
  • try/catchブロック
  • 例外はすべてException型を継承するクラスのオブジェクト
  • 例外を発生させるメソッドを作る
  • try/catchブロックでの処理の流れ
  • finallyブロック:例外が発生した場合もしなかった場合も行うべき処理
  • 1つのメソッドが複数種の例外を発生させることもある
  • 例外とポリモーフィズム
  • catchブロックを複数作る場合は、対応する例外クラスが下位のものから順に並べる
  • 上位の例外クラスに対応するcatchブロックを先にすることはできない
  • 例外処理をしたくない時は……「回避!」
  • 例外処理の回避は実は「先送り」
  • 例外についてのまとめ
  • 音楽演奏プログラム
  • プログラムキッチン(音楽演奏プログラム)
  • 音楽演奏プログラムの基本的な作り方
  • 簡単な音楽演奏プログラム
  • MidiEventオブジェクト(MIDIデータ)の作成
  • ShortMessageオブジェクトの内容
  • setMessage()メソッド
  • 楽器と音程を変更できるプログラム
  • 12章以降で作成するプログラムの概要
  • エクササイズとパズル

12章GUIの基礎 ― グラフィカルなインターフェース

  • まずウィンドウを作る
  • ボタンを備えたウィンドウ(フレーム)を作る
  • 前ページのプログラムの場合、ボタンをクリックしても何も起きない……
  • イベント処理
  • イベントリスナーとイベントソースのコミュニケーション
  • ActionEventの扱い
  • リスナー、ソース、イベント
  • 再びGUIの話……
  • 描画パネルをフレームに組み込む
  • paintComponent()メソッドの例
  • Graphics2DをGraphicsの代わりに使用する
  • 描画する円の色をグラデーションにするためのコード
  • イベントと図形の描画
  • フレームに複数のウィジェットを組み込む
  • ボタンのクリックによって円の色を変化させる
  • ボタンを2つにする
  • 内部クラス
  • 内部オブジェクトを作る
  • Javaの真実(ゲスト:内部オブジェクト)
  • 内部クラスをアニメーションに利用する
  • アニメーションプログラムのコード
  • プログラムキッチン(ミュージックビデオプログラム)
  • GUI部品以外で発生するイベントに対応するリスナーの作成
  • MidiEventオブジェクトの作成
  • ユーティリティメソッドmakeEvent()の使用例
  • 第2段階:Controllerイベントのリスナーの作成、登録
  • 第3段階:音楽に合わせて図形を描画する
  • エクササイズとパズル

13章Swingの基礎知識 ― Swingを利用する

  • Swingコンポーネント
  • レイアウトマネージャ
  • レイアウトマネージャの機能
  • レイアウトマネージャの分類
  • さまざまなSwingコンポーネント
  • プログラム・キッチン(BeatBoxプログラム)
  • エクササイズとパズル

14章 シリアライゼーションとファイルI/0 ― オブジェクトの保存

  • ドラムパターンを保存する
  • オブジェクトの保存方法
  • オブジェクトをシリアライズしてファイルに保存する
  • データの通り道となる「ストリーム」
  • シリアライゼーションとは
  • インスタンス変数の値はどのようなかたちで保存されるか
  • クラスにシリアライズの機能を持たせるにはSerializableインターフェースをインプリメントする
  • インスタンス変数をシリアライズの対象から外すには「transient」宣言する
  • デシリアライゼーション:保存したオブジェクトの再現
  • デシリアライズはどのように行われるか
  • ゲームキャラクターオブジェクトのシリアライズとデシリアライズ
  • オブジェクトのデータをプレーンテキストファイルに書き込む
  • 暗記カードプログラム
  • QuizCardBuilderクラスの概要
  • java.io.Fileクラス
  • バッファを使うメリット
  • テキストファイルからデータを読み込む
  • QuizCardPlayerクラスの概要
  • StringTokenizerの使用方法
  • クラスのバージョン
  • バージョンID
  • プログラム・キッチン(BeatBoxプログラムにドラムパターンを保存する)
  • エクササイズとパズル

15章 ネットワークとスレッド ― ネットワーク接続のためのプログラムを書く

  • チャットクライアントとチャットサーバ
  • チャットプログラムの概要
  • 接続、送信、受信
  • ネットワーク(ソケット)接続を確立する
  • TCPポートもアドレスの一部
  • ソケット接続経由でのデータの読み取りにもBufferdReaderが使用できる
  • ソケット接続経由でのデータ書き込みにはPrintWriterを使用する
  • 簡単なクライアントプログラム
  • クライアントプログラムのコード
  • サーバプログラムの作成
  • サーバプログラムのコード
  • 簡単なチャットクライアントの作成
  • スレッドを表すThreadクラス
  • 「マルチスレッド」の意味
  • スレッドを起動するためのコード
  • スレッドには「ジョブが必要」
  • Runnableインターフェースをインプリメントする
  • スレッドの状態の変化
  • 通常は実行可能/実行中という2つの状態の間で切り替えが行われる
  • スレッドスケジューラ
  • スレッドをスリープさせる
  • Sleepメソッドを使用すればスケジューラをある程度コントロールできる
  • ユーザースレッドを2つ作る
  • スレッドの問題点「競合」
  • Dr.Steveショー「離婚の危機? このカップルは修復可能か」
  • 複数のスレッドによるオブジェクトの共有
  • 「RyanとMonica」プログラム
  • オブジェクトのアクセスには「ロック」をかけることができる
  • makeWithdrawl()メソッドに同時にアクセスできるスレッドを1つに限定する
  • すべてのオブジェクトが備える「ロック」
  • 「更新が無効になる」という問題
  • コードを実行してみる……
  • incremant()メソッドをsynchronized宣言する
  • synchronized宣言の問題点
  • 改良型チャットクライアント
  • チャットサーバのコード
  • プログラム・キッチン(BeatBoxプログラムの完成バージョン)
  • エクササイズとパズル

16章 コレクションとジェネリック型 ― データ構造

  • ジュークボックスで人気のある曲を調べる
  • Arraylistに曲名を保持するコード(ソート機能なし)
  • ArrayListクラスにはソートメソッドはない
  • ArrayListだけがコレクション(複数のデータをひとまとめにするクラス)ではない
  • TreeSetを使用してもよいが……Collections.sort()メソッドを使用することもできる
  • Collections.sort()を使用してコードを改良する
  • StringではなくSongオブジェクトをソートする
  • Songクラスを利用してコードを改造する
  • コンパイルできない!
  • sort()メソッドの宣言
  • コレクションを「タイプセーフ」にするジェネリック型
  • ジェネリック型
  • ジェネリッククラスを使用する
  • ArrayListの型パラメータを使用する
  • ジェネリックメソッドを使用する
  • sort()メソッド
  • この場合の"extends"は「"extends"あるいは"implements"」という意味
  • これで問題が明らかに……
  • comparableインターフェースをインプリメントしたSongクラス
  • リストのソートは確かにできたが……
  • Comparatorを使用する
  • Comparatorを使用してコードを改造する
  • ソートは問題なくできるが、要素の重複が
  • 必要なのはListではなくSet
  • Collection API(一部)
  • HashSetを使用する
  • オブジェクトを「同等」と見なす条件は?
  • HashSetの重複確認:hashcode()とequals()
  • hashCode()とequals()をオーバーライドしたSongクラス
  • ソートした要素の順序が狂わないためにはTreeSetを使う
  • TreeSetについての注意点
  • TreeSetの要素は「比較のできる」ものにする
  • List、Setの次はMap……
  • 再びジェネリック型について
  • ポリモーフィズムとジェネリック型
  • ArrayListではどうか……
  • これが許容されたとしたら……
  • ワイルドカードを使えば……
  • 別の書き方……
  • エクササイズ&パズル

17章 プログラムの提供 ― プログラムが完成したら……

  • Javaプログラムの提供
  • プログラムができた。その後は……
  • ソースファイルとクラスファイルを分けて保存する
  • プログラムに必要なファイルをJARファイルにまとめる
  • JARファイルの実行
  • クラスをパッケージにまとめる
  • パッケージ名の重複を避ける
  • クラスをパッケージに所属させる
  • パッケージに属するクラスのコンパイル、実行
  • -dオプションの優れた機能
  • パッケージに属するクラスを実行可能JARファイルにまとめる
  • JARファイルの内容確認、内容の抽出
  • Java Web Start
  • .jnlpファイル
  • JWSを利用するプログラムを提供する手順
  • エクササイズとパズル

18章RMIによるプログラムの提供 ― 分散コンピューティング

  • メソッドの呼び出しは通常、同一のヒープ上のオブジェクト間で行われる
  • 他のマシン上のオブジェクトのメソッドを呼び出すには?
  • 小型デバイス上のオブジェクトAからパソコン上のオブジェクトBのメソッドを呼び出すには?
  • RMIを設計してみる
  • ヘルパーの役割
  • RMIのクライアントヘルパー、サーバヘルパー
  • クライアントがスタブを取得するには
  • スタブのクラスファイルをクライアントに提供するには
  • クライアントマシン、サーバマシンに必要なクラスファイル
  • RMIは実際にどのように応用されているのか?
  • サーブレット
  • サーブレットの作成・実行
  • 簡単なサーブレットの例
  • PhraseOMaticプログラムを利用したサーブレットを作ってみる
  • サーブレットで利用しやすいよう改良したPhraseOMaticクラスのコード
  • EJB(Enterprise JavaBeans):大規模システムのためのRMI
  • Jiniとは
  • サービスの自動検索機能
  • ルックアップサービスの自動修復機能
  • ユニバーサルサービスブラウザ
  • ユニバーサルサービスブラウザの動き

付録A BeatBoxプログラム完全版

  • eatBoxプログラム完成版(クライアント)のコード
  • eatBoxサーバプログラム完成版

付録B 本文で触れなかった重要事項ベスト10

索引
訳者あとがき