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

はじめに Edit

クラスは、基本的なプログラミングの単位。
クラスは、オブジェクトの構造を提供する。
オブジェクトに定義されているデータを操作するためのメソッドを定義する。

データとメソッドとその意味の組み合わせは、契約とも呼ばれる。

同じ名前のメソッドでも、意味が違えば契約が違うということになる。

各オブジェクトは、クラスのインスタンスである。

2.1 簡単なクラス Edit

class Hoge {
  public int moge;
}

以上のように、クラスはclass予約語を用いて宣言する。
クラス宣言は、型名を作り出す。
以下のようにして、オブジェクトの参照を宣言する。

Hoge foo;

上記は、あくまで参照で、オブジェクトを生成していない。
明示的に生成する必要がある。

2.1.1 クラスのメンバー Edit

フィールド
データ変数
メソッド
オブジェクトの振る舞い
ネストしたクラスやインタフェース
クラスやインタフェース宣言

2.1.2 クラス修飾子 Edit

クラス宣言の前にクラス修飾子を付けると、クラスに属性を付加できる。

public
誰でもアクセス可能。指定がなければ、パッケージの中からのみ。
abstract
サブクラスで実装しなければいけないメソッドがある
final
サブクラス化不可能の指定
strictの浮動小数点
浮動小数点の演算モードの指定

finalとabstractは相反するので同時に指定できない。

一定の順番で(紹介した順番で)書くのが好ましい。

Javaでは、publicクラスはクラスと同じファイルに書く必要がある。
つまり、1つのファイルには、1つのpublicしか宣言できないことになる。

練習問題 2.1 Edit

class Vehicle {
  public double velocity;  // 現在のスピード
  public double angle;     // 現在の方向
  public String owner;    // 所有者
}

練習問題 2.2 Edit

class LinkedList {
  public Object data;
  public LinkedList next;
}

2.2 フィールド Edit

フィールドとは、クラスの変数のこと。
宣言は、型名、フィールド名、初期化節と続く。
オブジェクト単位にフィールドにインスタンスを持たせることは、インスタンス変数とも呼ばれる。

フィルード宣言前には以下の修飾子を書くことができる。
'アクセス修飾子'、'static'、'final'、'transient'、'volatile'。
finalとvolatileは同時指定できない。

2.2.1 フィールドの初期化 Edit

フィールドには初期化子を書くことができる。
初期化しない場合は、型に応じた初期値が代入される。

2.2.2 staticフィールド Edit

クラスの全オブジェクトで共有されるフィールドをstaticフィールドという。
クラス変数とも言う。

外部からアクセスする場合は、クラス名を使用してアクセスしなければならない。

オブジェクトの参照経由でもアクセスできるが、クラス変数ではないように、見えるのでさけるべきである。

練習問題 2.3 Edit

class Vehicle {
  public double velocity;  // 現在のスピード
  public double angle;     // 現在の方向
  public String owner;     // 所有者

  public long idNum;
  public static long nextID = 0;
}

2.2.3 finalフィールド Edit

初期化された後、値を変更できない変数。

初期化子で初期化されない場合は、ブランクfinalと呼ばれる。
ブランクfinalは複雑な初期化が必要な場合に有効である。

以下の内容を検討してfinalにすべきである

  • オブジェクトの変更不可能な属性か
  • オブジェクトが生成された時に値が決まるか
  • 生成された時に、フィールドの値を設定するのは実用的か

頻繁に更新されない場合だけならば、finalフィールドにすべきではない。

値が必要になるまで、初期化しないことを遅延初期化(lazy initialization)と呼ぶ。

練習問題 2.4 Edit

idNumは変更されないと思われるので、finalにすべきである。

2.3 アクセス制御 Edit

2.4 オブジェクトの生成 Edit

練習問題 2.5 Edit

public class Vehicle {
    public double velocity;  // 現在のスピード
    public double angle;     // 現在の方向
    public String owner;    // 所有者
    
    public long idNum;
    public static long nextID = 0;
    
