(旧版)Java言語プログラミングレッスン

C言語を知らなくても。プログラミングが初めてでも。

結城浩

こちらのページは、 旧版のJava言語プログラミングレッスンのサポートページです。 最新情報は、 『改訂版Java言語プログラミングレッスン』のページをごらんください。

「道は狭いかもしれないが、灯台の向こうの海は果てしなく広い。」

『Java言語プログラミングレッスン』
(上)Java言語を始めよう
結城浩著
ソフトバンクパブリッシング(株)刊
ISBN4-7973-0803-6 \2400E

「森の奥に何があるかはわからないが、私はもう恐れない。」

『Java言語プログラミングレッスン』
(下)オブジェクト指向を始めよう
結城浩 著
ソフトバンクパブリッシング(株)刊
ISBN4-7973-1010-3 \2400E

目次

はじめに

このページは、結城浩の書籍『Java言語プログラミングレッスン』のサポートページです。 このページで以下のことができます。

書籍に掲載されたプログラムリストのダウンロード

書籍中に登場したプログラムリストを以下からダウンロードできます。 ZIPファイルを展開後、readme.txtまたはindex.htmlファイルをお読み下さい。

上でダウンロードできるファイルは、 本書の読者の便宜をはかるために用意したものです。 本書と独立に、学校・会社・講習会等の資料として利用することはご遠慮ください。 もちろん本書自身をテキストや参考書としてご採用いただいている場合には 自由に利用して下さってかまいません。

なお、ZIPファイルの展開には以下のようなツールが必要です。

上巻「Java言語を始めよう」の内容

『Java言語プログラミングレッスン』上巻「Java言語を始めよう」では、 プログラミング言語としてのJavaを基礎の基礎から学びます。 C言語を知らなくても読むことができるように配慮されていますので、 プログラミング言語を学ぶのが初めて、という方でも安心です。

下巻「オブジェクト指向を始めよう」の内容

『Java言語プログラミングレッスン』下巻「オブジェクト指向を始めよう」では、 オブジェクト指向プログラミング言語としてのJavaに焦点をあてて学びます。

ぜひ、感想をお送りください

あなたのご意見・感想をお送りください。 あなたの一言が大きなはげみとなりますので、どんなことでもどうぞ。

あなたの名前: メール:
学年・職業など: 年齢: 男性女性
(上の情報は、いずれも未記入でかまいません)

お手数ですが、以下の問いに答えてから送信してください(迷惑書き込み防止のため)。
今年は西暦何年ですか?

何かの理由でうまく送れない場合にはメールhyuki dot mail at hyuki dot comあてにお願いします。

書籍中の誤りのご指摘やご質問も歓迎いたします。 また、 他の読者の声もお聞き下さい。

質問と回答

2000-11-05 : 下巻の13章のList13-1,13-2,13-3の実行結果が違います

読者から「下巻の13章のList13-1,13-2,13-3を実行しても、
著書に示されているように  ": 100"  の部分が表示されない」とのご指摘をいただきました。

JDK1.3で動作確認してみたところ、確かに表示されません。
表示内容がJDKのバージョンによって異なるものと思われます。

2000-09-13 : 下巻の第12章の練習問題12-1(8)の「安全」「危険」がわかりません

例を示します。
以下のプログラムはコンパイル時にはエラーになりませんが、
実行時には※のClassCastExceptionになります。
そういう意味です。説明がよくなかったですね。修正しておきます。

class Y {
}

class X extends Y {
   public static void main(String[] args) {
       X x = new X();
       Y y = new Y();
       X xx = (X)y;        // ※
       Y yy = (Y)x;
   }
}

2000-09-09 : javacでエラーメッセージが多いと画面の外に流れていきます。

以下のようにしてerr.txtといったファイルに保存して、
お使いのエディタでerr.txtを表示すれば見ることができます。

(1) Windows NTの場合
    javac Hello.java 2> err.txt
(2-a) Windows 95/98の場合(JDK 1.2)
    javac -Xstdout Hello.java > err.txt
(2-b) Windows 95/98の場合(JDK 1.1)
    javac -J-Djavac.pipe.output=true Hello.java > err.txt

2000-05-27 : 下巻の第11章の問題11-9の「左上すみ」は「左下すみ」ではないでしょうか。

ここでは、グラフィクス画面の座標系などのように
Y座標は下向きに増加することを想定しています。

1999-08-25 : 実行しようとするとcan't find classというエラーが出ます

java Hello.class
のように .class をつけてはいけません。
java Hello
のようにクラスの名前だけを指定します。

JDK 1.1 の場合には、環境変数CLASSPATHの設定が必要です。
例えばWindowsの場合、
    set CLASSPATH=.;C:\jdk1.1.7\lib
のようにして現在のディレクトリ(.)からもクラスを探すように設定します。

JDK 1.2 (Java2)をお使いの場合にはCLASSPATHの設定は不要です。
もし設定するなら、上記のように現在のディレクトリ(.)も含めるようにしておきます。

