Java のオブジェクト指向

Revised: Feb./20th/2003: Since: Dec./26th/2001

前のページでは、抽象的な説明が続きました。概念的、抽象的説明はイライラ感が募るので、ここらで実際のコードを見てみましょう。ここでは、実際にプログラミングするスキルを付けることを目的としているわけではなく、用語を説明することが目的です。実際のプログラミングの詳細にてついては、後続の章で説明します。

Java とオブジェクト指向

Java アプリケーションはパッケージの集合です。パッケージの構成要素(メンバ)には、クラスとインタフェースがあります。オブジェクト指向としては、インタフェースが重要な役割を果たすのですが、設計の最初の段階で本質的な要素はクラスになります。

クラスは既に説明したとおり、オブジェクトを生成するための雛形です。クラスのメンバで代表的なものは、フィールドとメソッドです。フィールドは変数のことで、属性、メンバ変数などとも呼ばれます。クラスのメンバには、他にも、オブジェクト生成時の初期化ロジックを記述するコンストラクタ、クラス内に記述するクラスである内部クラスなどがメンバとして含まれることができますが、それは追々説明します。

パッケージのメンバ
図:パッケージのメンバ

オブジェクト指向では、オブジェクトの機能は一つになるように絞り、一つのオブジェクトの属性やメソッドは外部から利用できないように隠蔽します。最低限度のメソッドだけを、外部から利用できるように公開し、このメソッドを介してオブジェクトは会話をします。不必要なメソッドを公開しすぎると、予想外の方法で使われる可能性が高くなるので、デバッグしにくく、障害に弱くなるのです。

公開されたメソッドは、オブジェクト間の会話の窓口、つまりインタフェースとなります。インタフェースとなるメソッドを宣言しておくものが、プログラムの構成要素となるインタフェースです。インタフェースを使うクラスは、そこにリストされているインタフェース・メソッドを、全て使えるようにしておかないとコンパイルを通りません。クラスがインタフェースを利用するということは、契約を結ぶようなものであり、契約した以上、その宣言されているメソッドを実装する義務を負うのです。

逆に言うと、クラスが契約しているインタフェースが分かれば、そのクラスでは、最低限度、インタフェースにリストされているメソッドが使えることが分かるわけです。つまり、一つのインタフェースを実装するクラスが複数あれば、それらのクラスから作ったオブジェクトに対しては、共通のメソッドで操作できるのです。それらのオブジェクトが共通のインタフェース (API) を持っているということですね。

オブジェクト指向の主役はオブジェクトであり、オブジェクトをつくるのは、クラスです。クラスの本質的な構成要素は、コンストラクタ、フィールド、メソッドです。本格的に勉強を始める前に、以上の話を簡単にまとめておきます。

サンプルコード

次に挙げるコードは、パッケージ test.my.demo に含まれるインタフェースとクラスを定義したものです。このクラスは、利用する側として、他のパッケージ java.math に含まれるクラス BigInteger を使っています。

// パッケージ名
package test.my.demo;
// 他のパッケージのクラスの利用宣言
import java.math.BigInteger;
// インタフェース
interface InterfaceDemo {
	public void setBalance(String x);
	public void printBalance();
}
// クラス
// インタフェース InterfaceDemo を実装
class ClassDemo implements InterfaceDemo {
	// メンバ変数
	private BigInteger balance;
	
	// メソッド
	public void setBalance(String x) {
		// オブジェクトの生成(インスタンス化)とメンバ変数への代入
		balance = new BigInteger(x);
	}
	// メソッド
	public void printBalance() {
		// System.out オブジェクトの println() メソッドの利用
		System.out.println(balance);
	}
}

クラス ClassDemo は、インタフェース InterfaceDemo を実装 (implements) するものとして記述されており、BigInteger 型の変数 balance を持ち、メソッドには setBlanace() と printBalance() を持っています。

setBalance() では、BigInteger 型オブジェクト balance を生成して、メンバの変数 balance に代入しています。

printBalance() では、変数 balance を出力しています。その際に、System クラスの out 変数に代入されているオブジェクトの println() メソッドを使っています。

ClassDemo クラスからオブジェクトを生成するには、次のコードを使います。このコードも、別のクラスの何らかのメソッド内に記述します。

// ClassDemo 型オブジェクト account の生成
ClassDemo account = new ClassDemo();
// account オブジェクトの setBalance() メソッドの利用
account.setBalance("10000");
// account オブジェクトのprintBalance() メソッドの利用
account.printBalance();


Copyright © 2002-2003 SUGAI, Manabu. All Rights Reserved.