オブジェクトって何?
ここからはオブジェクトについて学びます。難しい概念を一度に理解しようとするより、まずは「人間」を表すHumanオブジェクトを作ってみましょう。設計図となるクラスを書き、newを使ってオブジェクトを作るところから始めます。
オブジェクト指向?
プログラミングを勉強している人なら、オブジェクト指向って聞いたことありますよね?
経験豊かなベテランさんでもオブジェクト指向というものの解釈は一筋縄ではいかないようなものらしいので、経験の浅い僕には正直、オブジェクト指向のことを語る程の経験も知識もございません。
ただし、オブジェクト指向の概念を語ることはできなくても、オブジェクトを作ることはできます。オブジェクト指向を理解する為にはオブジェクトというのはどういうもので、どうやって使うのか?をしっかり理解することが先決だと思います。
とりあえず難しいことは考えずにオブジェクトを作ってみましょう。
オブジェクトを作る為のクラス
「オブジェクト」というのは直訳すると「もの」です。非常に抽象的な言葉で、物理的な物体を表すこともあれば、そうでないこともあります。
今回はHumanオブジェクトを作ってみましょう。Humanつまり人間です。
Humanオブジェクトを作る為にHumanクラスを書きます。今までもクラスを書いてきましたよね。クラスの中のmainメソッドの中に、if文やfor文を使っていろんなプログラムを書いていました。
今までmainメソッドの中に何を書いていたかというと、これをこうして、あれをこうして・・という風に「手続き」を書いていました。今回は役割を見分けやすくするために、mainメソッドを書くクラスと、Humanオブジェクトの設計図となるクラスを分けて書きます。
どちらもJavaのクラスです。今回は使う役割を分けていますが、mainメソッドを持つクラスからオブジェクトを作ることもできます。必ず別のクラスにしなければならない、という決まりではありません。
ではHumanオブジェクトを作るためのHumanクラスを書いていきます。第1講で用意したIntelliJ IDEAのJavaプロジェクトを使いましょう。
srcにHumanというJavaクラスを作ります。この講座のコード例では、まずパッケージを指定せず、Human.javaと、後で作るHumanTest.javaを同じsrcの直下に置いて進めます。
オブジェクトを作るためのクラス(Humanクラス)にはmainメソッドは要りません。HumanクラスにはHumanオブジェクトがどういうものなのかを書いていきます。
まずは、Humanオブジェクトに「名前」というデータを持たせましょう。クラスの中で宣言するこうした変数をフィールド(メンバ変数)と言います。メソッドの引数とは別のものです。
Human.java
public class Human{
String name;
}「我輩は人間である。名前だけはある。」ってなもんで、名前しかありません。しかし、さすがに名前だけではちょっと寂しいので、Humanオブジェクトは生年月日も設定できるようにしましょう。人間なら誰でも生年月日がありますもんね。
Human.java
public class Human{
String name;
int birthday;
}できました。名前と生年月日をデータに持つ人間オブジェクトです。って言ってもデータに値が入っていませんね。さっそく入れましょう。
Human.java
public class Human{
String name = "ノブオ";
int birthday = 19770101;
}はい。これでノブオという名前の1977年1月1日生まれの人間オブジェクトの完成です。・・ってそうじゃないんです!!
オブジェクトを作るためにHumanクラスを書くんですが、それ自体がオブジェクトではないんです。クラスはあくまでオブジェクトの設計図でしかありません。
HumanクラスはいろんなHumanオブジェクトを作り出す為のテンプレートみたいなものなんです。クラス内に初期値を書くこと自体は問題ありません。その場合、newするたびに、その初期値を持つオブジェクトが作られます。ただし、今回は一人ひとりの名前と生年月日を後から設定したいので、まずはどんなデータを持つかという枠組みだけを書いておきます。
なので、データの値を書き込む前の形、
Human.java
public class Human{
String name;
int birthday;
}これで設計図としては完成です。ではこの設計図を元に実際にオブジェクトを作ります。
オブジェクトを作る
今回は、Humanクラスを使う側として、mainメソッドを持つHumanTestクラスを別に用意します。
この講座のプログラムはmainメソッドから実行が始まります。設計図を書いただけではHumanオブジェクトは作られません。そこで、mainメソッドに「Humanオブジェクトを作る」という処理を書いて実行します。
Human.javaと同じsrcの直下に、mainメソッドを持つHumanTestクラスを作りましょう。
Human.javaは設計図、HumanTest.javaはそれを使う処理を書くファイルです。パッケージを使っている場合は、両方を同じパッケージに置いてください。
HumanTest.java
public class HumanTest{
public static void main(String[] args){
}
}このHumanTestクラスのmainメソッドの中で、先ほど書いたHumanオブジェクトの設計図であるHumanクラスを使って、Humanオブジェクトを作ります。いいですかー?よく見ていて下さいよー。
HumanTest.java
public class HumanTest{
public static void main(String[] args){
Human human = new Human();
}
}はい出来ましたー。パチパチパチ・・。
実行するのはHumanTestのmainメソッドです。このコードにはprintlnがないので、実行しても文字は表示されませんが、Humanオブジェクトは作られています。
しかしこれ、初心者には「・・は?」となるところだと思います。やたら「human human」言われても意味分からん。って。大丈夫、ゆっくり解説します。非常に大事なところです。
クラス型変数
HumanTest.java
Human human = new Human();まず、理解しやすいように上記の1文を2つに分けます。
HumanTest.java
Human human;
human = new Human();この形、なんとなく見たことありますよね?そうです。変数の宣言と初期化です!宣言と初期化をつなげて書くと、一列で書けますよね?一列で書いた形が上のやつです。
HumanTest.java
Human human;↑これで、Human型のhumanという名前の変数を宣言しています。
HumanTest.java
int num;
String name;
Human human;↑これらは全く同じで、変数の宣言の形「変数型 変数名;」です。intやbooleanは基本データ型です。一方、StringやHumanはクラス型で、参照型の仲間です。Human型として宣言したhumanは、Humanオブジェクトへの参照を保持する変数です。
整数型、文字列型の変数があるように、Human型の変数を自分で勝手に作ってしまったわけです。名前と生年月日を持つのはHumanオブジェクトの方で、Human型の変数はそのオブジェクトを参照するために使います。
ここは大事です。「変数を宣言すること」と「オブジェクトを作ること」は別です。Human human;だけではオブジェクトはまだ作られません。
HumanTest.java
Human human;クラス型変数の型名はクラス名そのままです。クラス名の頭文字は大文字にしているので、型名も同じように頭文字は大文字です。
変数名は、ただの名前なので、別に「human」じゃなくても「nobuo」とかでもプログラム上問題ないです。
文字列を保持するString型の変数をこれまで普通に使ってきましたが、これもクラス型の変数です。String型の変数と、参照先のStringオブジェクトも別のものです。
→そもそもStringって何?
では、クラス型変数の宣言に続いて、「初期化」の部分です。
HumanTest.java
human = new Human();オブジェクトを作る時は、new演算子を使います。
new クラス名();の形でオブジェクトを作ります。このHumanクラスの場合、引数なしでnew Human()と書けます。後ろの( )はコンストラクタの呼び出しに対応しますが、詳しくは後の講で説明します。
new Human()で作ったオブジェクトへの参照を、変数humanに代入しています。これでhumanを通して、そのHumanオブジェクトを使えるようになります。
とりあえず簡単ではございますが、これでオブジェクトは作れました。何せ「new クラス名( );」とするだけなので。
しかしHumanオブジェクトを作ったはいいものの、実はまだこの人間オブジェクトには名前も生年月日も具体的には設定していません。
今回のように初期値を書かなかったインスタンスのフィールドには、既定値が入ります。nameはnull、birthdayは0です。人間の名前と生年月日としては、まだ意味のある値を設定していない状態ですね。
次回はこのHumanオブジェクトの名前と生年月日というデータを設定するにはどうすればいいかをやります。
とりあえず、設計図となるクラスを書いて、そのクラスをnewしてオブジェクトを作るという基本的な部分をまずは抑えておきましょう。
オブジェクトの説明はまだまだ続きがあります。仕組みもちょっと複雑なので全てを一度に理解するのは難しいです。なんとなくでいいので順を追って少しずつ理解していくのが一番の近道ですよ。
質問・コメント
読み込み中この記事についての質問や、学習して気づいたことをお寄せください。
この記事のコメント
旧サイトに寄せられたコメントも当時の投稿内容のまま掲載しています。現在の記事では変更している内容や、旧環境についてのやり取りも含まれます。
コメントを読み込んでいます。