- お知らせ -
  • 当wikiのプログラムコードの表示を直してみました(ついでに長い行があると全体が下にぶっ飛ぶのも修正)。不具合があればBBSまでご連絡下さい。

1.1 さあはじめよう Edit

javac HelloWorld.java

によって、HelloWorld.javaがコンパイルされ、

java HelloWorld

によって、HelloWorldクラスの
static void mainのメソッドが実行される。

練習問題1.1 Edit

これ以降、入力はEclipseで行う。

「ファイル」「新規」「プロジェクト」から「Javaプロジェクト」を選び、
プロジェクト名をHelloWorldとし、プロジェクトを作成する。

次に、「ファイル」「新規」「クラス」で、
名前をHelloWorldとして、クラスを新規作成する。

以下を入力する。

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, world");
    }
}

保存して、「実行」する。
実行すると、以下のように出力される。

Hello, world

練習問題1.2 Edit

例えば、

System.out.println("Hello, world")

とすると、

構文エラーがあります。";" を挿入して BlockStatements を完了してください。

というエラーが出る。

また、

System.out.println("Hello, world);

とすると、

文字列リテラルが二重引用符によって正しく閉じられていません。

というエラーが出る。

1.2 変数 Edit

変数宣言は、

int a = 1;
int b = 1;

もしくは、

int a = 1,
    b = 1;

などのように宣言し、初期化できる。

練習問題1.3 Edit

タイトルというと、こんな感じでよいのかな?

public class Fibonacci {
    public static void main(String[] args) {
        int lo = 1, hi = 1;
        System.out.println("フィボナッチ数列");
        System.out.println(lo);
        while (hi < 50) {
            System.out.println(hi);
            hi = lo + hi;
            lo = hi - lo;
        }
    }
}

練習問題1.4 Edit

例の平方表をもとめる。

public class Square {
    public static void main(String[] args) {
        int squre;
        
        System.out.println("平方表");
        for (int i = 1; i <= 10; i++) {
            squre = i * i;
            System.out.println(squre);
        }
    }
}

実行結果は以下のようになる。

平方表
1
4
9
16
25
36
49
64
81
100

1.3 コード中のコメント Edit

/ / は、1行コメント。
/* */ は、範囲コメント。
/** */ は、ドキュメンテーションコメント(ドキュメント用)。

1.4 名前付定数 Edit

定数値は、finalで宣言すれば定義できる。
クラスのインスタンスに属させたくなければ、staticもつける。

以下は例。

class Test {
  static final int A = 1;
  static final int B = 2;
}

また、Test.A、Test.Bというようにアクセスすることができる。

練習問題 1.5 Edit

public class HelloWorld {
    static final String MESSAGE = "Hello, world";
    public static void main(String[] args) {
        System.out.println(MESSAGE);
    }
}

練習問題 1.6 Edit

public class Fibonacci {
    static final String TITLE = "フィボナッチ数列";
    public static void main(String[] args) {
        int lo = 1, hi = 1;
        System.out.println(TITLE);
        System.out.println(lo);
        while (hi < 50) {
            System.out.println(hi);
            hi = lo + hi;
            lo = hi - lo;
        }
    }
}

1.5 Unicode文字 Edit

Javaでは、Unicodeで、変数名や定数名を宣言できる。

以下、例。

static final double Π = 3.14159265358979323846;

1.6 制御の流れ Edit

制御文には、while、for、if-else、switch、do while等がある。

練習問題1.7 Edit

public class Fibonacci {
    static final int MAX_INDEX = 9;
    
    public static void main(String[] args) {
        int lo = 1,
             hi = 1;
        String mark;
        
        System.out.println("1: " + lo);
        for (int i = MAX_INDEX; 2 <= i; i--) {
            if (hi % 2 == 0)
                mark = " *";
            else
                mark = "";
            
            System.out.println((MAX_INDEX - i + 2)  + ": " + hi + mark);
            hi = lo + hi;
            lo = hi - lo;
        }
    }
}

1.7 クラスとオブジェクト Edit

クラスは、フィールド(データ変数等)や、メソッド(関数等)を持つ。

クラスやインターフェイスは、他のクラスやインターフェイスのメンバーになることができる。

以下はクラスの宣言例。

class Point {
  public double x, y;
}

クラスのメンバーは、アクセス制限を施すことができる。
上の例では、xとyがpublicで宣言されている。

1.7.1 オブジェクトの生成 Edit

オブジェクトの生成(インスタンス化)は、newを使う。
生成したオブジェクト自身は、インスタンスと呼ばれる。

オブジェクトはヒープ領域に生成され、参照によってアクセスする。
(つまり、間接的であるということ)

Javaの場合、「オブジェクトを渡す」と言った場合、
「オブジェクトの参照を渡す」と同意義。
(C++等は違うので注意)

以下は生成例。

Point position = new Point();

position.x = 0.0;
position.y = 1234.5;

上記例の、positionは、インスタンス変数と呼ばれる。

1.7.2 staticフィールド(クラスフィールド) Edit

同じクラス全てで共有できるフィールドがほしい場合、クラス変数を用いる。

staticによって、宣言することで、クラス変数を利用できる。
staticフィールドと呼ばれる。

以下は例。

public static Point position = new Point();

本書では、フィールドと呼んだ時は、非staticフィールドを指す。

1.7.3 ガーベジコレクタ Edit

newで生成したオブジェクトは、不要になり、参照をやめると、
自動的にガーベジコレクタにより自動的に回収される。

1.8 メソッドとパラメータ Edit

クラスの操作は、メソッドにより宣言される。
メソッド中でのみデータ操作することで、データを隠蔽することをデータのカプセル化と呼ぶ。

以下は、Pointクラスにメソッドを追加した例。

public void clear() {
  x = 0;
  y = 0;
}

1.8.1 メソッド呼び出し Edit

メソッドの呼び出しは、目的のオブジェクトの参照に"."をつけて、指定する。
引数は、カッコ内にカンマで区切って指定する。

メソッドは1つの値を返すことができる。
returnにより値を返す。

メソッドが呼び出されているオブジェクトは、カレントオブジェクト、またはレシーバオブジェクトと呼ばれる。

1.8.2 this参照 Edit

thisはカレントオブジェクトの参照である。

練習問題 1.8 Edit

public class Point {
    public double x, y;
    
    public void setLocation(Point p) {
        this.x = p.x;
        this.y = p.y;
    }
    
    public static void main(String[] args) {
        Point point_a = new Point();
        Point point_b = new Point();
        
        point_a.x = 12;
        point_a.y = 34;
       
        point_b.x = 56;
        point_b.y = 78;

        point_b.setLocation(point_a);
       
        System.out.println(point_b.x + ", " + point_b.y);
    }
}

実行例は以下のとおり。

12.0, 34.0

1.8.3 staticメソッド(クラスメソッド) Edit

クラスフィールドと同様に、クラス固有のメソッドを
クラスメソッドと呼び、staticメソッドとも呼ぶ。

staticメソッドは、非staticメンバにアクセスできない。

1.9 配列 Edit

配列は、同じ型の変数の集まり。
整数値のインデックスでアクセス可能。

配列の範囲は、0〜length - 1の整数。
配列へのアクセスは、範囲検査が行われ、
範囲外にアクセスすると、例外が送出される。

長さが0の配列は、空配列。

練習問題 1.9 Edit

public class Fibonacci {
    static final int MAX_INDEX = 9;
    public static void main(String[] args) {
        int lo = 1, hi = 1;
        int[] array = new int[MAX_INDEX];
        
        System.out.println("フィボナッチ数列");
        
        array[0] = lo;
        for (int i = 2; i <= MAX_INDEX; i++) {
            array[i - 1] = hi;
            hi = lo + hi;
            lo = hi - lo;
        }
        
        for (int i = 0; i < array.length; i++) {
            System.out.println(array[i]);
        }
    }
}

出力結果は、以下のとおり。

フィボナッチ数列
1
1
2
3
5
8
13
21
34

練習問題 1.10 Edit

public class ImprovedFibonacci {
    static final int MAX_INDEX = 9;
    
    static class Result {
        public int value;
        public boolean is_even;
    }
    
    public static void main(String[] args) {
        int lo = 1, hi = 1;
        Result[] results = new Result[MAX_INDEX];
        
        for (int i = 0; i < results.length; i++) {
            results[i] = new Result();
        }
        
        results[0].value = lo;
        results[0].is_even = (lo % 2 == 0);
        for (int i = 2; i <= MAX_INDEX; i++) {
            results[i - 1].value = hi;
            results[i - 1].is_even = (hi % 2 == 0);
            
            hi = lo + hi;
            lo = hi - lo;
        }
        
        String mark;
        for (int i = 0; i < results.length; i++) {
            if (results[i].is_even) {
                mark = " *";
            } else {
                mark = "";
            }
              
            System.out.println(
                    (i + 1) + ":" + results[i].value + mark);
        }
    }
}

Resultがstaticなのは、そうでないと、ImprovedFibonacciのインスタンスが必要になるから。
staticをはずすと、「エンクロージングインスタンスがない」とコンパイラにしかられる。

以下実行結果。

1:1
2:1
3:2 *
4:3
5:5
6:8 *
7:13
8:21
9:34 *

1.10 文字列オブジェクト Edit

Stringクラスは、文字データ列。
結合演算子(+, +=)を用いて、連結できる。
0〜length() - 1 までの範囲で、charAtで参照できる。
Stringオブジェクトは、読み出し可能だが、変更不能。
equals()メソッドで、比較可能。(==だと参照の比較になるので注意)

練習問題 1.11 Edit

public class StringsDemo {
    public static void main(String[] args) {
        String myName = "Anders";
            
        myName = myName + " Hejlsberg";
        System.out.println("Name = " + myName);
    }
}

以下、実行結果。

Name = Anders Hejlsberg

ちなみに、Anders Hejlsbergは、DelphiとJ++とC#の設計者。

練習問題 1.12 Edit

public class ImprovedFibonacci {
    static final int MAX_INDEX = 9;
    
    public static void main(String[] args) {
        int lo = 1, hi = 1;
        String mark, message;
        
        message = "1: " + lo;
        System.out.println(message);
        for (int i = 2; i <= MAX_INDEX; i++) {
            if (hi % 2 == 0)
                mark = " *";
            else
                mark = "";
            message = i + ": " + hi + mark;
            System.out.println(message);
            hi = lo + hi;
            lo = hi - lo;
        }
        
    }
}

実行結果は以下。

1: 1
2: 1
3: 2 *
4: 3
5: 5
6: 8 *
7: 13
8: 21
9: 34 *

1.11 クラスを拡張する Edit

既存の継承し、サブクラス化することで、クラスを拡張できる。
元のクラス=スーパークラス。
継承したクラス=サブクラス。

サブクラスは、スーパークラスのメソッドをオーバーライドできる。

サブクラスは、ポリモフィズムによって、スーパークラスと同様に振舞うことができる。

1.11.1 スーパークラスからのメソッドの呼び出し Edit

superは、スーパークラスから参照する場合に使用する。

1.11.2 Objectクラス Edit

他のクラスを拡張しなくても、暗黙に、Objectクラスを拡張していることになる。

1.11.3 型キャスト Edit

コンパイラに対し、式の型が異なることを指示するには、型キャスト、型変換を用いる

例:

name = (String) obj;

練習問題 1.13 Edit

class Walkman {
    private Plug plug;
    public void setPlug(Plug plug) {
      :
    }
    public Plug getPlug() {
      :
    }
    public void Play() {
      :
    }
}

class NewWalkman extends Walkman {
    private Plug subPlug;
    public void setSubPlug(Plug plug) {
      :
    }
    public Plug getSubPlug() {
      :
    }
    :
}

class SpecialWalkman extends NewWalkman {
    public talk() {
        :
    }
    :
}

1.12 インターフェス Edit

どのようなメソッドがあるかのみをインターフェスによって記述することができる。
classの定義時、implementsにより、そのインターフェスを実装することができる。

また、インターフェスは、extendsにより拡張できる。

例:

interface Lookup {
  Object find(String name);
}

class SimpleLookup implements Lookup {
 :

練習問題 1.14 Edit

interface Lookup {
    Object find(String name);
}

interface NewLookup extends Lookup {
    void add(Object value);
    void remove(String name);
}

public class SimpleNewLookup implements NewLookup {
    public Object find(String name) {
        :
    }
    public void add(Object value) {
        :
    }
    public void remove(String name) {
        :
    }
    
    public static void main(String[] args) {
        :
    }
    
}

1.13 例外 Edit

チェックされるエラーにより、エラー処理を行う。
エラーを検出したメソッドは、例外をスローする。
呼び出し側のメソッドは、例外をキャッチできる。

例外の処理方法は、try-catch-finally節により行う。

練習問題 1.15 Edit

class BadDataSetException extends Exception {
    public String file;
    public IOException e;
}

1.14 パッケージ Edit

名前の衝突は、重要な問題。

回避策として、接頭語を使うこと。

回避策その2、パッケージを使う。
完全修飾子名使うか、インポートを行うことで使用できる。

パッケージ命名は、ドメインが tobysoft.net だとしたら、net.tobysoft.tools といったようにする。

インポートする時は、java.util.* というように、まとめて指定することもできる。

1.15 Javaのプラットフォーム Edit

ソースコードは、バイトコードにコンパイルされ、Java仮想マシン上で動作する。

仮想マシンはラインタイムシステムを提供する。
ランタイムシステムは、セキュリティマネジャー(アクセスコントローラ)で検査する。

バイトコードは不正なことをしていないか、ベリファイヤにより検査される。

バイトコードは、仮想マシンが載っているどのマシンでも実行でき、
障害を防ぐために、適切なレベルで保護される。

1.16 その他の機能について Edit

  • スレッド
    マルチスレッドがらみ
  • 型クラス
    基本データ型を表すクラスについて
  • I/O
    入出力について
  • コレクション
    ListやHash等のコレクションについて
  • ユーティリティインターフェースとクラス
    java.utilパッケージについて



Front page   Edit Freeze Diff Backup Upload Copy Rename Reload   New Pages Search Recent changes   Help   RSS of recent changes
Last-modified: 2005-05-08 Sun 19:27:56 JST (5376d)