    public void show(String kind) {
        System.out.println(kind);
        System.out.println("  ID = " + idNum);
        System.out.println("  スピード = " + velocity);
        System.out.println("  方向 = "+ angle);
        System.out.println("  所有者 = "+ owner);
    }
    
    public static void main(String[] args) {
        Vehicle bicycle = new Vehicle();
        bicycle.idNum = Vehicle.nextID++; 
        bicycle.velocity = 0.2;
        bicycle.angle = Math.PI / 2;
        bicycle.owner = "Mike";
        bicycle.show("bicycle");
        
        Vehicle bike = new Vehicle();
        bike.idNum = Vehicle.nextID++; 
        bike.velocity = 2.0;
        bike.angle = Math.PI * 2;
        bike.owner = "Ken";
        bike.show("bike");
        
        Vehicle car = new Vehicle();
        car.idNum = Vehicle.nextID++; 
        car.velocity = 4.0;
        car.angle = Math.PI ;
        car.owner = "Joe";
        car.show("car");
    }
}

出力結果は以下の通り。

bicycle
  ID = 0
  スピード = 0.2
  方向 = 1.5707963267948966
  所有者 = Mike
bike
  ID = 1
  スピード = 2.0
  方向 = 6.283185307179586
  所有者 = Ken
car
  ID = 2
  スピード = 4.0
  方向 = 3.141592653589793
  所有者 = Joe

練習問題 2.6 Edit

public class LinkedList {
    public int data;
    public LinkedList next;
    
    public void show() {
        System.out.println("data = " + data);
        if (next != null)
            next.show();
    }
    
    public static void main(String[] args) {
        LinkedList item1 = new LinkedList();
        LinkedList item2 = new LinkedList();
        LinkedList item3 = new LinkedList();
        
        item1.data = 1234;
        item1.next = item2;
        
        item2.data = 3456;  
        item2.next = item3;
        
        item3.data = 7890;
        
        item1.show();
    }
}

実行結果は以下の通り。

data = 1234
data = 3456
data = 7890

2.5 生成と初期化 Edit

2.5.1 コンストラクタ Edit

練習問題 2.7 Edit

public class Vehicle {
    public double velocity;  // 現在のスピード
    public double angle;     // 現在の方向
    public String owner;    // 所有者
    
    public long idNum;
    public static long nextID = 0;
    
    public Vehicle() {
        idNum = nextID++;
    }
    
    public Vehicle(String firstOwner) {
        this();
        owner = firstOwner;
    }
    
    public void show(String kind) {
        System.out.println(kind);
        System.out.println("  ID = " + idNum);
        System.out.println("  スピード = " + velocity);
        System.out.println("  方向 = "+ angle);
        System.out.println("  所有者 = "+ owner);
    }
    
    public static void main(String[] args) {
        Vehicle bicycle = new Vehicle("Mike");
        bicycle.velocity = 0.2;
        bicycle.angle = Math.PI / 2;
        bicycle.show("bicycle");
        
        Vehicle bike = new Vehicle("Ken");
        bike.velocity = 2.0;
        bike.angle = Math.PI * 2;
        bike.show("bike");
        
        Vehicle car = new Vehicle("Joe");
        car.velocity = 4.0;
        car.angle = Math.PI ;
        car.show("car");
    }
}

結果は以下の通り。

bicycle
  ID = 0
  スピード = 0.2
  方向 = 1.5707963267948966
  所有者 = Mike
bike
  ID = 1
  スピード = 2.0
  方向 = 6.283185307179586
  所有者 = Ken
car
  ID = 2
  スピード = 4.0
  方向 = 3.141592653589793
  所有者 = Joe

練習問題2.8 Edit

public class LinkedList {
    public int data;
    public LinkedList next;

    public LinkedList(int newData, LinkedList nextItem) {
        data = newData;
        next = nextItem;
    }
    public void show() {
        System.out.println("data = " + data);
        if (next != null)
            next.show();
    }
    
