ほぷしぃ

Java言語入門 〜C言語を学んだ君へ〜

[第8回]クラス

[1] クラス

いよいよクラスについて学習します。
ここからC言語にはなかった新しい用語が数多く出てきます。
最初からすべて覚えることは大変でしょうが、頑張って進めていきましょう。

クラスとは

クラスについて簡単に説明しておきましょう。
クラスとは、「データ」と「手続き」をひとまとまりにしたものです。
また、Javaは全てクラスの組み合わせで作られています。
データには、メンバ変数、手続きにはメソッドコンストラクタがあります。
オブジェクト指向プログラミングにおいて、クラスが重要な働きするので、しっかり覚えていきましょう。

まずはクラスの定義(書き方)から説明します。

クラスの基本形式

クラスのイメージ図

上の図のように書いてクラスを宣言します。
クラス名は、第3回のプログラム解説で、ファイル名と同じにすると説明しました。
これは、基本的にJavaでは、1つのファイルに1つのクラスを作るからです。
そこまで大きなプログラムを作らない場合には、1つのファイルに複数のクラスを作成していきます。
その時はmainが属しているクラス名をファイル名にして、その他のクラスはファイル名とは違う、分かりやすい名前にしましょう。

それでは、クラスの中身について説明します。
クラスの { } の中にメンバ変数、コンストラクタ、メソッドの3つの内容を定義します。
メンバ変数、メソッド、コンストラクタは必要なだけいくつでも定義できます。
また、クラスの中にメンバ変数だけ、メソッドだけ、コンストラクタだけを定義することもできます。
さらに、不要なら定義しないということも可能です。
まずは、クラスのイメージをつかみましょう。

[2] クラスを構成する要素

次にクラスを構成する要素を詳しく説明します。
クラスを構成しているのは、メンバ変数、コンストラクタ、メソッドです。
それでは、1つずつ説明していきます。

メンバ変数

まずは、クラスを構成する要素の1つ、メンバ変数についてです。 メンバ変数とはクラスが保持できるデータです。
int型、double型もしくはオブジェクト型などさまざまな型を保持できます。

メンバ変数の書式

データ型 メンバ変数;

普通の変数の宣言方法と同じように行います。

メソッド

次に、クラスの構成要素の2つ目を説明します。それはメソッドです。
メソッドとはクラスの機能を定義します。書き方は次の通りです。

メソッドの書式

戻り値 メソッド名(引数1, 引数2……){
    このメソッドの処理内容を記述
}

メソッドには基本的にC言語の関数と類似しており、引数と戻り値があります。
しかし、JavaのメソッドとC言語の関数は類似していても別物です。
今は詳しくは説明しません。少しずつ進めていくうちに理解できると思います。

コンストラクタ

最後はクラスを構成する要素のコンストラクタです。
実はコンストラクタもメソッドの1種なのですが、少し異なっている部分があります。
コンストラクタとはオブジェクトを生成したとき、自動的に呼び出される特殊なメソッドです。
基本的に、オブジェクトの初期化を行います。

コンストラクタの書式

クラス名(引数1, 引数2・・・){
    オブジェクトの初期化処理
}

コンストラクタは、特殊なメソッドだと書きましたが、通常のメソッドと違って戻り値はありません。
コンストラクタはオブジェクトの初期化を行うものなので、戻り値は必要ありません。
コンストラクタの名前はクラス名と同じにします。
引数はなくても構いません。ここは間違えないようにして下さい。
また、利用手順は特にありません。インスタンス化した時に自動的に行われます。

[3] クラスの作成

基本的な作り方は説明しました。
では、さっそくクラスを作成してみましょう。
ここでは、人間クラスを例にして作成します。

人間クラスの内容は?

どのような人間クラスを作成するかを決めます。
人間の情報として、名前、性別、年齢、出身地、性格等があります。
人間の動作として、話す、歩く、走る、寝ると様々なことがあります。
すべてを定義するのは大変なので、次の内容だけ定義します。

・名前
・年齢
・自己紹介をする

以上の3つにします。
次に、書き方を決めます。
クラスにはメンバ変数、コンストラクタ、メソッドの3つの内容を定義できると説明しました。

それぞれをどれにするのか決めなくてはなりません。
「名前」と「性別」は人間のデータ(情報)です。よって、メンバ変数になります。
名前は文字列なのでString型、性別は数値なのでint型にします。

「自己紹介をする」は人間の動作に当たります。これは、メソッドになります。
「自己紹介をする」の内容は「名前」と「年齢」を名乗ることにします。
ここまでで、3つの内容を以下のように割り振りました。

・名前(メンバ変数)
・年齢(メンバ変数)
・自己紹介をする(メソッド)

コンストラクタは使わないように思えますが、コンストラクタの働きは初期化です。
この例だと名前と性別の初期化に使います。

