Java Step_6 オブジェクト指向


オブジェクト

オブジェクトとは「現実世界に存在するものや概念」をソフトウェア上に表現するものです。しかし、オブジェクトをそのままソフトウェア上に実装はできないので、そのオブジェクトをシステムで利用可能なように、「性質」「振る舞い」として定義します。

オブジェクト指向とは、「オブジェクト単位で考える」ということです。 周囲にはある多くのものは現実世界のオブジェクトといえます。例えば、人の性質は「名前や性別」であり、振る舞いには「歩く、喋る、眠る」などの動作があげられます。
現実世界のオブジェクトは、すべて「性質(状態)」と「振る舞い(動作)」という2つの特徴を持っていいます。
オブジェクト指向は、オブジェクトという単位を中心にして問題を分散化させて解決するプログラミング手法です。
プログラム全体を一人で開発するのではなく、部分ごとに専門家が開発した部品を利用して全体を作り上げます。 このように、機能ごとに部品を作り、内部を隠してしてしまうことを「カプセル化」と呼びます。 また、部品を使うプログラマーは、その部品の中身を変更することなく、少しだけ機能の異なった部品を新たに作り出すこともできる。これを「継承」と呼びます。

メッセージ

オブジェクトのメソッドを引き出すものを、オブジェクト指向の用語ではメッセージと呼びます。さまざまなオブジェクトがお互いにメッセージを交わしながら進行していく、というのがオブジェクト指向の考え方です。
Javaではメソッドを呼び出すことがメッセージの送信に当たります。

《メソッドの呼び出し》
オブジェクト.メソッド(引数,引数,…);

《フィールドの参照》
オブジェクト.フィールド;


クラスとインスタンス

オブジェクト指向のクラスは、オブジェクトの性質と振る舞いを決める設計図です。
「クラス」という設計図を基にしてオブジェクトの実体を作りますが、この実体をインスタンス(instance:実例)といいます。 同じクラスから作られたインスタンスは、同じフィールドとメソッドを持っています。
Javaでは、性質の要素をフィールド、振る舞いの要素をメソッドといいます。フィールドもメソッドも「カプセル化」されていて、ほかのオブジェクトから直接タッチすることはできません。

Javaには、多数のクラスがパッケージという状態で用意されています。
次のサンプルプログラムはパッケージにある「クラス」を使っています。

《パッケージとインスタンス生成のサンプル》

//日付と時間を表示するプログラム

import java.util.Date;//(1)-----------------パッケージのインポート

class Ima{
   public static void main(String args[]){
      Date now;//(2)-----------------------Dateクラス型の変数を宣言
      String nichiji;//(3)-----------------Stringクラス型の変数を宣言
      
      now = new Date();//(4)---------------Dateクラスのインスタンスを生成
      nichiji = now.toString();//(5)-------文字列に変換
      System.out.println(nichiji);//(6)----画面に表示
   }
}
《実行結果》


《解説》
  1. Javaには多数のクラスが用意されていますが、これらは求めてパッケージ(クラスライブラリ)という形で提供されています。これを利用するにはクラス定義より前にimportというキーワードを使って宣言します。
    import パッケージ名.*.;
    import パッケージ名.クラス名;
    import宣言をしておくと、そのクラスを利用するときにクラス名だけ書けばよくなります。
  2. クラスに用意されているフィールドやメソッドを使うためにはまず、実体であるインスタンスを作る必要があります。インスタンスも変数に入れることができます。ここでは、Dateクラス型のnowを宣言しています。
  3. Stringクラス型のnichijiを宣言しています。Stringクラスには、文字列の比較・検索・抽出・変換などのメソッドがあります。
  4. クラスからインスタンスを作るときには、new演算子とコンストラクタを使って、次のように記述します。
    クラス名 インスタンスを入れる変数名;
    インスタンスを入れる変数 = new コンストラクタ(引数);
    コンストラクタは、そのクラスで定義されているクラス名と同じ名前のメソッドです。new演算子と組み合わせて使い、そのクラスのインスタンスを作るという働きをします。
    Dateクラスは、インスタンスが生成されたときの時刻と日時のを取得するメソッドを持っています。
  5. 右辺でメソッドを呼び出しています。(「メッセージ」の「メソッドの呼び出し」を参照)
    Imaクラスのmainメソッドが、インスタンスnowに対して、toStringメソッドを実行するようにメッセージを送っています。
    toStringメソッドは、Dateオブジェクトを実行結果の表示形式に変換します。その結果はサ変のString型変数「nichiji」に代入しています。
Java のドキュメント

Java開発キッドには、「どのパッケージにどんなクラスが用意されているか?」などのドキュメントは付属していません。 JavaのホームページでJava 2 SDK,Standard Editionドキュメント」が公開されています。ただしすべてが和訳されているわけではありません。
JavaTM 2 Platform, Standard Edition

継 承
Javaがオブジェクト指向的言語を作ったのは、プログラム開発の効率化を重視したためです。オブジェクト指向型でないプログラミング言語では、新しいプログラムを作るときに何もない状態から作り始めなければなりません。
オブジェクト指向言語では、クラスという設計図を作ることによりプログラムされたことが蓄積して残ります。それを基にしてオブジェクトという部品を何度も使うことができるのです。

オブジェクト指向言語では、新しいクラスを定義するときに別のクラスの性質や振る舞いをそっくり受け継ぐことができます。これを継承と言います。Javaでは、既存のクラスを継承して新しいクラスを作成するときにはextendsというキーワードを使います。
class クラス名 extends スーパークラス名{

// 継承のサンプルプログラム
//スーパークラス
class MySuper{ 
  void asa(){
    System.out.println("親のクラスです");
  }
}

//サブクラス
class MySub extends MySuper{ //--------------------(1)
   void hiru(){
      System.out.println("子供のクラスです");
   }
}


//mainのクラス
class Keisyo{
   public static void main(String args[]){
      MySub ko = new MySub();//------------------- (2)
      ko.asa();//----------------------------------(3)
      ko.hiru();
      System.out.println("メインのクラスです");
   }
}
《実行結果》
《解説》
Keisyo.java の中には3つのクラスが定義されていますが、mainメソッドのあるクラスは1つだけです。このソースをコンパイルすると、「MySuper.class」「MySub.class」「Keisyo.class」の3つのクラスファイルができます。
  1. extendsを宣言したことで、クラスMySub がクラスMySuperのメソッドasaを継承します。これでクラスMySubにasaの定義を書かなくても書いたのと同じになります。
  2. mainメソッドの中で、MySub のインスタンスを生成しています。通常はほかのクラスのフィールドやメソッドを呼び出す前に、そのクラスのインスタンスを作らなければなりません。
  3. メソッドの呼び出しです。MySubクラスにはmorningメソッドは定義されていませんが、継承によってmorningメソッドが実行されます。