Head First Java 第2版
――頭とからだで覚えるJavaの基本

[cover photo]
  • 2006年03月 発行
  • 720ページ
  • ISBN4-87311-279-6
  • フォーマット Print PDF
  • 原書: Head First Java, Second Edition

オライリー・ジャパンで書籍を購入:
定価4,320円

Ebook Storeで電子版を購入:
価格3,456円

『Head First Java』は、これからJavaを学ぶ人、さらに深くJavaとオブジェクト指向のことを理解したい人のための本です。本書の最大の特徴はイラストや写真を多用したユニークなスタイル。しかし、これは見た目だけやさしくするためのものではありません。本書は認知心理学や教育心理学の成果をベースに、読者の集中力を切らさないように、また学習した内容を忘れないように、注意深く構成されているのです。他にもショートストーリー、クロスワードパズルなど、これまでのプログラム解説書には見られない内容が数多く盛り込まれ、楽しみながらJavaの本質を学ぶことができます。著者のKathy Sierra氏はSun Microsystemsのマスタートレーナーとして最新のJavaをインストラクターに教えた経験を持ち、Bert Bates氏はいくつかのJava資格試験の中心的な作成メンバーです。2人のJavaに関する深い理解と教育に関する豊富な経験が、この一冊に凝縮しています。第2版はJava 5.0に対応し、サイズも価格も手頃になりました。

サンプルPDF


関連書籍

Head Firstデザインパターン
詳解 Javaプログラミング 第2版 VOLUME 1

序章 この本の使い方
    この本が対象としている読者
    本当に真面目な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ブロックでの処理の流れ
    fi nallyブロック:例外が発生した場合もしなかった場合も行うべき処理
    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>Dog<ではどうか……
    これが許容されたとしたら……
    ワイルドカードを使えば……
    別の書き方……
    エクササイズ&パズル

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

索引

訳者あとがき

ここで紹介する正誤表には、書籍発行後に気づいた誤植や更新された情報を掲載しています。以下のリストに記載の年月は、正誤表を作成し、増刷書籍を印刷した月です。お手持ちの書籍では、すでに修正が施されている場合がありますので、書籍最終ページの奥付でお手持ちの書籍の刷版、刷り年月日をご確認の上、ご利用ください。


2006年5月

■p.11 「条件判定」の段落
誤:int x = 4 ; // 変数 x に3を代入
正:int x = 4 ; // 変数 x に4を代入

■p.11 「条件判定」の段落
誤:x = x - 1; // つまりこの場合永久に繰り返すことになる
正:x = x + 1; // つまりこの場合永久に繰り返すことになる

■p.118 ソースコード下から6行目
誤:System.out.println(" x == " +x);
正:System.out.println(" x = " + x);

■p.122 「JVMになってみよう」解答の下から6行目
誤:System.out.println(" x == " +x);
正:System.out.println(" x = " + x);

■p.148 ソースコード20行目
誤:for (DotCom dotCom ToSet : dotComsList) {
正:for (DotCom dotComToSet : dotComsList) {

■p.149 ソースコード4行目
誤:for (DotCom dotCom ToSet : dotComsList) {
正:for (DotCom dotComToSet : dotComsList) {

■p.149 ソースコード10行目
誤:dotComsList.remove(i);
正:dotComsList.remove(dotComToTest);

■p.154 6行目、7行目
誤:16章
正:17章

■p.155 「素朴な疑問に答えます」下から10行目、1行目
誤:16章
正:17章

■p.157 「素朴な疑問に答えます」下から2行目
誤:16章
正:17章

■p.180 一番下の「注意」
誤:注意:default、protected については、16 章、付録 B で詳しく触れます。
正:注意:default、protected については、付録B で詳しく触れます。

Feedback

皆さんのご意見をお聞かせください。ご購入いただいた書籍やオライリー・ジャパンへのご感想やご意見、ご提案などをお聞かせください。より良い書籍づくりやサービス改良のための参考にさせていただきます。
[feedbackページへ]