    public static void main(String[] args) {
        LinkedList item1 = new LinkedList(1234, null);
        LinkedList item2 = new LinkedList(3456, item1);
        LinkedList item3 = new LinkedList(7890, item2);
        
        item3.show();
    }
}

結果は以下の通り。

data = 7890
data = 3456
data = 1234

2.5.2 初期化ブロック Edit

2.5.3 static初期化 Edit

2.6 メソッド Edit

2.6.1 メソッド Edit

練習問題 2.9 Edit

public class Vehicle {
    public double velocity;  // 現在のスピード
    public double angle;     // 現在の方向
    public String owner;     // 所有者
    
    public long idNum;
    public static long nextID = 0;
    
    public Vehicle() {
        idNum = nextID++;
    }
    
    public Vehicle(String firstOwner) {
        this();
        owner = firstOwner;
    }
    
    public static long maxID() {
        return nextID - 1;
    }
    
    public void show(String kind) {
        System.out.println(kind);
        System.out.println("  ID = " + idNum);
        System.out.println("  スピード = " + velocity);
        System.out.println("  方向 = "+ angle);
        System.out.println("  所有者 = "+ owner);
    }
    
    public static void main(String[] args) {
        Vehicle bicycle = new Vehicle("Mike");
        Vehicle bike = new Vehicle("Ken");
        Vehicle car = new Vehicle("Joe");
        
        System.out.println("maxID = " + Vehicle.maxID());
    }
}

結果は以下の通り。

maxID = 2

2.6.2 メソッド呼び出し Edit

2.6.3 メソッドの実行と戻り Edit

練習問題 2.10 Edit

public class Vehicle {
    public double velocity;  // 現在のスピード
    public double angle;     // 現在の方向
    public String owner;      // 所有者
    
    public long idNum;
    public static long nextID = 0;
    
    public Vehicle() {
        idNum = nextID++;
    }
    
    public Vehicle(String firstOwner) {
        this();
        owner = firstOwner;
    }
    
    public String toString() {
        return "ID = " + idNum + "\n" 
            + "スピード = " + velocity + "\n"  
            +"方向 = "+ angle + "\n"
            +"所有者 = "+ owner;
    }
    
    public static void main(String[] args) {
        Vehicle bicycle = new Vehicle("Mike");
        bicycle.velocity = 0.1;
        bicycle.angle = Math.PI * 3 / 4;
        
        System.out.println(bicycle);
    }
}

以下、実行結果。

ID = 0
スピード = 0.1
方向 = 2.356194490192345
所有者 = Mike

練習問題 2.11 Edit

public class LinkedList {
    public int data;
    public LinkedList next;

    public LinkedList(int newData, LinkedList nextItem) {
        data = newData;
        next = nextItem;
    }
    
    public String toString() {
        return "data = " + data;
    }
    
    public void show() {
        System.out.println(this);
        if (next != null)
            next.show();
    }    
    public static void main(String[] args) {
        LinkedList item1 = new LinkedList(1234, null);
        LinkedList item2 = new LinkedList(3456, item1);
        LinkedList item3 = new LinkedList(7890, item2);
        
        item3.show();
    }
}

実行結果は以下の通り。

data = 7890
data = 3456
data = 1234

2.6.4 パラメータの値 Edit

2.6.5 アクセス制御のためのメソッド使用 Edit

練習問題 2.12 Edit

public class Vehicle {
    private double velocity;  // 現在のスピード
    private double angle;     // 現在の方向
    private String owner;      // 所有者
    
    private long idNum;
    private static long nextID = 0;
    
    public Vehicle() {
        idNum = nextID++;
    }
    
    public Vehicle(String firstOwner) {
        this();
        owner = firstOwner;
    }
    
    public void setVelocity(double value) { velocity = value; }
    public double getVelocity() { return velocity; }
    
    public void setAngle(double value) { angle = value; }
    public double getAngle() { return angle; }
    
    public String toString() {
        return "ID = " + idNum + "\n" 
            + "スピード = " + velocity + "\n"  
            +"方向 = "+ angle + "\n"
            +"所有者 = "+ owner;
    }
    
