オブジェクト指向は非常に複雑な概念です。
Javaはオブジェクト指向の代表ともいわれます。このオブジェクト指向について基礎から説明していきたいと思います。
オブジェクト指向とは
オブジェクト指向 モノの作成・再現
- プログラム部品を組み合わせることでプログラム全体を作成
- プログラムを自動車に例えると…
- 自動車は様々な部品から構成される
- 車体・エンジン・タイヤ・ヘッドライト
- それぞれの部品の内部構造を知らなくても、組み合わせ方(使い方)が分かればよい。
例えばエンジンの詳しい構造は知らなくても、その組み立て方の仕様書に従って組み立てることは可能だということです。
つまり、オブジェクト指向とは1つ1つの部品を作り込んで、仕様書に従って部品を組み立てていくということです。
オブジェクトとクラス
- プログラムの部品=オブジェクトと考える
- オブジェクトがどのようなものか記述したものが「クラス(class)」
- Javaによるプログラミング=classを定義
上のコードは「こんにちは」を出力するためのプログラムです。冒頭にclassがついています。このクラスの定義の内容は「こんにちはを出力する」ことです。
オブジェクトは実際のモノでそれを実現するためには、プログラムを記述する必要があります。その記述の行為がclassを定義するということになります。
オブジェクト、クラスとインスタンス
- オブジェクト全てのモノや事柄(プログラムの部品)
- クラスオブジェクトに共通する属性(情報・機能)を抽象化したもの
- インスタンス具体的な個々のオブジェクト
クラスそのものはプログラムの中では扱いにくいので、この1つ1つのクラスを具現化して初めて、プログラムの中で使うことが可能となります。インスタンスは1個1個のオブジェクトだと思ってかまいません。
オブジェクト | クラス | インスタンス |
---|---|---|
プリウス、フィットなど | 自動車 | 我が家の自家用車、あの車 |
ドーベルマン、チワワなど | 犬 | 実家にいるポチ、隣の家のシロ |
日本人、フランス人など | 人 | 私、同級生の彼氏、私の母親 |
プリウスやフィットなどと聞けば、自動車の種類だとわかると思います。その自動車自体はプログラムの中で利用するのは難しいため、1つ1つ具現化してからプログラムで扱います。
演習問題
日常を見回して、クラスとインスタンスの関係で表されるものを考えてみましょう。
このようにクラスが1つあれば、インスタンスはいくつでもつくることができます。
簡単なクラスの宣言とインスタンスの生成
では実際のプログラムの中ではどのようにクラスとインスタンスを実現できるのでしょうか。
-
- 2次元の座標(x,y)を持つ「点」を扱うためのクラスは、次のように宣言する
- クラスの名前は自由に決められる
- xとyという名前のint型の変数をクラスの中に定義する。情報を表示する場所をフィールドという。フィールドは機能を持つ場所です。
- xとyという2つの値をセットにして扱える
演習問題
日常を見回して、クラスの定義をしてみましょう。
例
タイトル
著者
出版社
}
広さ
家賃
住所
}
インスタンスの生成
クラスの宣言はあくまでも一般化するためです。具体的に使う場合は具現化、1個の個体まで生成させる必要があります。なのでインスタンスの生成は必須となります。
インスタンスを生成する場合newを使用する
生成したインスタンスを後で参照するために変数に(参照を)代入する。
インスタンスそのままだと使えないので、後からその情報を参照するためには一度変数に代入します。参照を代入する。というのは上のpointクラスのインスタンスそのものではありません。変数pにはこのインスタンスが持っている情報を代入します。そして、この変数p の前にはその型を書きます。整数型であればint 少数型であればdoubleを書きます。
new Point()により座標(x,y)を格納するフィールドを持つPointクラスのインスタンスがコンピューターの中に生成されます。
クラスの宣言をする前には図の点は存在しません。クラスの宣言をし、インスタンスを生成して初めて図の点が具現化します。
インスタンスが持つ変数に値を代入できる。
p.x = 10;
p.y = 5;
インスタンス変数へのアクセス
- インスタンスが持つ変数(クラスのフィールドに定義された変数)のことを「インスタンス変数」という。
- Pointクラスでは変数xとyがインスタンス変数となる。
- インスタンス変数にアクセスするには
インスタンスを代入した変数+「.」+インスタンス変数名
とする。
例Point p = new Point();
p.x = 10;
変数pに10を代入する。
Pointクラスの使用例
実際のプログラムでどのように使用するのかをみていきましょう。
Javaプログラムではファイル名はメインクラス名と一致させなければなりません。
慣習としては単語の頭文字を大文字にします。
クラスの定義は最初に書くことが多いです。
インスタンスを2つ生成することで、点が2つ生成されるというわけです。
参照型
- Javaで使用できる変数の型
- ▶基本型(int,double,boolean)
- ▶参照型(インスタンスへの参照)
- 変数にインスタンスそのものは代入されない
基本型と参照型の違いは何かというと、入れるモノが違うということです。基本型であれば1や5などの数値などです。では参照型に入れるモノは何かというと先ほどのPointクラスであれば「p1」自体ではなく「p1」の持っている情報を変数pの箱に入れることになります。
参照の代入
Point p = new Point();
としたとき、変数pにはPointクラスのインスタンスの参照が代入される
演習問題
次のプログラムコードの意味を考えてみましょう
cat1 cat2のインスタンスの生成、文字列の代入までは問題なく理解できたと思います。
ではcat3について考えてみましょう。
cat3は新たにインスタンスは生成せず、cat2で生成されたインスタンスの中身をそのままcat3に入れます。
System.out.printlnでcat3のname変数の中身を出力します。
結局入力したのはcat2の中身なので出力されるのは「ミケ」です。
ここまでは問題ないと思います。
cat3のname変数を「ポチ」で上書きします。
この時点でcat3のname変数の出力結果は「ポチ」となります。
ただ質問はcat2を出力すると何が表示されるかということです。
まさに代入したのがインスタンス本体なのかインスタンスの持っている情報の参照なのかということです。
答えは「ポチ」が出力されます。
実際にプログラムを入力して確認してみてください。
参照の例
p1とp2の点を生成しました。p3は新たにインスタンスを生成させて代入するのではなく、p2に入っている情報をそのまま受け取ります。p1の箱には(x,y)=(0,0)の情報が入っており、p2の箱には(x,y)=(5,10)の情報が入っています。(情報自体は〇〇番地などどのような情報でも良い)p2とp3の箱のどちらの箱にも同じp2の情報が入っています。p2かp3のどちらかの情報を書き換えるとその情報自体が変わってしまいます。
参照の配列
基本型の配列と同じように、参照の配列も作成することができます。
変数は数字1つしか入れられませんが、大量に使う場合は配列を使うことができます。
[5]←には要素数、いくつ配列が必要かの数字をいれます。
イメージとしては、5つの配列の箱を一気に作るという感じです。
何も参照しないことを表すnull
参照型の変数に何も参照が入っていない状態をnullという
Point[] points = new Point[5];
points [0] = new Point();
points [1] = new Point();
points [2] = new Point();
このように5つの要素を入れて、3つの箱だけ用意します。points [3]とpoints [4]には何も代入されていません。生成されるインスタンスも3つだけなので何も入っていない箱が生成されます。これをnullといいます。
nullは参照型の値
nullは参照型の変数に代入できる
Point p;
p = null;
nullは参照型の変数の値と比較できる
Point p = new Point();
if(p == null) {
Sysytem.out.println( “pはnull” );
} else{
Sysytem.out.println( “pはnullではない” );
}
まとめ