『Head First Java』は、これからJavaを学ぶ人、さらに深くJavaとオブジェクト指向のことを理解したい人のための本です。本書の最大の特徴はイラストや写真を多用したユニークなスタイル。しかし、これは見た目だけやさしくするためのものではありません。本書は認知心理学や教育心理学の成果をベースに、読者の集中力を切らさないように、また学習した内容を忘れないように、注意深く構成されているのです。他にもショートストーリー、クロスワードパズルなど、これまでのプログラム解説書には見られない内容が数多く盛り込まれ、楽しみながらJavaの本質を学ぶことができます。著者のKathy Sierra氏はSun Microsystemsのマスタートレーナーとして最新のJavaをインストラクターに教えた経験を持ち、Bert Bates氏はいくつかのJava資格試験の中心的な作成メンバーです。2人のJavaに関する深い理解と教育に関する豊富な経験が、この一冊に凝縮しています。第2版はJava 5.0に対応し、サイズも価格も手頃になりました。
Head First Java 第2版
―頭とからだで覚えるJavaの基本
Kathy Sierra, Bert Bates 著、夏目 大 訳、島田 秋雄、高坂 一城、神戸 博之 監修
- TOPICS
- 発行年月日
- 2006年03月
- PRINT LENGTH
- 720
- ISBN
- 978-4-87311-279-4
- 原書
- Head First Java, Second Edition
- FORMAT
- Print PDF
正誤表
ここで紹介する正誤表には、書籍発行後に気づいた誤植や更新された情報を掲載しています。以下のリストに記載の年月は、正誤表を作成し、増刷書籍を印刷した月です。お手持ちの書籍では、すでに修正が施されている場合がありますので、書籍最終ページの奥付でお手持ちの書籍の刷版、刷り年月日をご確認の上、ご利用ください。
正誤表
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 で詳しく触れます。
目次
序章 この本の使い方 この本が対象としている読者 本当に真面目な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 索引 訳者あとがき