クラスとインスタンス化(Java)
クラスとインスタンス
はじめに
Javaは「他のプログラム(=クラス)を寄せ集めて」プログラムを作成します。この「他のプログラム」の代表的なものがsunから配布されているJ2SDKに含まれている基本的なパッケージ群です。また、Web上ではオープンソースとして多くのプログラムが配布されています。こういった有名なオープンソースプロジェクトとしては「apacheプロジェクト」やそのサブプロジェクトである「Jakartaプロジェクト」などがあります。
「誰かが同じ機能を持つプログラムをもっているなら、自分ではつくるな」というのはひとつの定石です。これを「(プログラミングにおける)梃子の原理」といいます(JavaやLinuxに先駆けて、オープンな開発スタイルで発展したUnixについて用いられた言葉です)。Javaはこのように多くの人たちが作ったプログラムの上になりたっています。
ここでは、そういったクラスを使うときの方法について簡単に説明します。
サンプル
以下のサンプルコードを作成してください。package test.sample;
public class Sample001 {
public static void main(String[] args) {
String str;
str = new String("初めてのJava");
System.out.println(str);
}
}
それでは、これを実行してみてください。「初めてのjava」と出力されたと思います。
インスタンス化
インスタンス化とは、クラスを活性化することを意味します。上の例にstr = new String("初めてのJava");
という文がありますが、「new クラス名」というのが一般にクラスをインスタンス化するやりかたです(これを「ニューする」といったりします)。
クラスは、このように(誰かから)ニューされたとき、そのコンストラクタが呼び出されて、(相手から使用されるための)準備が整います。
一般にクラスはこのように「寝ている状態」から、「起こしてやらなければ」使うことができません。(クラスをインスタンス化する方法としては、new以外の方法も用意されています。したがって、他のクラスを使用する場合、「そのクラスのインスタンスを取得しなくてはならない」というのが正確な表現です)。
ここの例では(SDKにバンドルされている)java.lang.Stingクラスをインスタンス化したわけですが、コンストラクタとしては引数にStringをとるものが呼び出されます(”初めてのJava”というStringを引数にしてインスタンス化しているためです)。
メソッドは「メソッド名+引数」がシグナチャになる(つまり、クラス内でユニークになる)といいましたが、J2SE1.4.2のapiドキュメント(javadoc)でjava.lang.Stringクラスをみるとコンストラクタだけで11個も用意されていることがわかります。(このうちの2つは「depricated(非推奨)」となっていますので、バージョンアップ時になくなるかもしれません。
また、クラスやメソッドのなかにはstaticクラス、staticメソッドというものがあって、これらはインスタンス化しなくても使用可能です(ここでは、詳細な説明は省略します)。
JavaBeanを作ってみよう
それでは、今度は自分でJavaBeanを作って、それを使うJavaアプリケーションを作ってみましょう。まず、JavaBeanを作るパッケージは「test.basic.bean」とします。つぎに、Actorというクラスを作ってみます。
package test.basic.bean;
public class Actor {
private String action;
public Actor(){
this.action="宙返りをする";
}
public Actor(String str){
this.action=str;
}
public String getAction() {
return action;
}
public void setAction(String string) {
action = string;
}
public String action() {
return action;
}
}
これが、JavaBeanの基本形です(本当はJavaBeanにはSerializableをimplementsせよなどの規約があるので、正確にはJavaBeanと言ってはいけないかもしれません。最近ではこういったクラスをPlain Old Java Object=POJOと呼ぶようです)。
それでは、これについて簡単に説明します。
プロパティ
private String action
という部分は、このクラスのインスタンス変数を宣言しています。String型でactionと名前での宣言です。
可視性はprivateにしておくのが定石で、これをカプセル化といいます。
コンストラクタ
このクラスでは、サンプルとして2つのコンストラクタを用意しました。public Actor(){
this.action="宙返りをする";
}
public Actor(String str){
this.action=str;
}
がそれです。
前者は引数をとらないコンストラクタで「デフォルトのコンストラクタ」といいます。このコンストラクタでは、actionに「宙返りをする」という文字列をセットしています。actionのデフォルト値のセットという意味ですね。また「this」というのがくっついていますが、これは「このインスタンスの」という意味です(これは、Javaに継承という概念があるためですが、詳細は別途説明しようと思います)。デフォルトのコンストラクタはかならず実装するようにしておいてください。
2つめのコンストラクタは文字列を受け取って、それをactionにセットしています。
メソッド
このクラスには、まず、以下の2つのメソッドが実装されています。public String getAction() {
return action;
}
public void setAction(String string) {
action = string;
}
これは、プロパティーのゲッター、セッターという特別なメソッドです。プロパティーがprivateで宣言されていましたが、これらのメソッドの可視性はpublicになっています。これは、「プロパティ(action)を参照したり、値を入れたりするにはこれらのメソッドを通せ」ということを意味します。このようにJavaBeanのプロパティにアクセスする際には、セッター、ゲッターを通すというのが定石です。また、サーバーサイドJavaではJSPの中でJavaBeanを参照することがしばしばあります。この際にセッター、ゲッターがないとSyntaxエラーが発生したりします。ですので、プロパティには必ず、セッターとゲッターを用意する習慣をつけましょう。余談ですが、プロパティの可視性がprivateで、セッターがなく、コンストラクタでプロパティーがセットされるようなオブジェクトを「不変オブジェクト(一度インスタンス化されたら振る舞いをかえられないオブジェクト)」と呼ばれます。
もう一つのメソッドはaction()メソッドです。
public String action() {
return action;
}
これは単純にプロパティーをもどしていますが、このクラスはActorをあらわしていますので、それに「アクションをさせる」という意味で実装しておきましょう。このように「特性値(プロパティ)」と「それに基づいた手続き(アクション)」が一体になったものを、一般に「オブジェクト」といいます。以下では「オブジェクト」はこのようなJavaBean(POJO)を意味するものと思ってください。
Actorを使ってみよう
それでは、このActorを使うJavaアプリケーションを作ってみましょう。パッケージtest.basicにSample004というクラスを作りましょう。package test.basic;
import test.basic.bean.Actor;
public class Sample004 {
public static void main(String[] args) {
Actor actor;
String action;
// デフォルトのコンストラクタの呼び出し
actor = new Actor();
action = actor.action();
System.out.println(action);
// Stringを引数に持つコンストラクタの呼び出し
actor = new Actor("と思ったらころぶ");
action = actor.action();
System.out.println(action);
// プロパティーを変更する。
actor.setAction("おきあがる");
action = actor.action();
System.out.println(action);
}
}
ここでは、まず、先頭で「Actor actor;」という変数の宣言をしています。「変数」については、別途詳しく説明しますが、JavaBeanが「型」として宣言される点に注目しておいてください。また、「String action;」はJavaBeanからの戻り値を受け取るための場所です。
このプログラムでやっていることは至極簡単です。コメントにもかいてありますが、
- 「デフォルトのコンストラクタを呼び出してActorをインスタンス化し、action()させる(そして、それを表示する)」、
- 「引数を持つコンストラクタを呼び出してActorをインスタンス化し、action()させる(そして、それを表示する)」、
- 「インスタンス化済みのActorのactionプロパティーを変更して、action()させる(そして、それを表示する)」
です。インスタンス化されたActorはactorに格納されていますが、そのメソッドを呼び出すには、「actor.メソッド(引数)」とします。プロパティに直接アクセスするには「actor.action」としますが、Actor側でactionがprivate宣言されていますので、シンタックスエラーとなります。
それでは、このSample004を実行してみましょう。
宙返りをする
と思ったらころぶ
おきあがる
と(標準出力に)出力されたことと思います。
2007年02月23日(金) 16:32:25 Modified by wanderingse