    public static void main(String[] args) {
        Vehicle bicycle = new Vehicle("Mike");
        bicycle.setVelocity(0.1);
        bicycle.setAngle(Math.PI * 3 / 4);
        
        System.out.println(bicycle);
    }
}

以下、実行結果。

ID = 0
スピード = 0.1
方向 = 2.356194490192345
所有者 = Mike

練習問題 2.13 Edit

public class LinkedList {
    private int data;
    private LinkedList next;

    public LinkedList(int newData, LinkedList nextItem) {
        data = newData;
        next = nextItem;
    }
    
    public void setData(int value) { data = value; } 
    public int getData() { return data; } 
    
    public String toString() {
        return "data = " + data;
    }
    
    public void show() {
        System.out.println(this);
        if (next != null)
            next.show();
    }    
    public static void main(String[] args) {
        LinkedList item1 = new LinkedList(1234, null);
        LinkedList item2 = new LinkedList(3456, item1);
        LinkedList item3 = new LinkedList(7890, item2);
    
        item1.setData(9999); 
        item2.setData(8888); 
        item3.setData(7777);
        
        item3.show();
    }
}

実行結果は、以下の通り。

data = 7777
data = 8888
data = 9999

練習問題 2.14 Edit

public class Vehicle {
    private double velocity;  // 現在のスピード
    private double angle;     // 現在の方向
    private String owner;      // 所有者
    
    private long idNum;
    private static long nextID = 0;
    
    public Vehicle() {
        idNum = nextID++;
    }
    
    public Vehicle(String firstOwner) {
        this();
        owner = firstOwner;
    }
    
    public void setVelocity(double value) { velocity = value; }
    public double getVelocity() { return velocity; }
    
    public void setAngle(double value) { angle = value; }
    public double getAngle() { return angle; }
    
    public String toString() {
        return "ID = " + idNum + "\n" 
            + "スピード = " + velocity + "\n"  
            +"方向 = "+ angle + "\n"
            +"所有者 = "+ owner;
    }
    
    public void changeSpeed(double value) {
        setVelocity(value);
    }
    
    public void stop() {
        setVelocity(0);
    }
    
    public static void main(String[] args) {
        Vehicle bicycle = new Vehicle("Mike");
        bicycle.setVelocity(0.1);
        bicycle.setAngle(Math.PI * 3 / 4);
        
        bicycle.changeSpeed(4.0);
        System.out.println(bicycle);
        
        System.out.println();
        
        bicycle.stop();
        System.out.println(bicycle);
    }
}

結果は以下の通り。

ID = 0
スピード = 4.0
方向 = 2.356194490192345
所有者 = Mike

ID = 0
スピード = 0.0
方向 = 2.356194490192345
所有者 = Mike

練習問題 2.15 Edit

public class LinkedList {
    private int data;
    private LinkedList next;

    public LinkedList(int newData, LinkedList nextItem) {
        data = newData;
        next = nextItem;
    }
    
    public void setData(int value) { data = value; } 
    public int getData() { return data; } 
    
    public String toString() {
        return "data = " + data;
    }
    
    public void show() {
        System.out.println(this);
        if (next != null)
            next.show();
    }    
    
    public int count() {
        if (next == null) 
            return 1;
        else
            return 1 + next.count();
    }
    
    public static void main(String[] args) {
        LinkedList item1 = new LinkedList(1234, null);
        LinkedList item2 = new LinkedList(3456, item1);
        LinkedList item3 = new LinkedList(7890, item2);
    
        System.out.println("item3.count = " + item3.count());
    }
}

以下は、結果。

item3.count = 3

2.7 this Edit

2.8 メソッドのオーバーロード Edit

メソッドを呼ぶとき、一致するシグネチャのメソッドが呼ばれる。
つまり、同じ名前のメソッドでも、引数が違えば、呼びわけが可能ということ。
1つの名前に、複数の機能を割り当てる、これをオーバーロードという。

練習問題 2.16 Edit

public class Vehicle {
    public final static int TURN_LEFT = 0; 
    public final static int TURN_RIGHT = 1; 
        
