クラス - みる会図書館


検索対象: UNIX MAGAZINE 2003年1月号
24件見つかりました。

1. UNIX MAGAZINE 2003年1月号

特集・プログラミング入門 それでは、ソースコードを詳しく見ていきましよう。順 番が逆になりますが、 TvExample クラスからです。 「 Java の言語井幻の節で説明したように、クラスは オプジェクトを作成するための芻旧杉です。オプジェクトを 使うには、クラスからオプジェクトを作成します。これを おこなっているのが、図 8 の 6 ~ 7 行目と 12 行目です。 6 TeIevision wega; new Te1evision(36) ; 7 wega new TeIevision(16) ; 12 Television aquos 6 行目では、 TeIevision クラスの型をもつ変数 wega を 旦暠しています。 7 行目では Television クラスからオプ ジェクトを作成し、 wega 変数にオプジェクトを割り当て ています。 12 行目は、同様な操作を 1 行にまとめて書いたもので す。どちらの書き方をしても結果に変わりはありません。 この行では、 TeIevision クラスから aquos オプジェクト を作成しています。 この文は、次の 3 つの部分から構成されています。 1.6 行目と 12 行目の、、 = " の左側 これは変数の亘暠部分です。変数は、使う前にどの型を もつのかを宣言しなければなりません。この 2 つの行 では、 Television 型の変数 wega と aquos を旦暠して います。 暠しただけでは、オプジェクトはまだ作成さ れません。 2.7 行目と 12 行目の、、 = " の右側 オプジェクトを作成しています。 new というキーワー ドは、 Java でオプジェクトを作成 ( インスタンスイりす るための new 演算子です。 3. new 演算子に続く Television(36) や Television(16) これらは、 Television クラスの、、コンストラクタ " と呼 はれる特別なメソッドを呼び出しています。コンストラ クタとは、オプジェクトを新しく作る際に期化するた めのメソッドです。ここでは、 wega オプジェクトは引 数 36 で、 aquos オプジェクトは引数 16 で初期化され ています。詳しくは、 Television クラスについて説明 するときにあわせてとりあげます。 C 十十言語を知っている人には、 Television wega; と書いてもオプジェクトカ吽成されないのは不思議に感し UNIX MAGAZINE 2003.1 るかもしれません。 C 十十ではこのように書けばオプジェ クトが生成されますが、 Java ではあくまでも変数を宣 しただけです。変数を宣言した時点では、変数の中身は空 のままです。この中身か空のものを、、 nu Ⅱ参照 " といいま す。変数がオプジェクトを指すようにするには、 new を 使って明カ勺にオプジェクトを作成し、それを変数に代入 する必要があります。 参照型 この例にあるように、 Java ではクラスも 1 つの型を 表します 9 。 int 型の変数を宣言するときは、、 int Ⅱ ; " の ように記述しますが、クラスの型の場合も、、 Television wega;" のように クラス型変数名 という形式で亘暠します。 このクラス型と宣言された変数は、どのような値をもっ ているのでしようか。オプジェクトはすべてメモリ参照 を用いてアクセスされるというのが、 Java の基本的な考 え方です。一方、系Ⅲムみ型の変数は実際の値尉寺してい ます。 これらの関係は、図 9 のように表せます。 クラス型の変数は、オプジェクトそのもの尉寺して いるのではなく、オプジェクトへの参照をイ尉寺しているわ けです。このように参照をイ寺している型のことを、、参照 型 " といいます。 コンストラクタ 今度は Television クラスのはうを見てみましよう。 図 7 の 1 行目がクラスの定義の始まりです。ここでは、 Television クラスを public 、つまりほかのクラスからも 利用できるように指定しています。 4 ~ 6 行目は、このクラスのデータを表す変数です。す べての変数が public と指定され、外部からアクセスする ことができます。 4 public int size 5 public int channel = 0 ; 6 public boolea れ power false; 9 ~ 11 行目は、このクラスのコンストラクタです。 Tv- Example クラスのほうでみたように、コンストラクタと 9 今回はとりあげませんが、 Java のインターフェイスペ d 列も型の 1 つ です。 101

2. UNIX MAGAZINE 2003年1月号

特集・プログラミング入門 図 5 C 十十の main 関数と Java の main メソッド ・ C 十十の main 関数の位置 / / クラスの定義 class F00 { / / クラスのデータや処理の定義 ・ Java の main メソッドの位置 / / クラスの定義 CIass F00 / / クラス F00 の内部の mai Ⅱ public static void main(String ロ args) { / / main 関数 i nt main (int argc , char** argv ) / / クラス F 。。を使う F00 f00 ; クラスとオフジェクトを使う 次の static は、この main メソッドがクラスメソッド であることを示しています。 static でない ( 通常の ) メソ プログラムの残りの部分 ( 図 2 では 8 行目 ) が、実際に ッドは、オプジェクトに対して適用されるものです。 1 っ プログラムに何かをおこなわせる部分です ( この例では、 のクラスから複数のオプジェクトを作成した場合、メソッ 文字列を表示させています ) 。 ドは各オプジェクトごとに適用されます。つまり、さきほ System というのは、 Java のライプラリで用意されて ど例に挙げた、、本 " クラスの場合であれは、、、、広辞苑 " の いるクラスの 1 つです。この System クラスには out と 冗むメソッドが対象とするのは、、広辞苑 " オプジェクト いう変数があります。変数にアクセスするには ( ピリ であり、、、 C 十十 Primer' の、、読む " メソッドが対象とす オド ) を使います。さらに、メソッドの呼出しにも . を るのは、、 C 十十 Primer" オプジェクトであるということ 使います。したがって、 になります。 System. out . println 一方、クラスメソッドは、クラス本に対する操作をお では、 System クラスの out 変数の println メソッドを こなうメソッドです。オプジェクトがいくつあっても、ク 呼び出していることになります。 println は、引数の文字 ラスに共通な処理をおこなう場合に使われます。上と同じ 列を出力するメソッドです。 例でいえば、むメソッドに static というキーワード メソッドを呼び出すときなど、文の末尾にはかならす が付いていると、、、広辞苑を読む " も、、 C 十十 Primer を ( セミコロン ) を付けます。 読む " も、どちらも、、本を読む " という処理とみなすよう Java では、習慣的にクラス名は大文字で、メソッドや なものです。 ma ⅲメソッドは、クラスメソッドであると 変数名などは小文字て始まるように書きます。これはあく 決められています。 まて習慣なので、メソッド名を大文字て始めたからといっ その次の void は、 main メソッドカ唳り値をもたない てコンパイルできなかったり、実行できなくなるわけで ことを示します。 はありません。しかし、このような習慣に従っていれば、 最後の、、 String[] args" は、、、コマンドライン引数 " と ほかの人が読むときにも分かりやすくなります。図 2 の いいます。そのプログラムを起測けるとき、パラメータを 場合も、 HelloWorld や System はクラス名、 main や 渡すことができます。 println はメソッド名だということが一一目で分かります。 たとえは、このフログラムを起動 - す - るときに Java は、フリー・フォーマットの言語です。つまり、 % j avac He110Wor1d myparam この例のソースコードのすべてを 1 行に書いても、あいだ に空白行を適当に挟んでも正しく動きます。ただし、これ と指定すると、 args 引数に myparam" という文字列が にも習慣的な書き方があります。これらの記法は、「 Code 渡されます。このイ督目みを使えは、 main メソッドて利用 Conventions for the Java Programming Language する値をプログラムの起重加寺に指定することができます。 ニ二ロ 95 UNIX MAGAZINE 2003.1

3. UNIX MAGAZINE 2003年1月号

特集・プログラミング入門 す。しかし、販売店てイ吏われるプログラムなら、車種や販 売価格、オフションパーツ、ボディカラーが必要になる かもしれません。どのような特徴を抽出するかは、目的に よって異なるのです。オプジェクト指向の既念では、モノ の描致を抽出することを、、抽象化 " といいます。 抽象化によって、モノの特徴を表す、、データ " を決めた ことになります。 今度は、処理について考えてみます。モノを対象とした 処理とは、さきほど抽象化した、、データ " に対して処理を おこなうということです。このように、モノを表す、、デー タ " とそれに対する、、処理 " をまとめて 1 つの部品として 扱えるようにすることを、オプジェクト指向の概念では 、カプセル化 " といい、この、、データ " と、、処理 " を 1 つ にまとめたもののことを、、オプジェクト " と呼びます。 のように 1 つにまとめておけは、、、これは ( CD のオプジェ クトで、このオプジェクトに対しておこなえる処理は xx です " というように、オプジェクトを部品として一括して 扱えるようになります。 Java では、、、クラス " を使ってこのオプジェクトを表現 します。クラスとは、データとデータに対する処理をまと めて定義した芻旧杉のようなものです。クラスはいわばクッ キーの抜き型のようなもので、たんに形を表しているだけ です。実際のフログラムでは、この抜き型で佃犲攵ものクッ キー生地を抜きながら利用することになります。この抜き 型で技かれたクッキー生地に相当するものを、、インスタン ス " と呼びます。 データは、整数や文字などで表されます。このデータ をイ焉寺しておくのが、、変数 " です。整数を表す変数を定義 すれは、その変数には整数を保存しておけるようになり ます。 変数は、プログラムでインスタンス尉寺しておくとき にも使います。インスタンスはクラスの型から作られたも のなので、これ尉寺する変数はそのクラスの型をもって いる必要があります。ハートの抜き型で抜いたクッキー生 地は、ダイヤモンド形のお皿に入れておくことはできませ ん ( はみ出したところか割れてしまうかもしれません ) 。 、、データに対する処理 " のことは、 Java では、、メソッド " クラス あるモノを表現するために、データと処理をまとめて記 述したもの。データとメソッドを含んでいる。オプジェ クトを作成する芻旧膨になる。 オフジェクト クラスのインスタンス。クラスの定義に従って作成され た変オプジェクトごとに内部のデータに値尉寺し たり、メソッドを呼び出したりできる。 変数 プログラムの実行とともに変化する値 &f 尉寺するもの。 データを表す整数のような値や、クラスをもとに作られ たオプジェクトなどを変数に入れておく。 メソッド あるデータに対する処理をまとめて言当したもの。 たとえは、、、テレビをつけて 1 チャンネルを選ぶ " とい う行動を Java のプログラムて表すとすると、 1. 、、テレピ " クラスを変数やメソッドを使って定義する 2. そこから、、 WEGA" や、、 AQUOS" というオプジェク トを作成する 3. 、、電源スイッチ " というメソッドに、、 ON" という命令 を送り、テレビの電源を入れる 4. 、、チャンネル " というメソッドに 1 という命令を送っ てチャンネルを変える のようになります。あるいは、 1. 、、本 " クラスを定義する 、、本を読む " であれは、 と呼びます。 いろいろな用語力咄てきたので、 おきましよう。 92 このあたりでまとめて 2. そこから、、広辞苑 " 、、 C 十十 Primer" 、、砂の本 " 5 とい うオプジェクトを作成する 3. 読むというメソッドを実行する となるでしよう。 このとき、、、広辞苑 " の、、読む " メソッドを呼び出して も、、、砂の本 " を読んだことにはなりません。、、本 " クラス であれは、たいていは、、読む " メソッドが必要でしよう。 しかし、あるオプジェクトの、、読む " を呼び出したとき は、、、本を読む " のではなく、、、広辞苑を読む " や、、 C 十十 Primer を読む " になります。プログラムに沿っていえは、 あるクラスからいろいろなオプジェクトを作り、そのオプ 5 広辞苑に説明は不要でしようが、これらはいすれも本の題名です。 UNIX MAGAZINE 2003.1

4. UNIX MAGAZINE 2003年1月号

特集・プログラミング入門 図 3 推奨されない " 磁皀を使った Java プロクラムのコンパイル % javac Simp1eExamp1e . java 注 : Simp1eExamp1e . java は推奨されない API を使用またはオーパーライドしています。 注 : 詳細については、—deprecation オプションを指定して再コンパイルしてください。 図 4 —deprecation オプションをキ諚してコンパイル % j avac —deprecation Simp1eExamp1e ・ j ava Simp1eExamp1e. java: 146 : 警告 : java. awt . Container の minimumSize() は推奨されません。 Dimension Sim = frame .1111111mumSize() ; 警告 1 個 javac でコンパイルに成功すると、標準ではソースファ イルと同じ場所にクラスファイル ( *. class ) が作られます。 これを別の場所に作りたいときは、 -d オプションを指定 します。 % javac —d bin Simp1eExamp1e . java 上の例では、 bin ディレクトリに SimpleExample. class というファイルが作成されます。 javac にどんなオフションがあるかは、—help オフショ ソースコードを見てみよう ンを指定すれば分かります。 94 ラスを定義するときは、 class というキーワードを使って 4 行目からクラスの定義カ始まっています。 Java でク クラスの定義 ン・コメント " と呼はれることもあります。 そのため、この形式のコメントは、、ドキュメンテーショ API のドキュメントも、これを利用して作られています。 動的に作成するために使われます。 Java に付属している いうコマンドを使って、プログラムのドキュメントを自 / * * と * / で囲んだコメントは特殊なもので、 javadoc と を記しておきます。 ん。普通は、ソースコードだけでは分かりにくい情報など イラによって解釈されないので、何を書いてもかまいませ という形式のコメントもあります。これらの部分はコンパ の / / 以降は Java のコメントです。もう 1 つ、 / * ・・ 1 ~ 3 行目の / * * と * / で囲まれた部分と、 8 行目の後半 コメント しよう。 こで、図 2 のコードをもうすこし詳しく見ていきま 次のように言当します。 class れ 07 れ e { 図 2 の例では、 HeIIoWorId という名前のクラスを定 義していることになります。この HelloWorld クラスに はデータはなく、 main という名前のメソッドが 1 つある だけです。 main メソッド どのプログラミング言語でも、フログラムがどこから始 まるかは決められています。 Java アプリケーションの場 合は、 main という名前のメソッドからプログラムが始ま ります。 C や C 十十言語でも main 関数からプログラムが 始まりますが、 Java では main メソッドはクラスの内部 にあります。同しクラスを使う C 十十言語では、 main 関 数はクラスの外側にあります。簡単に形式をくらべると、 図 5 のような感じになります。 C 十十言語にれている人は、最初のうちはちょっと妙 な感じかするかもしれませんが、このように書くものだと 憶えてしまいましよう。 Java の main メソッドは、かならす次のようなかたち をしています。 public static void main(String ロ args) public は、この main メソッドがどのオプジェクト からでもアクセスできることを表しています。 Java には、 どこからアクセスできるかを指定する、、アクセス孑日疋子 というものがあります。アクセス指定子には、 public の ほかに private 、 protected 、孑子なしなどの不鶤頁があ ります。 UNIX MAGAZINE 2003.1

5. UNIX MAGAZINE 2003年1月号

連載 /JavaServer Pages—@ は getClass() メソッドを使います。 getClass() はすべてのクラスの、、大親分 " である Ob- ject クラスで定義されているメソッドで、そのオプジェ クトがどのクラスかを表す Class クラスのオプジェクト を返します。 、、クラスと Class 、オプジェクトと Object か混然とし ていて何がなんだか分からない " という方がいるかもしれ ません。そこで、もっと手つ取り早くツ伶技 " てツ早し 0の . getC1ass ( ) . getName() ていただきましよう。 UNIX MAGAZINE 2003.1 parent . getC1ass ( ) スでは、 parent に null か薇正されるため、 2 番目の、 txt:dt タグの外側にカスタムタグがないケー Tag() メソッドの最後の行に制御が移ります。 は false を返すので、 if 文の中身は実イ子されす、 doStart- name. equals("text . DefinitionList") List " 以外の文字列か設定されます。したがって、 1 番目のケースでは、 name 変数に、、 text. Definition- 2. txt:dt タグの外側にカスタムタグがない。 1. txt:dt タグの外側に txt : dl 以汐 P ) カスタムタグがある。 きの動作は 2 通りに分かれます。 外側のタグハンドラが text. DefinitionList ではないと であれは EVAL-BODY-BUFFERED を返します。 ンドラの名則が成疋され、それが、、 text. DefinitionList" String 型の name 変数には、 parent の値であるタグハ return EVAL_BODY_BUFFERED ; if (name . equals ("text . DefinitionList") ) { String name = parent . getC1ass ( ) . getName ( ) ; いでしようか。 こまで分か川ま、次のコードの処理も分かるのではな java ・ lang. Number" カ亟されます。 lang. Nurnber クラスのオプジェクトの場合でも、文字列 返されます。また、タグとはまったく関係のない java ・ プジェクトであれば、文字列、、 text. DefinitionList" が たとえば、 0 りが図 1 の DefinitionList クラスのオ 始まる完全なクラス名を取得する呼出し方法です。 は、任意のオプジェクト。りについて、パッケージ名で を実行したときに NullPointerException 例外が発生し、 制御が、 catch (NuIIPointerException e) { } に移ります。 catch 節では特別な処理はしていないので、 そのまま doStartTag() メソッドの最後の行に制彳卸が移 ります。 けっきよく、どちらのケースでも、 return SKIP_BODY ; が実行されます。その結果、 JSP 工ンジンは txt:dt タグ の本体部分の処理をスキップします。 txt:dt の終了タグに対する里 DefinitionTerm クラスの doEndTag() メソッドのお もな仕事は、 JSP 工ンジンがタグハンドラのオプジェクト にこっそり保存しておいたタグの本体部分を取り出して、 プラウザに送ることです。 doEndTag() メソッドの処理 をみていきましよう。 ます、 String 型の bodystr 変数が空文字列 ( ' ' ' ' ) で初 期化されます。 String bodystr try { bodystr = getB0dyContent() . getString() + " く br>" } catch (NuIIP0interException e) { } でタグの本体部分を文字列として取り出し、 bodystr 変数 にセットします。このとき、リストとして表示させるため に、本体部分の後ろに改行を指示する <br 〉タグを付けて います。 このように、 txt:dl タグと txt:dt タグのネスティング が正しいときは bodystr 変数に txt:dt の本体の文字列が 設疋されるわけですが、正しくネスティングされていない ときはどうなるのでしようか。 doStartTag() メソッドで SKIP-BODY を返した場合について考えてみましよう。 JSP 工ンジンは SKIP-BODY が返されると本体部分 の処理をおこなわないので、タグの本体部分は保存されま せん。そのため、 getBodyContent() メソッドは null を getBodyContent ( ) . getString() 返します。すると、 79

6. UNIX MAGAZINE 2003年1月号

特集・プログラミング入門 1 2 3 4 5 int ロ prices ; new int [ 5 ] ; pnces fO て (int i prices[i] 0 ; i く 5 ; i + + ) { 100 ; 図 16 クラス型の配列 ・組込み型の場合 ・クラス型の場合 5 行目で、配列 prices の個々の要素に 100 という値を 代入しています。このように、配列の各要素にアクセスす るには、 prices [ をれ de 工 ] オプジェクトも指していないので、 Str ⅲ g オプジェクトの たとえは次のプログラムでは、 astr はまだどの String ているかはまだ決まっていません。 とができる変数として生成され、どのオプジェクトを指し aStr 変数は String オプジェクトへの参照を 2 つもっこ 合は実際に値を入れる場所も生成されます。上の例では、 う点です。さきほどの int の配列のように、糸ムみ型の場 生成した場合は、参照を入れる場所だけが生成されるとい このとき注意が必要なのは、クラス型の配列を new で aStr = new String [ 2 ] ; String ロ aStr; とができます。 たとえば、 String クラスの配列も同じように亘暠するこ もう 1 つ、クラス型の配列の例を挙げておきましよう。 となることに注意してください。 prices [ 4 ] prices [ 3 ] prices [ 2 ] prices[l] prices [ 0 ] として生成した配列の要素は、 prices = new intC5] ; ります。したがって、 配列の添字といいます。配列の添字はかならす 0 から始ま として要素の番号を指定します。この要素の番号のことを メソッド length を呼び出そうとしてもエラーになります。 prices[0] ー prices[l ] ー prices[2] ー prices[3] ー prices[4] ー astr[0] ー astr[l] ー まだオブジェクトを指していない new int [ 5 ] ; pnces prices [ 3 ] 100 ; / / 正しい astr = new String [ 2 ] ; System. out . println("length: " + astrC0] . length()) ; / / 間違い ! ! UNIX MAGAZINE 2003.1 この状態は、図 16 のように表せます。 クラス型の配列を生成したあとで、実際のオプジェクト を指すようにしなくてはいけません。もちろん、指し示す 先は既存のオプジェクトでも新たに生成したオプジェクト でもかまいません。新たに生成したオプジェクトを指すよ うにするには、 String ロ astr; new StringC2] , astr 0 ; i く 2 ; i + + ) { new String() ; for (int i astr [i] とします。この状態は、図 17 のように表せます。 配列の初期化 酉改に、作成と同時に初期化することも可能です。 int prices ロ = new int ロ = - { 10 , 20 , 30 , 40 , 50 } ; String ロ fruits new String ロ - { "App1e" , "Orange" このようにすれは、最初から値をもつ配列を作ることが できます。 配列は、 System クラスの arraycopy メソッドを使っ て配列の全体または一部をコピーすることができます。た とえば、上記の fruits の、、 ' ' Orange" " と、 ' ' Banana" を別の配列にコピーするには図 18 のようにします。 さらに、酉改」の配列 ( の配列の・・・・・・ ) を扱うこともでき ます。配列の配列を表すには、必要な数だけ、、 [ ] " を指定 します。 107

7. UNIX MAGAZINE 2003年1月号

特集・プログラミング入門 図 2 1 2 3 4 6 7 8 9 10 サンプル・プログラム Hello 、 Vorld. java * 最衫 Java アプリケーション class He110Wor1d public static void main(String ロ args) System. out . print1n("He110 Wor1d! " ) ; / / 文字を新する ジェクトごとに処理をおこなう ( メソッドを呼び出す ) と いうことです。 最初の J a アプリケ - ション ソースコードの作成、コンパイル、実行 イ云統に従い、画面に、 Hello World!" と表示する Java アプリケーションを作成してみることにしましよう。 ます、図 2 のファイルを作り、 HelloWorld. java とい う名前で保存します。ソースコードのファイル名は、 C や C 十十では任意に決められますが、 Java の場合には決まり があります。ここでは、とりあえす正確に HeIIoWorId. java という名前にしてください。大文字、小文字も厳密 に区別されます。 コンパイラを使う 次に、このソースコードをコンパイルしてみます。それ には、 javac (Java コンパイラ ) を次のように実行します。 % javac He110Wor1d. j ava コンパイルに成功すると、同しディレクトリに Hello- World. class という名前のファイルが作成されます。 のファイルは、かならすクラスと同じ名前になります。 れが Java の中間コードか書き込まれているファイルで、 、、クラスファイル " と呼ばれます。 クラスファイルを実行するには、 JVM である java を 使います。 % j ava He110Wor1d He110 Wor1d! java コマンドの引数に指定するとき、クラス名には拡 張子 (. class) を含めない点に注意してください。もし、 UNIX MAGAZINE 2003.1 Exception in thread "main" java. la 取 g ・ NoC1assDefFoundError : He110Wor1d というエラーになった場合は、 JVM が HelloWorld とい うクラスをみつけられなかったことを示しています ( 誌面 の都合上、で折り返しています。以羽司様 ) 。このメッ セージか表示されたときは、 CLASSPATH 竟変数か設 定されていないかを確認しましよう ( なお、ここて挙げる 例では CLASSPATH 環竟変数の設定はイです ) 。 Exception in thread 」 ava. lang ・ , NoC1assDefFoundError : He110WorId/cIass というエラーになった場合 CE の例との違いは最後の部分 だけです ) は、 java コマンドの引数に . class まて指定して いないかを石忍してください。 Javac のオプション javac や java には、いくつかのオフションカ甘旨定でき ます。 Java ではバージョンアッフの際に新たな機能やクラス が追加さオ L 、それにともなって、従来は使えたクラスやメ ソッドが、、推奨されない " ものとされることがあります。 たとえは、 javac でコンパイルしたときに、図 3 のよう なエラーメッセージが表示されたとします。 このメッセージだけでは、何が、、推奨されない " のかは 分かりません。そこで、もう 1 回 -deprecation オフショ ンを指定してコンパイルしてみます ( 図 4 ) 。 今度は、何カ雛奨されていないのかが詳しく分かりま す。代わりにどのメソッドを使うべきかは、 JavaAPI の リファレンス・マニュアノレで java. awt. Container. mini- mumSize() の部分を調べましよう。この例では、 mini- mumSize の代わりに getMinimumSize を使うと間題が 解決します。 93

8. UNIX MAGAZINE 2003年1月号

特集・プログラミング入門 図 9 糸ムみ型の変数とクラス型の変数 ・組込み型の場合 int X ・クラス型の場合 変数の宣 = 10 ; Television wega; オブジェクトの割当て wega = new Television(36); weg a .. n ⅶ参照 オブジェクトへの参照 wega SlZe channel power オブジェクト weg a いう特別なメソッドを用いてオプジェクトに初期値をケ えることができます。コンストラクタは、かならすクラス と同じ名前でなくてはなりません。引数は自由に決めるこ とができ、複数のコンストラクタを定義することも可能で す。 たとえは、 TeIevision クラスに size と power を指定 するコンストラクタを追加すると、次のようになります。 public TeIevision(int size) thiS . Size SIZe; / / もう 1 つのコンストラクタ public Te1evision(int size , thiS . Size SIZe; this . power = power; コンストラクタを利用すると、 オプジェクトカイれます。 カべージ・コレクション C 十十言語を知っている人は、 boolean power) このクラスの定義にデス いろいろな初期値をもつ 自重加勺に判断し、その領域を適当なタイミンクて解放して くれます。これをおこなナ欟冓が、、ガべ ン " です。 キーワード this ージ・コレクショ ソッドを呼び出しています。 8 行目と 13 行目では、それぞれのオプジェクトのメ TvExample の残りの部分を見てみましよう。 フィールドやメソッドへのアクセス ます。 に出てくる power は、 this. power と同じものを示してい 名前が違うので、明示的に this を書いていません。 メソッド on や。仕では、オプジェクトの変数と引数の ただの size は引数の size ということです。 す。つまり、 this. size はこのオプジェクトの変数の size 、 す this を使って明示的にどの size であるかを表していま トの変数である size の名前が同じなので、自分自身を表 このコンストラクタでは、引数の size と、オプジェク プジェクトを作成すれば自重加勺に設定されます。 っています。これは現在のオプジェクトを表す変数で、オ コンストラクタのなかで、、 this " というキーワードを使 トラクタがないことに気つ、くかもしれません。 C 十十のデ ストラクタとは、オプジェクトか削除されるときに呼び出 される特別なメソッド ( メンバー関数 ) のことです。 Java にはメモリの自動管理オ冓があるので、不要にな った領域は自重加勺に解放されます。 C の free や C 十十の delete のような演算子を用いてフログラムで明示的に解 放する必要はありません。システムが不要になった領域を 102 8 13 wega. 0Ⅱ(); aquos .0取() ; UNIX MAGAZINE 2003.1

9. UNIX MAGAZINE 2003年1月号

特集・プログラミング入門 「クラスとオプジェクトを使う」の項でちょっと触れたよ うに、オプジェクトのメソッドを呼び出すには . を使い ます。 9 行目と 14 行目では、オプジェクトのデータに値を直 接設疋しています。 9 wega ・ channel 14 aquos . channel channel 変数は public と指定されているため、 うに値を外部から直接設定することができます 10 文字列の結合 このよ 16 ~ 21 行目では、結果を確認するためにオプジェクト の変数の値を出力しています。 この部分では、 、、十 " を用いて変数の内容を出力してい ます。この十は足し算を表すものではなく、、、文字列の連 結 " を表します。十の左右どちらかに文字列がある場合は、 自重加勺に文字列の連結と認識されます。 たとえは、 16 行目では、、” WEGA: ” " という文字列に 続いて十カ甘旨定されているので、この十記号は文字列の連 結として働き、変数 wega. size の内容力蚊字列として出力 されます。テパッグ用に変数の値を確認するような場合、 変数の型などを意識する必要がなくてイ叫リな書き方です。 では、次のようなソースコードをコンパイルして実行し たら、どのような出力か得られるでしようか。 class App UNIX MAGAZINE 2003.1 public のメソッドをとおしてアクセスするようにすべきです。 変数に値を設定するときは "setChannel(int channel)" のような 来は、データは外部からアクセスできないように private と宣言し、 トの変数に妾アクセスできるのはあまりよいことではありません。本 10 ただし、クラスの言という観点からみると、このようにオプジェク なぜこのように出力されるかは、自分で考えてみてくだ 10 5 + 5 55 5 + 5 % java App 結果は次のようになります。 System. out . print1n()5 十 5 System. out. print1n()5 + 5 public static void main(String ロ args) 文字列を使う こまではとんど説明せすに使ってきた言葉に、、文字 列 " があります。文字列とは、連続した一漣の文字のこと です。 さきほど、「糸Ⅲムみ型」の項で char 型のリテラルについ て説明しました。 char 型のリテラルとは、 'A' や '\n' の ように、シングルクオートで囲んだ 1 文字からなるデータ を表すものでした 11 文字列のリテラルは、以下のように ( ダブルクオ ート ) で囲んだ一連の文字データとして表すことができ " sample " string ます。 char 型の います。 C や C 十十で文字列を扱う場合は、 すでにみたように、 1 つの文字は組込み型 char で扱 string\n' / / 空の文字列を表す文字列リテラル 11 '\n' は 2 文字あるように見えますが、これで 1 つの、、子コード " を クタを呼び出した場合とまったく同しです。 作成される strl オプジェクトは、明示的にコンストラ String strl sample string 方も許されています。 String クラスは頻繁に使われるため、次のような書き いる String オプジェクト strl が作成されます。 これで、、、” sample string ” " という文字列を一尉寺して String strl = new String("samp1e string") ; ンストラクタを new 演算子て呼び出します。 たオプジェクトの作成と同じ要領で、 String クラスのコ String オプジェクトを作成するには、さきほど説明し という利点があります。 String クラスに用意されている豊富なメソッドが使える おこないます。文字列を Str ⅲ g オプジェクトで扱うと、 のように配列を使うのではなく、メソッドを呼び出して して扱うのです。そのため、文字列の操作は、 C や C 十十 Java では文字列は系Ⅲムみ型 char ではなくオプジェクトと Java では、、 string オプジェクト " を使います。つまり、 配列 " という char 型を並べたようなものを使いますが、 表すので 1 文字とみなします。 103

10. UNIX MAGAZINE 2003年1月号

特集・プログラミング入門 図 17 クラス型の配列にオプジェクトを割り当てる オブジェクトを割り当てる astr[O] = new String(); astr[l ] = new String(); 図 18 配列のコピー 00t 。 [ 0 ] 亠 astr[l] 亠 St 「 ing オプジェクト astr[ 1 ] St 「 ing オブジェクト String ロ fruits2 = new String [ 2 ] ; 2 ) ; fruits2, System. arraycopy(fruits, / / Te1evision の配列の配列 ( 3X5 ) int ロロ aaint ; / / i Ⅱ t の配列の配列を表す変数 aai Ⅱ t の宣言 コピー元の配列 コピー元の配列のいくつ目の要素からコピーするか コピー先の配列 コピー先の配列のいくつ目の要素にコピーするか コピーする要素の個数 TeIevision[] ロ aatel = new TeIevision さらに学ぶべきこと Java のアプレットやサープレットを作る場合、文法的 り実際的なプログラムが作れるはすです。 イプラリが用意されています。これらをうまく使えは、よ り GUI を作成したりするものなど、しつにたくさんのラ えない大きな値を扱うクラスを集めたもの、日付を扱った シュテープルを表すクラス、あるいは int や long では扱 関する知識も不可欠です。 Java には、リスト構造やハッ また、 Java そのものの文法だけでなく、ライプラリに ラムを書くには、これらについての知識も欠かせません。 といった、文法十重要な機能があります。実用的なプログ ・例外 ・スレッド ・ノヾツウ - ーージ ' ・インターフェイス ・クラスの継承 Java には、これ以外にも、 ての Java の基本的機能の一部について解説しました。 今回は、 Java の概要、そしてプログラミング言語とし 108 にはここで説明した内容をそのまま活かせますが、それぞ れの作り方や生質も学ぶ必要があります。 はかの言語と同じく、 Java でプログラミングをする場 合も、デバッグの手法や作成するアプリケーションに関す る基本的な矢勧ゞ必要なのは当然です。 Java の開発工竟には、 jdb というテンヾッガが付属して います。このデバッガはそれはど強力ではありませんが、 プレークポイントの設疋、変数の出力、スレッドの確 ルし、 スタックトレースの表示など、デバッガの基本的な機能は もっています。デバッグ作業をおこなうときには、テパッ ガの利用法以外にもさまざまな知識が必要になりますが、 jdb の簡単な使い方を身につけておけは、ソースコードを 目で追いながら確認したり、変数の値を途中で表示させる よりも、はるかに早くかっ簡単に間題点をみつけられるよ うになります。 ☆ UNIX MAGAZINE 2003.1 ( なかやしき・きようこ ) すく、しかも十分な実用性を兼ね備えています。 オプジェクト指向言語として、 C 十十などよりも分かりや ものは思いきりよく捨てています。そのため、初めて学ぶ オプジェクト指向言語である C 十十と上交すると、不要な た。 Java 言語の特徴はそのシンプルなイ兼にあり、同し 今回は、 Java のごく基本的な環境や文法を紹介しまし