実際にプログラミングしてみる

クラスの定義方法が決まりました。
実際にソースに記述します。

人間クラスサンプルプログラム

class Human {
    // メンバ変数
    String name;
    int age;

     // コンストラクタ
     Human(String n, int a) {
        name = n;
        age = a;
    }

     // メソッド
     void introduce() {
        System.out.println("私の名前は" + name + "で年齢は" + age + "です。");
     }
}

人間クラスサンプルプログラムの解説

上で決めた内容をそのままクラスにしました。
classを作る時は、class クラス名{…}でした。
人間クラスを作るわけですから、わかりやすいように、Humanとしました。
次に名前と年齢の値をいれるメンバ変数を作成します。

String name;     //名前用
int age;            //年齢用

名前と年齢の「自己紹介をする」のはメソッドでした。
戻り値は必要がないのでvoid、「自己紹介をする」メソッドは分かりやすいように、introduceにします。

void introduce(){...}

引数もいらないので、何も記述は行いません。
コンストラクタについてですが、前にも説明した用のオブジェクト生成した時に実行されます。

Human (String n, int a){...}

関数のように引数を受取り、実行されます。
これで人間クラスを定義することができました。

[4] オブジェクト生成

ここまででクラスの定義ができました。
しかし、このままでは使うことができません。
定義の後はオブジェクト生成する必要があります。

オブジェクト生成とは

オブジェクトを生成することをインスタンス化といいます。
これを行うことにより定義したクラスを使うことができます。
インスタンス化する方法は次の通りです。

インスタンス化

クラス名 インスタンス名;                        // 変数の宣言(この時点ではオブジェクトはできていない)
インスタンス名 = new コンストラクタ名;     // オブジェクトができた

まとめて

クラス名 インスタンス名 = new コンストラクタ名;

と記述することもできます。

オブジェクト生成の説明

まず、作りたいクラスの変数を宣言します。

class Human {....}

そして、new演算子を使ってオブジェクトを生成します。
new演算子はオブジェクトを作るための演算子です。

Human human = new Human("taro",10);

このとき、作りたいクラスのコンストラクタを呼び出し、初期化も行っています。
上記の例では、オブジェクトHuman、「名前がtaro、年齢が10歳」が生成されます。

クラスをインスタンス化する

これまでに「クラス定義」と「オブジェクト生成」の基本的な説明は終了しました。
最後に、前に定義したHumanクラスをインスタンス化するプログラムを記述します。
そして、実際にクラスに定義したメソッドを実行してみましょう。
ファイル名「Java08_01.java」に以下のプログラムを記述して実行してください。

サンプルプログラム

public class Java08_01 {
     public static void main(String args[]) {
        // オブジェクトの生成
        Human human1 = new Human("太郎", 10);
        Human human2 = new Human("ホップ", 10);

        // 自己紹介をさせる
        human1.introduce();
        human2.introduce();
    }
}

// 人間クラス
class Human {
     // メンバ変数
    String name;
    int age;

    // コンストラクタ
    Human(String n, int a) {
        name = n;
        age = a;
    }

    // メソッドの定義
    void introduce() {
        System.out.println("私の名前は" + name + "で年齢は" + age + "です。");
    }
}

実行結果

Java08_01の実行結果

1つ説明を忘れていましたが、どちらのクラスを先に書いても問題ありません。
C言語ではmainの下に書く場合に宣言のみ行いましたが、Javaでは必要ありません。

メイン文より、2つのオブジェクト(人間)を生成します。
インスタンス化は以下のように書きました。

クラス名 インスタンス名 = new コンストラクタ

Humanクラスを元にインスタンスhuman1を生成します。

Human human1 = new Human("太郎", 10);

インスタンス化と同時にコンストラクタを実行し、その時引数として値を渡しています。

Human human1 = new Human("太郎", 10);

String n に太郎を渡し、int aに10を渡しています。
そして、コンストラクタの処理が実行されます。

name = n; //n(太郎)がnameに代入されます。
age = a; //a(10)がageに代入されます。

では、"ホップ"の場合はどうなのかというと、
同じようにnameに"ホップ"を代入して初期化しています。
でも、これだと同じ変数に代入していない?と思いますが、大丈夫です。
それは次のページで説明することにします。
そして、メソッドを呼び出して自己紹介をさせています。
メソッドの実行方法を説明していませんでした。メソッドを使うには

インスタンス名.メソッド名

となりますので、このプログラムでは、

human1.introduce();
human2.introduce();

これで、クラスの基本的な使い方は終了です。
少し分かりにくかったかもしれませんが、続けて練習をしていけば覚えていけるはずです。

これで終わりといいたいですが、クラスはまだまだ続きます。
次はカプセル化についてやります。言葉くらいは聞いたことがあるかもしれません。



第7回へ ページのトップへ 次のページへ