|
|
クラスとは何か(About) |
H.Kamifuji . |
まずクラスというものはそもそも何なのかについて確認し、使い方の基本中の基本まで確認していきます。 当ページでは、Linux CentOS7 の Gnome で動作テストしています。 現在(2021/08)では、JDK-16.0.2 にアップされています。一部、上位互換について、見直しを行っていきます。 現在(2021/11)では、JDK-17.0.1 にアップされています。一部、上位互換について、見直しを行っていきます。 現在(2023/04)では、JDK-20.0.1 にアップされています。一部、上位互換について、見直しを行っていきます。 現在(2024/10)では、JDK-23 にアップされています。一部、上位互換について、見直しを行っていきます。 |
|
まずクラスとは何かについて見ておきましょう。Javaプログラム入門で使っていた各プログラムでもクラスは使っていました。 class test1 { .... }プログラムの一番外側に記述されていたもので、次のような規則で記述されています。 class クラス名{ .... }"class"の後にスペースを挟んでクラス名を付けます。そして"{"と"}"の間にそのクラスに関する記述を行います。 ではそもそもクラスと言うのは何かといいますと、何かを実行する物体の設計図のようなものです。何かを実行するというのは、例えば車であれば人を乗せて走りますし、テレビであれば放送を受信して画像と音を出すということを実行します。クラスというのはそれらの設計図と言うわけです。 設計図ですので、クラスの中には具体的に何をさせたいのかを記述していきます(また後で見ていきますが、1つ1つの何をさせたいかについてメソッドの形で記述していきます。メソッドについてはメソッドを使うを参照して下さい)。 その為、イメージ的には下記のような感じとなります。 設計図 車 { 車を動かす { .... } 車を止める { .... } ライトを付ける { .... } }クラスと言うのはこのような感じのものです。 |
前のページでクラスとは設計図だと書きましたが、車の設計図が人を乗せて走ってくれるわけではありません。実際に動かすためには設計図を元に実際に物体を作る必要があります。 クラスを元に実際に作った物をオブジェクトと呼んでいます。クラスから物体を作成するには"new"を使います。 クラス名 変数名 = new クラス名(引数);上記で記述した変数名というのが、作成したオブジェクトを認識するための名前となります。 例えば"Televison"と言うクラスがあった場合に、そのクラスからオブジェクトを作成するには下記のような記述となります。(引数が無い場合)。 Televison tv = new Television();又は次のようにも書く事ができます。 Televison tv; tv = new Television();クラスからオブジェクトを作成する記述の仕方は変数の宣言と同時に初期値を設定する記述と似ています。例えばStringクラスの変数を作成して、初期値を同時に代入する場合は下記のようにしていました。 String str = "abcde";上記は次のようにnewを使って記述することもできます。 String str = new String("abcde");このようにJavaのプログラムは、自分で設計したクラスや、既に用意されているクラスを元にしてオブジェクトを作成し、そのオブジェクトに色々な処理を行ってもらうように命令していくわけです。 また変数がいくつでも作成できたように、同じクラスを元にいくつでもオブジェクトを作成することが出来ます。これは1つの設計図から複数の物体を作れるのと同じことです。元になっている設計図(クラス)は同じであっても、そこから作成された物体(オブジェクト)はまったく別のものですので、それぞれ別々に動かすことができます。 Televison tv1; Televison tv2; tv1 = new Television(); tv2 = new Television();上記の場合で言えば、2台のテレビを作成してあります。1台のテレビで何か番組が映っていたとしても、もう1台のテレビはまったく別物ですので、別々に動作します。ただ、その元になっている設計図は同じということです。 クラスとオブジェクトの関係はこのような感じになっています。 |
では試しに複数のクラスを使ったプログラムを試してみましょう。 Javaプログラム入門で色々試していたサンプルプログラムは基本的に下記のような構成をしていました。 class ctest1 { public static void main(String args[]) { /* ここに色々プログラムを記述する */ } }場合によっては、他にメソッドなども定義していましたが、登場するクラスは1つだけでした。 では新しく「Television」というクラスを作成してみます。 class ctest1{ public static void main(String args[]){ /* ここに色々プログラムを記述する */ } } class Television{ int channelNo; void setChannel(int newChannelNo){ channelNo = newChannelNo; } void dispChannel(){ System.out.println("現在のチャンネルは " + chanelNo + " です"); } }新しいクラスは同じファイル内に記述されています。またTelevisonクラスには変数の「channelNo」と、メソッドとして「setChannel」メソッドと「dispChannel」メソッドが定義されています。 クラスとは何かを実行する設計図のようなものだと前に書いていますが、このTelevisionというクラスはテレビを受信して写しだすためのクラスです。このクラスには「チャンネルを合わせる」動作と、「現在のチャンネルを表示する」動作の2つの動作を表すメソッドが記述されています。またこのクラスから作成されるオブジェクトが現在のチャンネルを覚えておく為の変数が1つ用意されています。 このようにテレビを表す設計図であるTelevisonクラスを定義しましたので、今度はその設計図を元に実際の物体を作成します。 class ctest1{ public static void main(String args[]){ Television tv1 = new Television(); } } class Television{ int channelNo; void setChannel(int newChannelNo){ channelNo = newChannelNo; } void dispChannel(){ System.out.println("現在のチャンネルは " + chanelNo + " です"); } }これでTelevisionクラスを元にして1つの物体(オブジェクト)が作成されました。これは強いて言うならテレビが1台製造されたようなものです。では作成したテレビのチャンネルを「1」に設定し、それから現在設定されているチャンネルを表示させて見ましょう。 class ctest1{ public static void main(String args[]){ Television tv1 = new Television(); tv1.setChannel(1); tv1.dispChannel(); } } class Television{ int channelNo; void setChannel(int newChannelNo){ channelNo = newChannelNo; } void dispChannel(){ System.out.println("現在のチャンネルは " + channelNo + " です"); } }作成したオブジェクトに対して、その元になっているクラスで定義されているメソッドを実行させるには下記のように記述します。 オブジェクト名.メソッド名(引数);先ほどの場合であれば、下記の部分がそれに該当します。 tv1.setChannel(1); tv1.dispChannel();これは作成した物体に対してメソッドの形で記述された動作をさせているということになります。 また同じクラスを元に複数のオブジェクトを作成することも出来ます。それぞれは全然別のものになりますので、それぞれのオブジェクトが保存している値なども完全に独立しています。 ここで2つのテレビを作成してそれぞれチャンネルを表示させるサンプルを試して見ましょう。 サンプルプログラム下記のサンプルを実行してみよう。class ctest1{ public static void main(String args[]){ Television tv1 = new Television(); Television tv2 = new Television(); tv1.setPlace("居間"); tv2.setPlace("寝室"); tv1.setChannel(1); tv2.setChannel(8); tv1.dispChannel(); tv2.dispChannel(); } } class Television{ int channelNo; String place; void setChannel(int newChannelNo){ channelNo = newChannelNo; } void setPlace(String newPlace){ place = newPlace; } void dispChannel(){ System.out.println(place + "にあるテレビの現在のチャンネルは " + channelNo + " です"); } }上記のサンプルでは、それぞれのオブジェクトを識別するために、テレビが設置されている場所も内部で保存できるようにしてあります。実際に実行した結果は下記のようになります。 [xxxxxxxx@dddddddddd About]$ java ctest1 居間にあるテレビの現在のチャンネルは 1 です 寝室にあるテレビの現在のチャンネルは 8 です [xxxxxxxx@dddddddddd About]$クラスを使ったプログラムの記述は以上のようになります。細かい点はよく分からなくても現時点では構いませんので、こんなものなんだなと思っておいて下さい。 |
ではmainメソッドとクラスの関係について一度整理しておきましょう。 クラスを使ったプログラムの場合、クラスはあくまで設計図ですので、どこかでクラスを元にオブジェクトを作成して、オブジェクトに色々と指示をしてあげる必要があります。クラスのオブジェクトの作成は、別のクラスの中でも記述することは出来るのですが、その別のクラスのオブジェクトを作成する誰かが結局必要になります。つまり、まず最初にクラスとは関係無い誰かが最初に何かのクラスのオブジェクトを作成する必要があるわけです。 そこで使われるのがmainメソッドです。mainメソッドは『最初に呼ばれるメソッド』で記述した通り、プログラムを実行する時に最初に呼び出されるメソッドです。このメソッド内に他のクラスのオブジェクトを作成する記述をしておくことでプログラムは動作するわけです。 では前のページで使ったサンプルを見てください。 class ctest1{ public static void main(String args[]){ Television tv1 = new Television(); tv1.setChannel(1); tv1.dispChannel(); } } class Television{ int channelNo; void setChannel(int newChannelNo){ channelNo = newChannelNo; } void dispChannel(){ System.out.println("現在のチャンネルは " + channelNo + " です"); } }mainメソッドもクラスの中に記述されています。本当は下記のように書ければ一番分かりやすいです。 public static void main(String args[]){ Television tv1 = new Television(); tv1.setChannel(1); tv1.dispChannel(); } class Television{ int channelNo; void setChannel(int newChannelNo){ channelNo = newChannelNo; } void dispChannel(){ System.out.println("現在のチャンネルは " + channelNo + " です"); } }ただ上記のような書き方は、mainメソッドもメソッドの一種なので、メソッドはクラスの中にしか記述出来ないというルールがあり上記のような記述は行うことが出来ません。その為、特に使われないクラスを1つ用意してその中にmainメソッドを記述しているわけです。mainメソッドの外側にある「ctest1」というクラスは、誰もこのクラスを元にオブジェクトを作成していません。 このようにmainメソッドはある意味特殊なメソッドなわけなのですが、mainメソッドはどこかのクラスの中に記述してあればいいので、実は下記のように記述することが出来ます。 class Television{ int channelNo; void setChannel(int newChannelNo){ channelNo = newChannelNo; } void dispChannel(){ System.out.println("現在のチャンネルは " + channelNo + " です"); } public static void main(String args[]){ Television tv1 = new Television(); tv1.setChannel(1); tv1.dispChannel(); } }mainメソッドはどこかのクラスの中に記述されてあればいいわけですし、「ctest1」というクラスは実際に使っていないわけですから、「Television」というクラスだけを使い、その中にmainメソッドを書いてしまってもいいわけです。この場合、mainメソッドは「Television」クラスの中に記述されていますが、たまたまここに書いてあるだけで「Television」クラスとは何の関係もありません。 慣れてくればこのような書き方をした方が楽なのですが、この記述の方法だと「Television」クラスという設計図の中に、mainメソッドが含まれているクラスを元にオブジェクトを作成する記述があることなどから、混乱するかもしれないと思い別のクラスを1つ用意してmainメソッド書いてあります。 オブジェクト指向とmainメソッドの関係ちなみにJavaプログラム入門では、実行したいプログラムの内容をmainメソッド内に全て書いていました。mainメソッドは最初から用意されているメソッドなので、誰かがオブジェクトを作成したりといったことをしなくても、その中に書いてある処理を実行することが出来ます。Javaは本来オブジェクト指向と呼ばれているプログラム言語です。オブジェクト指向と言うのは、目的に応じてクラスを設計して、そこからオブジェクトを作成し、そのオブジェクトに動作をさせる、といった記述方法を行うものです。mainメソッドではオブジェクトを作成したり、そのオブジェクトに対して動作を指示させるのが本来の利用方法なのですが、簡単な処理だけのプログラムでわざわざクラスを設計するまでもない場合に、mainメソッド内で行いたい処理を全部記述させてしまっていたわけです。 staticメソッドについてmainメソッドが最初から存在しているメソッドであると書いてきましたが、これはプログラム内でわざわざ作成しなくても既に作成されているという意味になります。作成されなくても使えるわけではなく、プログラム開始時に何もしなくてもシステム側が作成してくれているということです。このように明示的に作成しなくてもプログラム開始時に作成されているメソッドのことをstaticメソッドと呼びます。mainメソッドをよく見てください。 public static void main(String args[]){ Television tv1 = new Television(); tv1.setChannel(1); tv1.dispChannel(); }メソッドの定義の際に、メソッド名を記述してある少し前の方に「static」という記述があることが分かると思います。この「static」という記述がある場合は、システム側でプログラム開始時に用意してくれるメソッドということになります。この「static」がついたメソッド内から他のメソッドを呼び出す場合には、その呼び出されるメソッドも「static」が付いている必要があります。その為、Javaプログラム入門で使っていたメソッドには全て「static」が付いていたはずです。 逆にクラスの中に記述され、いったんオブジェクトを作成されてから実行されるメソッドは、オブジェクトが作成された時点でメソッドが作成されればいいので、プログラム開始時から用意されている必要はありません。その為、「static」を付ける必要は無いわけです。 class Television{ int channelNo; void setChannel(int newChannelNo){ channelNo = newChannelNo; } void dispChannel(){ System.out.println("現在のチャンネルは " + channelNo + " です"); } }staticメソッドやstaticクラスといったものは、厳密に言うと少し違うのですが、イメージとしてはここで書いたようなことです。また別のところで詳しく記述してみたいと思いますので、なんとなくそんな感じなんだと思っておいて頂ければ結構です。 |
|