前回はオブジェクト指向について、クラスの使い方について解説しました。
今回は自身でクラスを作成する方法について解説します。
フィールドのみのクラス作成
それでは、今度は自分でクラスを作ってみましょう。
クラスにはいろいろな「メンバ」(要素のこと)を入れることができるのですが、まずは「フィールド」を使用してみます。
フィールドには、今までの変数を使用できます。
intやcharなどの変数は非常に単純なので、これらのデータをいくつかまとめた大きなデータを作ることができます。
具体例を見てみましょう。
【フィールドのみを使ったクラスの例】
public class Human { String name; //フィールド int age; //フィールド double height; //フィールド }
ポイント!フィールド
クラスの要素として変数を宣言したものを特別にクラスのフィールドと言います。
これまで使ってきた変数と、宣言している場所が違うことに注意してください。
フィールドのみを使用した場合のクラスは非常に単純で、単にいくつかのデータをひとまとめにしたものです。
【作成したクラスの利用】
public class UseHuman { public static void main(String args[ ]) { Human taro = new Human( ); taro.name = "太郎"; //taroの名前 taro.age = 30; //taroの年齢 taro.height = 175.5; //taroの身長 System.out.println(taro.name); System.out.println(taro.age); System.out.println(taro.height); } }
ポイント!
今回のサンプルプログラムは実際にHumanクラスを使用したプログラムです。
Human.javaとUseHuman.javaの両方ともコンパイルする必要があるのは当然ですが、実行するのはUseHumanの方です。
Human.javaは今まで書いていたpublic static void mainがありません。
つまり、Humanクラスはアプリケーションとして独立して実行できません。
ただの部品であり、他のアプリケーションから使われるだけです。
実行結果
太郎 30 175.5
ポイント!フィールドへのアクセス
このアプリケーションでは今まで使用してきたStringクラスやjava.awt.Frameクラスと同様に、オリジナルのクラスであるHumanクラスを使用しています。
3行目でHumanのオブジェクトtaroをnewすると、3つのデータを保存するための領域が確保されます。
そのため、どのデータをどこに入れるのか、を指定しなければいけません。
具体的にはUseHumanの5行目~7行目がそれにあたり、
オブジェクト名.フィールド名
のようにピリオドで指定します。
ポイント!
ピリオドを「の」と読んでみると意味が分かりやすくなります。
taro 「の」 名前 taro 「の」 年齢 taro 「の」 身長
フィールドを利用したクラスはただ単にデータをまとめただけ、ということが確認できるでしょう。
フィールドとメソッドを持つクラス作成
前項の「フィールドのみのクラス」はオブジェクト指向ではありません。
データをまとめただけなので、オブジェクト指向ではない言語(C言語など)でも同じようなことができます。
しかし、クラスの特徴はこれからです。
クラスのメンバとしてメソッドも持たせることができます。
メソッドはこれまで出てきたものと大体同じです。
public class Human { String name; int age; double height; void abc( ){ //メソッドの処理 } void xyz( ){ //メソッドの処理 } //以下同様にフィールドやメソッドを並べていきます }
では、先ほどのクラスを変更してみましょう。
人間のクラスに名前や年齢、身長を持たせていたので、今度は「自己紹介する」という機能を追加してみます。
【フィールドとメソッドを持つクラスの作成と利用】
public class Human{ String name; int age; double height; void selfIntroduce( ){ System.out.println("私の名前は" + name + "です"); System.out.println("私の年齢は" + age + "です"); System.out.println("私の身長は" + height + "です"); } }
public class UseHuman{ public static void main(String args[ ]){ Human taro = new Human( ); taro.name = "太郎"; taro.age = 30; taro.height = 175.5; /* System.out.println(taro.name); System.out.println(taro.age); System.out.println(taro.height); */ taro.selfIntroduce( ); } }
実行結果(UseHumanクラスを実行します。)
私の名前は太郎です 私の年齢は30です 私の身長は175.5です
今回実行したのは、UseHumanです。
Humanクラスは機能が用意されていて、UseHumanから呼び出されて利用された形です。
それを踏まえてUseHuman.javaを見てみましょう。
3行目はインスタンスを生成しただけ、5行目~7行目まではデータを代入していただけなので、13行目のメソッド呼び出しだけでこの出力が得られました。
見方を変えると、オブジェクトtaroが自分から動いたように見えます。
mainメソッドはselfIntroduceというメソッドを呼んだだけで、データにアクセスする処理をしていません。
それを行っているのはHumanクラスです。
taro自らがデータにアクセスし、表示をするという処理を行っているのです。
ポイント!ソッドのアクセス
メソッドの使用はフィールドのときと同様にピリオドを使って行います。
オブジェクト名.メソッド名
ポイント!
メソッドにアクセスするときのピリオドは「が」と読んでみましょう。
taro 「が」 自己紹介
となります。
taroはただのデータではなく、自己紹介をする機能を持っていて自分から動作したと考えられるのです。
ポイント!メンバへのアクセスが持つ意味
オブジェクト名.メソッド名という書き方は、オブジェクト名.フィールド名という書き方とはまったく違う意味です。
両方ともメンバにアクセスしているという点においては変わりませんが、主語が違うというところがポイントです。
後者はtaroをただのデータの塊ととらえ、mainメソッドが内部にアクセスしています。
一方、前者の場合mainでは処理の依頼をしているだけで、処理内容はHumanクラス内に書いてあります。taroはただ単にデータを持っているだけではなく、機能も持っていて自分から動作することができるととらえることができるのです。
まとめ
フィールドとメソッド
- クラスのメンバとしてフィールドとメソッドを記述することができます。
- フィールドとメソッドは使ったときの意味が異なり、動作主体が変わってきます。
- アクセスにはともに、オブジェクト名.(ピリオド)を使います。
独学で挫折しそうになったら、オンラインプログラミングスクール