「Java謎+落とし穴徹底解明」正誤表
このページは、拙書「Java謎+落とし穴徹底解明」技術評論社 ISBN4-7741-1361-1 の正誤表です。
p.213からのX-Drawのソースに関する訂正は、別ページに分けました。
日付順のインデックス
X-Drawのソースに関するバグ(2003/7/6)
「ほげを考えるページ」は、現在オリジナルが公開されていませんので、 作者の吉田さんの許可を得まして、私のページに転載させていただきました。
URLは、
http://member.nifty.ne.jp/maebashi/programmer/hoge.html(移転済み)
http://kmaebashi.com/programmer/hoge.html(移転後)
です。
Javaチュートリアルについて、英語版しかないという記述がありますが、 書籍でなら日本語版も出ています。
http://www.amazon.co.jp/exec/obidos/ASIN/4894714043/ref=sr_aps_d_1_1/249-9160691-3241928
一応補足しておきます。
誤
DrawLine()などの公開された関数
正
drawLine()などの公開された関数
誤
fillPatternCodeで指定される色
正
fillPatternCodeで指定される中塗りパターン
誤
なお、コンストラクタを書かない場合、
public Circle() {}というコンストラクタ(何もしないコンストラクタ) をコンパイラが自動的に生成します。
正
なお、コンストラクタを書かない場合、
Circle() {}というコンストラクタ(何もしないコンストラクタ) をコンパイラが自動的に生成します。
この例ではクラス自体がpublicではないですから、 コンストラクタにもpublicは付きません(JLS 8.8.7)。
あと、実際にはコンパイラはデフォルトコンストラクタの中に super()の呼び出しも挿入しますが、 それは他のコンストラクタでも同じことですし、 ここで説明することではないと思うので省略します。
誤
private staticなフィールドの指す先に唯一のフィールドを 生成することにより実現します。
正
private staticなフィールドの指す先に唯一のオブジェクトを 生成することにより実現します。
誤
ことにになり
正
ことになり
図中のP1, P2はそれぞれp1, p2(小文字)です。
誤
p2 = new Point();
正
p2 = new Point2D();
誤
その方法については「6.5 clone()とCloneable」で説明します.
「その方法」の「その」は「深いコピー」を指しますが、「6.5 clone()とCloneable」には、clone()をオーバーライドする方法する方法のみ説明していて、実際に扱っているのは浅いコピーですね。
clone()をオーバーライドする方法までは説明しているので、あとは読者の宿題ということでもよいかと思いますが、7.3.1に深いコピーの具体的な実装があります。
誤
プログラムリストに合わせると、ここで設定されている値は、「1 2 3 4 …」ではなく「0 1 2 3 …」です。
図中のX, Yはそれぞれx, y(小文字)です。
誤
そこにいること自体、誰かが必要と認める、
正
そこにいること自体、誰かが必要と認めてる、
誤
"An object is a class instance or an array. The reference values (often just references) are pointers to these objects."
正
"An object is a class instance or an array. The reference values (often just references) are pointers to these objects."
原文の強調部分が強調されていませんでした。
誤
for (int i = 0; i < shapes.length; i++) { System.out.println("shape[" + i + "].color..." + shape[i].color); }
正
for (int i = 0; i < shapes.length; i++) { System.out.println("shapes[" + i + "].color..." + shapes[i].color); }
誤
コンパイラが勝手にinstanceofとelseifに相当するコードを吐くのなら
正
コンパイラが勝手にinstanceofとelse ifに相当するコードを吐くのなら
誤
ちなみにですが、C++ではデフォルトの状態でオーバーライドを禁止しており
正
ちなみにですが、C++ではデフォルトの状態でオーバーライドは不能になっており
C++の場合、無指定のメソッドをサブクラスで再定義することはできますが、 どのメソッドが呼び出されるかはコンパイル時の型で決定します。 「禁止」と言うと、コンパイルエラーになりそうに読めますので、訂正します。
なお、これをオーバーライドと呼んでいるC++の入門書もあるようですが、 本書はJavaの本ですので、 オーバーライドと言えば実行時の型によって選択されるものを指すと思ってください。
誤
IntStackがIntArrayの一部であり
正
IntArrayがIntStackの一部であり
誤
Polyine
正
Polyline
実行結果が間違っていますので、対応するソースも間違っています。
誤
Polyine
正
Polyline
実行結果が間違っていますので、対応するソースも間違っています。
誤
interface Visitor { visitPolyline(Polyline polyline); visitCircle(Circle circle); visitRectangle(Rectangle rectangle); }
正
interface Visitor { void visitPolyline(Polyline polyline); void visitCircle(Circle circle); void visitRectangle(Rectangle rectangle); }
誤
void accept(Visitor v) { v.visitPolyline(polyline); }
正
void accept(Visitor v) { v.visitPolyline(this); }
誤
Visitorの中にvisitPolyline(), visitCircle, visitRectangleという〜
正
Visitorの中にvisitPolyline(), visitCircle(), visitRectangle()という〜
誤
CLASSPAHT
正
CLASSPATH
誤
しかし---たとえばこんなメソッドをPrintクラスに追加して
正
しかし---たとえばこんなメソッドをPrinterクラスに追加して
クラスを表現する箱がふたつあって、 両方に「PrinterMain」と書いてあります。
run()とmainMethod()を含むのはPrinterクラスですから、右側の箱は 「Printer」です。
誤
こういう事態を避けるためには、上記のような「やばいところ」 (クリティカルセッション(critical session)と呼びます)
正
こういう事態を避けるためには、上記のような「やばいところ」 (クリティカルセクション(critical section)と呼びます)
情けない話ですが... ずっと、critical sessionだと思い込んでいました(_o_)
誤
class HogePackageException {
正
class HogePackageException extends Exception {
誤
実際には、直列化を行なうには単にObjectOutputStreamの readObject()を一発呼ぶだけではダメで、
正
実際には、直列化を行なうには単にObjectOutputStreamの writeObject()を一発呼ぶだけではダメで、
誤
その場合FactoryTestImplの各メソッドは
正
その場合WindowTestImplの各メソッドは
誤
} catch (Exception ex) { err.printStackTrace();
正
} catch (Exception ex) { ex.printStackTrace();
LabelAlignmentが直列化を前提としたクラスなら、 implements Serializableしていないと変だろう、という問題もありますが。
JDK1.2以降のJavaでは、デシリアライズで生成されるオブジェクトを制御する 手段が提供されています。詳細は「補足(いいわけ?)」コーナーの、 「7.2 列挙型を作る」についてを 参照してください。
デバッグライトでクラス名を取得するため、SecurityManagerの getStackTrace()を使う方法を紹介していますが、JDK1.4からは、 例外オブジェクトそのものからクラス名・メソッド名を取得する方法が 提供されています。詳細は補足を 参照してください。
import java.security.*;は不要です。
誤
SecurityManagerのgetStackTrace()メソッドは
正
SecurityManagerのgetClassContext()メソッドは
誤
兼ね合いもなどあるでしょう.
正
兼ね合いなどもあるでしょう.
10: public void mouseClickde(MouseEvent e) {
第3刷からは、「Clickde」の「de」のところにカケアミを入れました。
誤
Colorというフィールド
正
colorというフィールド
「関数へのポインタ」の項について、176ページだけでなく、194ページを追加。
Cプログラマが索引を引く際、知りたい情報はむしろこちらだと思われるためです。