    private double velocity;  // 現在のスピード
    private double angle;     // 現在の方向
    private String owner;      // 所有者
    
    private long idNum;
    private static long nextID = 0;
    
    public Vehicle() {
        idNum = nextID++;
    }
    
    public Vehicle(String firstOwner) {
        this();
        owner = firstOwner;
    }
    
    public void setVelocity(double value) { velocity = value; }
    public double getVelocity() { return velocity; }
    
    public void setAngle(double value) { angle = value; }
    public double getAngle() { return angle; }
    
    public String toString() {
        return "ID = " + idNum + "\n" 
            + "スピード = " + velocity + "\n"  
            +"方向 = "+ angle + "\n"
            +"所有者 = "+ owner;
    }
    
    public void changeSpeed(double value) {
        setVelocity(value);
    }
    
    public void stop() {
        setVelocity(0);
    }
    
    public void turn(double value) {
        angle += value;
    }
    
    public void turn(int value) {
        switch (value) {
            case TURN_LEFT: turn(-Math.PI / 2); break;
            case TURN_RIGHT: turn(Math.PI / 2); break;
        }
    }
    
    public static void main(String[] args) {
        Vehicle bicycle = new Vehicle("Mike");
        bicycle.setVelocity(0.1);
        bicycle.setAngle(0);
        System.out.println(bicycle + "\n");
        
        bicycle.turn(Math.PI / 2);
        System.out.println(bicycle + "\n");
        
        bicycle.turn(TURN_RIGHT);
        System.out.println(bicycle);
    }
}

結果は以下の通り。

ID = 0
スピード = 0.1
方向 = 0.0
所有者 = Mike

ID = 0
スピード = 0.1
方向 = 1.5707963267948966
所有者 = Mike

ID = 0
スピード = 0.1
方向 = 3.141592653589793
所有者 = Mike

2.9 main メソッド Edit

プログラムの起動には、mainメソッドが実行される。
mainメソッドは、public static void でなくてはならない。
引数は、String[] argsのみ。
argsは、プログラムが実行された時のパラメータ(プログラム引数)である。

練習問題 2.17 Edit

public class Vehicle {
    public final static int TURN_LEFT = 0; 
    public final static int TURN_RIGHT = 1; 
        
    private double velocity;  // 現在のスピード
    private double angle;     // 現在の方向
    private String owner;      // 所有者
    
    private long idNum;
    private static long nextID = 0;
    
    public Vehicle() {
        idNum = nextID++;
    }
    
    public Vehicle(String firstOwner) {
        this();
        owner = firstOwner;
    }
    
    public void setVelocity(double value) { velocity = value; }
    public double getVelocity() { return velocity; }
    
    public void setAngle(double value) { angle = value; }
    public double getAngle() { return angle; }
    
    public String toString() {
        return "ID = " + idNum + "\n" 
            + "スピード = " + velocity + "\n"  
            +"方向 = "+ angle + "\n"
            +"所有者 = "+ owner;
    }
        
    public static void main(String[] args) {
        
        for (int i = 0; i < args.length; i++) {
            Vehicle bicycle = new Vehicle(args[i]);
            bicycle.setVelocity(0.1);
            bicycle.setAngle(0);
            System.out.println(bicycle + "\n");
        }
    }
}

実行結果は以下。

ID = 0
スピード = 0.1
方向 = 0.0
所有者 = Mike

ID = 1
スピード = 0.1
方向 = 0.0
所有者 = Ken

ID = 2
スピード = 0.1
方向 = 0.0
所有者 = Joe

2.10 ネイティブメソッド Edit

ハードウェアを直接操作する必要がある場合は、ネイティブメソッドを使える。
ネイティブメソッドは、abstract、strictftpは使えない。

移植性と安全さを重視するなら、使うべきではない。




Front page   Edit Freeze Diff Backup Upload Copy Rename Reload   New Pages Search Recent changes   Help   RSS of recent changes
Last-modified: 2005-06-14 Tue 19:03:51 JST (5339d)