また上巻の巻末付録に
「付録C:よく起こるエラーとその対処法」がありますのでそちらもお読みください。

1999-08-25 : 実行しようとするとNoClassDefFoundErrorというエラーが出ます

Exception in thread "main" java.lang.NoClassDefFoundError: Hello
これは、
「can't find classというエラー」の対処法を参照してください。

誤りと訂正

2003-06-04 : 下巻 : p.34 : 3行目(読者からの指摘。感謝します)
    誤: List 11-6
    正: List 11-16

2003-02-27 : 下巻 : p.176 : List 57行目(読者からの指摘。感謝します)
    誤: buffer.append(i);
    正: buffer.append(n);

2003-01-26 : 下巻 : p.66 : List12-10 10行目(読者からの指摘。感謝します)
    誤: int setSize() {
    正: void setSize() {

2002-09-12 : 下巻 : p.238 : List 18-7 11行目(読者からの指摘。感謝します)

    誤: File dir = new File(args[0]);
    正: File dir = new File(dirname);

2002-06-06 : 下巻 : p.181 : ページ下部(読者からの指摘。感謝します)

    誤: IllegalMoniterStateException
    正: IllegalMonitorStateException

2002-05-06 : 上巻 : p.60 : Table 3-1(読者からの指摘。感謝します)

    誤: char 文字型
    正: char 整数型(文字型)

2002-01-02 : 下巻 : p.233 : リストのキャプション(読者からの指摘。感謝します)

    誤: P233 List 18-3 「ファイルを削除する」
    正:                「ファイルを削除する(DeleteFile1.java)」

2002-01-02 : 下巻 : p.237 : プログラムリスト(読者からの指摘。感謝します)

    誤: p237 List 18-6 11 行目 「File dir = new File(args[0]);」
    正:                        「File dir = new File(dirname);」

2001-11-13 : 下巻 : p.224 : バッファサイズ(読者からの指摘。感謝します)

    「しかし、ここでバッファを大きくしてしまうと、リターンキーを入力しても、
     reader.readLineメソッドから戻ってきてくれません」
    との記述は実装の振る舞いに反しています。
    実際にはバッファを1より大きくしてもreadLineメソッドから戻ってきます。

2001-10-07 : 下巻 : p.166-167 : ウェイトセット

    このページに書かれている
    「synchronizedでロック待ちになっているスレッドはウェイトセットに入る」
    という意味の記述は誤りです。
    synchronizedでロック待ちになっているスレッドはウェイトセットには入りません。
    ウェイトセットに入るのはwaitメソッドを実行したスレッドです。

2001-09-20 : 下巻 : p.239 : 下から8行目 : typo(読者からの指摘。感謝します)

    誤:
        目的ごとにパッケージに別れています

    正:
        目的ごとにパッケージに分かれています

2001-06-29 : 下巻 : p.53 : typo(読者からの指摘。感謝します)

    誤:
        にはあります(1)が、NamedRectangleクラスにはないからです。

    正:
        にはあります(2)が、NamedRectangleクラスにはないからです。

2001-03-26 : 下巻 : p.248 : typo(読者からの指摘。感謝します)

    誤:
        それぞれの型のデータを読み込java.io.DataInputStreamのメソッドです。

    正:
        それぞれの型のデータを読み込java.io.DataInputStreamのメソッドです。

2001-03-26 : 下巻 : p.232 : System.outはPrintWriterではなくPrintStream(読者からの指摘。感謝します)

    誤:
        printlnという名前ではっと気がついた読者がいるかもしれません。
        私たちがこれまでたくさんつかってきたSystem.out.printlnを思い出しませんか。
        System.out.println のoutは、Systemクラスのstaticなフィールドで、
        その型はまさにこのPrintWriterなのです。
        System.outは標準出力をもとにして作ったPrintWriterです。
        ですから、System.out.printlnの実行結果は標準出力に出力されるのです。

    正:
        printlnという名前ではっと気がついた読者がいるかもしれません。
        私たちがこれまでたくさんつかってきたSystem.out.printlnを思い出しませんか。
        System.out.println のoutは、Systemクラスのstaticなフィールドで、
        その型はPrintStreamです。
        System.outは標準出力をもとにして作ったPrintStreamです
        (PrintStreamはバイト単位の出力を行い、PrintWriterは文字単位の出力を行います)。

2001-03-22 : 下巻 : p.121 : Table 14-1 : インタフェースのスーパーインタフェース(読者からの指摘。感謝します)

    誤:
        クラスの                    インタフェースの
        スーパーインタフェースは    スーパーインタフェースは
        複数指定可能                1つだけ

    正:
        クラスの                    インタフェースの
        スーパーインタフェースは    スーパーインタフェースは
        複数指定可能                複数指定可能
        (implementsを使う)       (extendsを使う)

        class A implements B, C {   interface X extends Y, Z {
            ...                         ...
        }                           }


2000-12-07 : 下巻 : 第15章の練習問題15-2の解答(読者からの指摘。感謝します)

    誤:
        "ティギー"(ClassA.last.friendから参照)
    正:
        "ティギー"(ClassA.lastのインスタンス(ルーシー)の、friendフィールドから参照)

    (修正)

2000-09-13 : 下巻 : 第12章の練習問題12-1(8)(読者からの指摘。感謝します)

    誤:
        安全だが
    正:
        エラーにはならないが

    誤:
        危険なことがある
    正:
        実行時に例外が発生する

    (修正)

2000-07-19 : 下巻 : p.113 : (読者からの指摘。感謝します)

    誤:
        MyFileReader reader = new FileReader("input.txt");
    正:
        MyFileReader reader = new MyFileReader("input.txt");

    (修正)

2000-05-01 : 上巻 : p.26 : Table1-1 : (読者からの指摘。感謝します)
    誤解を招く表現があったので修正します。

    誤:
        \octal
                    octalの部分に8進数で1桁〜3桁までの数字を書くと
                    その文字コードを持つ文字になる。
                    値の範囲は \u0000 〜 \u00ff
    正:
        \octal
                    octalの部分に8進数で1桁〜3桁までの数字を書くと
                    その文字コードを持つ文字になる。
                    \0〜\377と表記すると、
                    値の範囲は \u0000 〜 \u00ff に等しくなる。

    (修正)

2000-01-30 : 上巻 : p.247 : 全体 : (著者による発見)
    toString()があたかも(String)というキャスト時に自動的に呼ばれるような
    記述がなされていますが、これは正しくありません。
    toString()が暗黙のうちに呼ばれるのは文字列連結の + や += の場合です。
    またSystem.out.println()の中では、明示的にtoString()を呼び出しています。
    これに関連して以下のように記述を修正します。

    誤:
        Java言語では、そのインスタンスを文字列に変換するときには、
        自動的にtoStringメソッドを呼び出すという約束になっています。
        ですから、
            System.out.println(kokugo);
        という文は、自動的に、
            System.out.println(kokugo.toString());
        というメソッド呼び出しになるのです。
    正:
        Java言語では、文字列連結の演算子 + によって
        インスタンスを文字列に変換するとき、
        そのインスタンスのtoStringメソッドを自動的に呼び出すという
        約束になっています。
        また、System.out.println()にインスタンスを渡すと、
        自動的にそのインスタンスのtoString()を使って文字列に変換してから表示してくれます。
        つまり、
            System.out.println(kokugo);
        という文は、
            System.out.println(kokugo.toString());
        というメソッド呼び出しと同等の動きになります。

    誤:
        ◎しっかり覚えよう:toStringメソッド
        インスタンスを文字列に変換するときには、toStringメソッドが自動的に呼び出される。
    正:
        ◎しっかり覚えよう:toStringメソッド
        toStringメソッドはそのクラスの標準的な文字列表現を定めている。

    (修正)

2000-01-21 : 下巻 : p.277 : 9行目付近 : (読者からの指摘。感謝します)
    誤:qの初期値です。
    正:rの初期値です。
    (修正)

2000-01-21 : 下巻 : p.277 : 11行目付近 : (読者からの指摘。感謝します)
    誤:r ("ジマイマ")との違い
    正:q ("ジマイマ")との違い
    (修正)

1999-08-27 : 上巻 : p.160 : 下から3行目 : (読者からの指摘。感謝します)
    誤:s.length()
    正:args.length()
    (第2刷で修正)

1999-08-27 : 上巻 : p.163 : 表の3枠目 : (読者からの指摘。感謝します)
    誤:boolean equalsIgnoreCase(String anString)
    正:boolean equalsIgnoreCase(String aString)
        (また、場所は表の2枠目)
    (第2刷で修正)

1999-08-18 : 下巻 : p.218 : 下から9行目 : (読者からの指摘。感謝します)
    誤:5〜9行目は、引数が何も指定されなかったときのエラー表示です。
    正:5〜9行目は、引数が何も指定されなかったとき、あるいは2個以上指定されたときのエラー表示です。
    (第2刷で修正)

1999-08-18 : 下巻 : p.241 : 11行目 : (読者からの指摘。感謝します)
    誤:ネイティブファイル以外で書かれたソース
    正:ネイティブコード以外で書かれたソース
    (第2刷で修正)

1999-08-04 : 上巻 : p.285 : List A7-1 : (読者からの指摘。感謝します)
    System.out.println(""); の位置が誤っていました。
    public class Graph2 {
        public static void main(String[] args) {
            int i = 0;
            while (i < 10) {
                int j = 0;
                while (j < i * i) {
                    System.out.print("*");
                    j++;
                }
                System.out.println("");
                i++;
            }
        }
    }
    (第2刷で修正)

1999-07-28 : 上巻 : p.112 : 10行目 : (読者からの指摘。感謝します)
    誤:long型は整数ですからswitch文には使えません
    正:long型は整数ですがswitch文には使えません
    (第2刷で修正)

1999-06-10 : 上巻 : p.9 : 下から7行目
    誤:Java
    正:java
    (第2刷で修正)

更新履歴

豊かな人生のための四つの法則