広告

■□■□■□■□■□■□■□■□■□■□■□■□■□■□■
                      2011年12月13日

   Java総合講座 - 初心者から達人へのパスポート
                 2009年11月開講コース 049号

                                セルゲイ・ランダウ
 バックナンバー: http://www.flsi.co.jp/Java_text/
■□■□■□■□■□■□■□■□■□■□■□■□■□■□■


-------------------------------------------------------
・現在、このメールマガジンは以下の2部構成になっています。
[1] 当初からのコース:vol.xxx(xxxは番号)が振られています。
   これは現在、中級レベルになっています。
[2] 2009年11月開講コース:xxx号(xxxは番号)が振られています。
   これは現在、初心者向けのレベルになっています。
・このメールマガジンは、画面を最大化して見てください。
小さな画面で見ていると、不適切な位置で行が切れてしまう
など、問題を起すことがあります。
・このメールマガジンに掲載されているソース・コード及び
文章は特に断らない限り、すべて筆者が著作権を所有してい
ます。また、これらのソース・コードは学習用のためだけに
提供しているものです。
-------------------------------------------------------


========================================================
◆ 01.データベースを使用するアプリケーションの開発(続き)
========================================================

TableModelOfEmployeeを作成したときにソース・コードを修正し忘れ
ていた所がありましたので、下に提示します。
EclipseでTableModelOfEmployeeのエディターを開いて修正しておい
てください。

修正する場所は、getValueAt()メソッドの中の

--------------------------------------------------------
case 3:
   return employee.getDateOfBirth().toString();
--------------------------------------------------------

の所です。
社員の生年月日を文字列に変換してString型の戻り値として返す
ためのコードですが、テスト用に仮に書いたコードを修正するの
を忘れてそのまま046号を発刊していました。
(これで、よくチェックせずに手抜きで発刊していることがバレ
バレですね。)
ここのtoString()というメソッドはCalendarオブジェクトを文字列
で表現するメソッドですが、テスト用(デバッグ用)の文字列を
返すだけです。
これを

--------------------------------------------------------
case 3:
   GregorianCalendar birthDay = employee.getDateOfBirth();
   return birthDay.get(Calendar.YEAR) + "/" + (birthDay.get(Calendar.MONTH) + 1)
            + "/" + birthDay.get(Calendar.DAY_OF_MONTH);
--------------------------------------------------------

のように書き換えてください。
(いつものことですが、必要なimport文はクラス名(例えばGregorianCalendar)
の入力時にCtrl+スペース・キーを押すことよって(忘れた人は007号等を参照)
自動入力させて下さい。)

これで、アプリケーションに適した形の文字列になります。
なお、上記のget(Calendar.YEAR)等のメソッドについては既に
007号等で説明済みですので、ここでは説明なしでも理解できる
ことと思います。



====================


さて前回は「更新」のページを作成す作る際に、各GUI部品を貼り付け
ながらわかりやすい変数名に変えていくように作業を行いました。

一方、「新規登録」のページや「検索」のページでは、変数名は自動的
に与えられた名前のままにしていてソース・コードを見ても何の変数名
かわかりずらいままになっています。

これらの変数名を後で変更する方法を説明しましょう。

まず一つの方法は、Eclipseの「リファクタリング」のメニューを使う
方法です。

例えば、「新規登録」のページの社員番号のJTextFieldの変数名は現状
ではjTextFieldになっていますが、これを変数の定義文から参照してい
る複数の箇所も含めて全て一挙に変更するには、以下のような操作をし
ましょう。

(1) ソース・コードの中のどれかのjTextFieldをクリックしてカーソル
を入れます。たとえば

--------------------------------------------------------
private JTextField getJTextField() {
   if (jTextField == null) {
      jTextField = new JTextField();
   }
   return jTextField;
}
--------------------------------------------------------

というコードの中の2行目のjTextFieldをクリックすることによって、
そこにカーソルを入れます。

(2) メニュー・バーの「リファクタリング」→「名前変更」を選択
します。

(3) カーソルを入れたjTextFieldを例えば、
jTextFieldEntryEmpNum
に書き換え、Enterキーを押します。

そうすると全てのjTextFieldが一挙にjTextFieldEntryEmpNumに書き換わ
ります。

┌補足─────────────────────────┐
「リファクタリング」メニューの「名前変更」は、「編集」メ
ニューの「検索/置換」で「すべて置換」を実行するのとは異な
りますます。
「すべて置換」の場合は、例えばフィールドの変数名とどこかの
メソッドの中で一時的に定義されている変数名がたまたま同じ名
前だった場合、そのフィールドも一時的な変数も全て名前が書き
換わってしまいますが、リファクタリングの名前変更ではたとえ
変数名が同じでも別の変数(たとえばフィールドと特定のメソッ
ド内だけで定義されている変数は別の変数)であれば名前を書き
換えません。
└───────────────────────────┘

さて、jTextFieldをjTextFieldEntryEmpNumに一挙に書き換えたのはいい
のですが、このフィールドに対するsetterメソッドやgetterメソッドの
名前は以前のままです。
たとえば、現在のソース・コードの中では、

--------------------------------------------------------
private JTextField getJTextField() {
   if (jTextFieldEntryEmpNum == null) {
      jTextFieldEntryEmpNum = new JTextField();
   }
   return jTextFieldEntryEmpNum;
}
--------------------------------------------------------

というふうにjTextFieldEntryEmpNumに対するgetterメソッドが定義
されていますが、このメソッド名のままではフィールドの変数名と
チグハグで、どのフィールドに対するgetterなのかわかりにくいです
から、フィールド名に合わせて名前を修正すべきです。
というわけで、以下のようにしてメソッド名も修正しましょう。

(4) ソース・コードの中(たとえば上記のソース・コードの1行目)で
getJTextFieldというメソッド名をクリックすることによってカーソル
を入れておきます。

(5) メニュー・バーの「リファクタリング」→「名前変更」を選択
します。

(6) カーソルを入れたgetJTextFieldを例えば、
getJTextFieldEntryEmpNum
に書き換え、Enterキーを押します。

そうするとgetJTextFieldが参照箇所(そのメソッドを呼び出して
いる箇所)も含めて全て一挙にgetJTextFieldEntryEmpNumに書き換わ
ります。

====================

ところが、この方法だと、フィールドとメソッドの両方を別々に変更
する必要がありますので、二度手間になりますね。


そこで、もう一つの方法として、WindowBuilder EditorのDesignビュー
を使って変数名を変更する方法も使ってみましょう。

例えば、「新規登録」のページの氏名のJTextFieldの変数名は現状
jTextField1になっていますが、これを以下の操作で変更しましょう。

(1) Designビューで「新規登録」のページの氏名のJTextFieldを
クリックします。

(2) Properties欄のVariableの値(現在jTextField1)を、例えば
jTextFieldEntryName
に書き換えます。

これは前回「更新」のページにGUI部品を貼り付けていたときに変数名
と書き換えたのと同じ方法ですが、この方法を使えばフィールド名だけ
でなく、そのアクセサー(accessor = setterやgetterの総称)のメソッ
ド名まで一挙に変更できるので、こちらのほうがお勧めです。

ちなみに現時点でソース・コードを見てみると

--------------------------------------------------------
private JTextField getJTextFieldEntryName() {
   if (jTextFieldEntryName == null) {
      jTextFieldEntryName = new JTextField();
   }
   return jTextFieldEntryName;
}
--------------------------------------------------------

のようにgetterメソッドの名前もフィールド名に合わせて自動変更
されていることがわかりますね。

ただし、GUI以外の部分(画面上に現れない部分)のソース・コードに
関してはこの方法では変更できませんので、先ほどの「リファクタリング」
メニューを使う方法を取ることになります。



====================


では、HumanResourceEntryPaneの「更新」のページのプログラミン
グの続きに入りましょう。

HumanResourceEntryPaneのDesignビューにおいて、「更新」のページ
を表示してください。


この「更新」のページでは、事前に「検索」のページでJTableの行が
選択されていたときにはその行のデータを「更新」のページに表示し、
選択されていなかったときには「更新」のページには(JComboBoxのリ
ストを除いて)何もデータを表示しないようにします。
今日は、そのためのプログラミングをしましょう。


実は、GUI部品(Component)が表示されるとComponentListenerという
イベント・リスナーのcomponentShown()メソッドが呼び出される
(ComponentEventがこのイベント・リスナーに通知される)という
仕組みがあります。

この仕組みを利用するためには、GUI部品(Component)のaddComponentListener()
というメソッドを使って、イベント・リスナー(ComponentListener)を
Componentに登録しておく必要があります。

したがって、「更新」のページ(すなわちjPanelUpdate)の
addComponentListener()メソッドでComponentListenerを登録し
ておき、そのComponentListenerのcomponentShown()メソッドに
は[「検索」のページでJTableの行が選択されていたときにはその行
のデータを「更新」のページに表示する]という処理を組み込んでお
けばよいということになります。


では、ここらへんのソース・コードの雛形をWindowBuilder(のDesignビュー)
の機能を使って、自動生成させましょう。

Designビューの画面の「更新」のページのjPanelUpdate(「以下を入力/
変更して下さい。」というJLabelの右側の灰色の余白部分あたり)を右クリッ
クし、「Add event handler」→「コンポーネント」→「componentShown」
を選択します。

そうすると、getJPanelUpdate()メソッドの中に

--------------------------------------------------------
jPanelUpdate.addComponentListener(new ComponentAdapter() {
   @Override
   public void componentShown(ComponentEvent e) {
   }
});
--------------------------------------------------------

というソース・コードが自動的に追加されたことがわかりますね。

┌補足─────────────────────────┐
ちなみに上記の自動生成されたソース・コードの中にある
@Overrideは「アノテーション(annotations)」と呼ばれるもの
の一種で、ソース・コードに付加的に何らかの注記情報を加える
ものです。
アノテーションについては、別の記事で詳しく書きますが、ここ
では、「@Overrideを指定すると、そのメソッドがスーパークラス
や(スーパー)インターフェースのメソッドをオーバーライドす
るものであることを主張することになり、実際にオーバーライド
しているかどうかを、Javaのコンパイラーがチェックしてくれる」
ということだけ頭に入れておいて下さい。
たとえば、上のcomponentShownというメソッド名を間違えて
componentShomnと書いたりするとコンパイラーがエラーを表示し
「new ComponentAdapter(){}のメソッドcomponentShomn(
ComponentEvent)はスーパータイプ・メソッドをオーバーライド
または実装する必要があります」と文句を言ってくれるので、
直ぐに気づきます。
└───────────────────────────┘

ComponentListenerはインターフェイスですが、このインターフェイス
を実装したComponentAdapterというクラスが用意されているので、この
クラスを使えば実装の手間が省けます。
(ComponentAdapterは009号のWindowAdapterと同様に、イベント・リス
ナーの実装を簡単にすることを目的として用意されているクラスです。)

ただし、ComponentAdapterは抽象クラスですので、そのままではインス
タンスを生成することはできません。サブクラスを定義するか、あるい
は無名クラスの形式でサブクラスのインスタンスを生成して使用する必要
があります。

そのために、上記の自動生成されたソース・コードでは、無名クラスの
形式でComponentAdapterのインスタンスを生成しており、同時にその場
でcomponentShown()メソッドを実装しています(実装しているといって
も中身は空っぽなので、{と}の間を自分で埋める必要があるが)。


ComponentListenerインターフェイスで定義されているメソッドは、
ComponentAdapterでは何もしない空のメソッドとして実装されており、
そのままでは何も処理してくれません。
実際に使用するにあたっては必要なメソッドを自分で実装してやる必要
があります。(逆に言うと、必要最小限のメソッドだけを自分で実装す
れば済むので、ComponentAdapterを使うと楽なのです。)

上記のソース・コードでは、componentShown()メソッドの雛形(stub)が
自動生成されているので、これを書き換えて望みの処理をするようにプ
ログラミングすればいいわけです。

ではこのcomponentShown()メソッドの雛形の{と}の間を以下のコードで
埋めてみてください。

--------------------------------------------------------
int selectedRow = getTable().getSelectedRow();
if (selectedRow != -1) {
   Employee anEmployee = (Employee) getTableModelOfEmployee().getEmployeeList().elementAt(selectedRow);
   getJTextFieldEmpNum().setText(Integer.toString(anEmployee.getEmployeeNumber()));
   getJTextFieldName().setText(anEmployee.getName());
   getJComboBoxEra().setSelectedIndex(4);  // 西暦のインデックス=4
   GregorianCalendar birthDay = anEmployee.getDateOfBirth();
   getJTextFieldYear().setText(Integer.toString(birthDay.get(Calendar.YEAR)));
   getJTextFieldMonth().setText(Integer.toString(birthDay.get(Calendar.MONTH) + 1));
   getJTextFieldDay().setText(Integer.toString(birthDay.get(Calendar.DAY_OF_MONTH)));
   int empNum = anEmployee.getDepartmentNumber();
   ComboBoxModelOfDepartment model = (ComboBoxModelOfDepartment) getJComboBoxDepart().getModel();
   for (int i = 0; i < model.getDepartmentList().size(); i++) {
      Department depart = (Department) model.getDepartmentList().elementAt(i);
      if (empNum == depart.getDepartmentNumber()) {
         getJComboBoxDepart().setSelectedIndex(i);
         getJComboBoxDepart().repaint();
      }
   }
}
--------------------------------------------------------

ここで、

--------------------------------------------------------
int selectedRow = getTable().getSelectedRow();
--------------------------------------------------------

のgetSelectedRow()はJTableの中で選択されている行の番号(インデックス)
を返すメソッドです。どの行も選択されていない場合は、戻り値は-1になり
ます。
そして、その下のコード

--------------------------------------------------------
if (selectedRow != -1) {
--------------------------------------------------------

によってJTableの中の行が選択されていることをチェックしています。
そして行が選択されている場合には、各テキスト・フィールドにその社員
のデータを設定したり、JComboBoxの該当する行を選択状態に設定すること
になります。

ここで、新しく出てきた構文

--------------------------------------------------------
for (int i = 0; i < model.getDepartmentList().size(); i++) {
--------------------------------------------------------

については、下の「文法解説」のコーナーを参照してください。


なお、最後の

--------------------------------------------------------
getJComboBoxDepart().repaint();
--------------------------------------------------------

のrepaint()メソッドはComponent(GUI部品)の画像を再描画させる
メソッドです。
ここでは、その前のコードで選択状態のインデックスを変更している
ので、画像上にそれを反映させるために再描画しています。

残りのコードは自力で理解できることと思います。

編集が終わったら、テスト(HumanResourceJFrameの実行)をして
期待した通りの動きをすることを確認してください。


では、今回はここまで。


(続く)



========================================================
◆ 02.文法解説 [演算子]、[for文]
========================================================

[演算子の優先順位]

たとえば、

z = 2 * y + x / 3 - 7

という式を考えると、掛け算や割り算を足し算や引き算よりも
先にするということは、数学の時間に習っていると思います。

このように演算子の実行には優先順位があります。

今まで説明してきたように演算子にはけっこう多くの種類がある
ので、すべての演算子の優先順位を覚えるのはけっこう大変です。

しかし、演算子の優先順位を覚えるよりも、先に実行したい部分
を括弧()で囲んで実行順序を明示したほうが確実です。

というわけで、演算子の優先順位は無理に覚える必要はありません。



その他、演算子や文法について詳しく知りたいときは、Javaの文法
の正式文書

http://java.sun.com/docs/books/jls/third_edition/html/j3TOC.html

をご覧ください。あるいは、

http://java.sun.com/docs/books/jls/index.html

から、PDF版などをダウンロードしておくといいかもしれません。
(なお、すべて皆さんの大好きな(?)英語で書かれています。)

演算子のお話は以上で終わりにします。


次は、プログラムの制御の流れ(control flow)の話です。

最初に今回登場したfor文について説明します。



[for文]

プログラムの中の各文は基本的には上から下に順に実行されますが、
if文やswitch文など特殊な構文によって、どの文を実行するかを制御
できることは以前にも述べました。

制御の流れ(control flow)を変えるための構文はif文やswitch文
以外にもいくつかあります。

たとえば、while文、すなわち

--------------------------------------------------------
while (論理式) {
   (実行したい文)
}
--------------------------------------------------------

という構文は、「論理式と書いた部分がtrueの値を返す間はブロック
({と}の間)を繰り返し実行する」という操作を表す、ということも
以前(024号で)述べました。

そして、このように、一連の処理が繰り返し実行されることを
「ループ(loop)」と呼ぶのでしたね。

ループはwhile以外にもいくつかあります。

今回は、for文を紹介します。

for文は、

--------------------------------------------------------
for (変数の初期設定; 条件(論理式); 変数の変更) {
   (実行したい文)
}
--------------------------------------------------------

という形式の構文で、条件の値がtrueの間はブロック({と}の間)を
繰り返し実行することになります。

処理の順序を細かく説明すると、

(1) 変数の初期設定が実行される。
(2) 条件(論理式)がtrueであれば、(実行したい文)が実行され、
  次に変数の変更が実行される。条件がfalseであれば、このfor文
  の実行は終了する。
(3) 以下、条件がtrueの間は(2)が繰り返される。

となります。

たとえば、

--------------------------------------------------------
for (int i = 0; i < 10; i++) {
   System.out.println("i = " + i);
   System.out.println("i * i = " + i * i);
   System.out.println("i * i + i = " + (i * i + i));
}
--------------------------------------------------------

とすると、

(1) iに0が代入される。
(2) i < 10がtrueであれば、
   System.out.println("i = " + i);
   System.out.println("i * i = " + i * i);
   System.out.println("i * i + i = " + (i * i + i));
 が実行され、次にi++が実行される(つまりiの値が1増える)。
 i < 10がfalseであれば、このfor文の実行は終了する。
(3) 以下、条件がtrueの間は(2)が繰り返される。

となります。
つまり、iが0から9まで増えながらコンソールに出力を繰り返すことに
なり、結果的にはコンソールに

i = 0
i * i = 0
i * i + i = 0
i = 1
i * i = 1
i * i + i = 2
i = 2
i * i = 4
i * i + i = 6
i = 3
i * i = 9
i * i + i = 12
  ・
  ・
(中略)
  ・
  ・
i = 9
i * i = 81
i * i + i = 90

が出力されることになります。


また、for文には拡張形式というのがあり、

--------------------------------------------------------
for (型 変数名 : 反復子を持つ型または配列の表現(変数など)) {
   (実行したい文)
}
--------------------------------------------------------

という構文になります。(この拡張形式はJDKの1.4以前では使用できません。
5.0以降で使用できます。)

┌注意─────────────────────────┐
JDKの1.4以前ではfor文の拡張形式がエラーになってしまいますから、
事前にEclipseのコンパイラーの設定をJDKの5.0以降に変更しておきま
しょう。

Eclipseのメニュー・バーから「ウインドウ」→「設定」を選択し、
「設定」ウインドウの左側の「Java」の中の「コンパイラー」を選択し、
右側の「コンパイラー準拠レベル」を「5.0」に変更し、「OK」ボタン
をクリックしてください。
「コンパイラー設定が変更されました。変更を有効にするには、再度
フル・ビルドを行う必要があります。ここでフル・ビルドを行いますか?」
というメッセージが表示されたら、「はい」ボタンをクリックしてくだ
さい。
これで、今までに作成した全ソース・コードがJDK5.0のレベルで再コン
パイルされます。

この設定作業は、Eclipseに内蔵されているコンパイラーに対して設定
を行うものですが、もちろんインストールしているJDKのバージョンに
合わせることが望ましいです。
(コンパイラー準拠レベルはプロジェクトごとに設定することも可能
ですが、ここでは一括してレベルを変更しました。)
└───────────────────────────┘

ここで反復子(iterator)を持つ型というのは、Iterableというインター
フェイスを実装した(入れ物の働きをする)クラスで、これまでに出て
きたクラスで例をあげるとVectorがその一つになりますが、詳しいこと
はまた後述します。

ここでは、Vectorと配列を例にあげて具体的に説明します。

まず、配列の例です。

--------------------------------------------------------
int [] a = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

for (int i : a) {
   System.out.println("i = " + i);
   System.out.println("i * i = " + i * i);
   System.out.println("i * i + i = " + (i * i + i));
}
--------------------------------------------------------
というプログラムだと、配列aの中の各要素(0から9まで)を先頭から
順番にiに割り当てて(実行したい文)を実行していくことになります。
結果的には、さきほどと同じく

i = 0
i * i = 0
i * i + i = 0
i = 1
i * i = 1
i * i + i = 2
i = 2
i * i = 4
i * i + i = 6
i = 3
i * i = 9
i * i + i = 12
  ・
  ・
(中略)
  ・
  ・
i = 9
i * i = 81
i * i + i = 90

がコンソールに出力されることになります。


次にVectorの例をあげます。

--------------------------------------------------------
Vector<String> aVector = new Vector<String>();
aVector.add("生麦生米生卵!");
aVector.add("東京特許許可局!");
aVector.add("隣の客はよく柿食う客だ!");

for (String str : aVector) {
   System.out.println(str);
   System.out.println(str + str);
   System.out.println(str + str + str);
}
--------------------------------------------------------
というプログラムだと、Vector型の変数aVectorの中の各要素(String)
を先頭から順番にstrに割り当てて(実行したい文)を実行していくこと
になります。最後の要素までたどり着いたらfor文の実行は終了します。
結果的には、

生麦生米生卵!
生麦生米生卵!生麦生米生卵!
生麦生米生卵!生麦生米生卵!生麦生米生卵!
東京特許許可局!
東京特許許可局!東京特許許可局!
東京特許許可局!東京特許許可局!東京特許許可局!
隣の客はよく柿食う客だ!
隣の客はよく柿食う客だ!隣の客はよく柿食う客だ!
隣の客はよく柿食う客だ!隣の客はよく柿食う客だ!隣の客はよく柿食う客だ!

がコンソールに出力されることになります。

なお、Vectorの要素の型を明示したいときは、上記のVector<String>
のように<>の間に要素の型を指定します。
通常は、この明示するやり方が推奨されます。
これまで要素の型を明示しないでVectorを使ってきましたが、明示して
おくと要素を取り出したときにその型の戻り値として取り出せるので、
キャストなどが不要になります(明示しないと戻り値がObject型になる
ので、その後、正しい型に変換するためにキャストする必要が生じる)。


(続く)



================================================
◆ 03.演習問題
================================================

上記のfor文の振る舞いを確認するために、下記のようなプログラムを作っ
て実行してみてください。

--------------------------------------------------------
import java.util.Vector;

public class ForLoopTest {

   public static void main(String[] args) {
      System.out.println("[Example 1]");
      for (int i = 0; i < 10; i++) {
            System.out.println("i = " + i);
            System.out.println("i * i = " + i * i);
            System.out.println("i * i + i = " + (i * i + i));
         }
     
      System.out.println("\n[Example 2]");
      int [] a = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

      for (int i: a) {
         System.out.println("i = " + i);
         System.out.println("i * i = " + i * i);
         System.out.println("i * i + i = " + (i * i + i));
      }
     
      System.out.println("\n[Example 3]");
      Vector<String> aVector = new Vector<String>();
      aVector.add("生麦生米生卵!");
      aVector.add("東京特許許可局!");
      aVector.add("隣の客はよく柿食う客だ!");

      for (String str : aVector) {
         System.out.println(str);
         System.out.println(str + str);
         System.out.println(str + str + str);
      }
   }
}
--------------------------------------------------------



================================================
◆ 04.前回の演習問題の答
================================================

2.
下記が解答例です。
メソッド名はplay()、このメソッドを含むクラス名はPlayerにして
おきました。
なお、main()メソッドはテストのために用意してあります。

--------------------------------------------------------
public class Player {
   public String play(int data) {
      String s = "";
      if ((data & 1) == 1) s += "ド";
      if ((data & 2) == 2) s += "レ";
      if ((data & 4) == 4) s += "ミ";
      if ((data & 8) == 8) s += "ファ";
      if ((data & 16) == 16) s += "ソ";
      if ((data & 32) == 32) s += "ラ";
      if ((data & 64) == 64) s += "シ";
      if ((data & 128) == 128) s += "ド";
      return s;
   }

   public static void main(String[] args) {
      Player player = new Player();
      int sound;
      sound = Byte.parseByte("00000001", 2);  // ド
      System.out.println(player.play(sound));
      sound = Byte.parseByte("00000010", 2);  // レ
      System.out.println(player.play(sound));
      sound = Byte.parseByte("00000100", 2);  // ミ
      System.out.println(player.play(sound));
      sound = Byte.parseByte("00001000", 2);  // ファ
      System.out.println(player.play(sound));
      sound = Byte.parseByte("00010000", 2);  // ソ
      System.out.println(player.play(sound));
      sound = Byte.parseByte("00100000", 2);  // ラ
      System.out.println(player.play(sound));
      sound = Byte.parseByte("01000000", 2);  // シ
      System.out.println(player.play(sound));
      sound = Byte.parseByte("00000011", 2);  // ドレ
      System.out.println(player.play(sound));
      sound = Byte.parseByte("00000111", 2);  // ドレミ
      System.out.println(player.play(sound));
      sound = Byte.parseByte("00010101", 2);  // ドミソ
      System.out.println(player.play(sound));
   }
}
--------------------------------------------------------

上記のmain()メソッドの中で使用しているByteのparseByte()という
メソッドは、文字列表現した数(第一引数)を第二引数に指定した
進数で解釈して数として読み込む働きをします。
(この第二引数は「基数」といって、二進数なら2、十進数なら10、
16進数なら16を指定する。)
このparseByte()メソッドは戻り値としてbyte型の数を返しますが、
上記のmain()メソッド内ではそれをint型のsoundという変数に代入
しているので、その代入の時点で暗黙の型変換が行われてint型に
なります。


(次回に続く。)



┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
★ホームページ:
      http://www.flsi.co.jp/Java_text/
★このメールマガジンは
     「まぐまぐ(http://www.mag2.com)」
 を利用して発行しています。
★バックナンバーは
      http://www.flsi.co.jp/Java_text/
 にあります。
★このメールマガジンの登録/解除は下記Webページでできます。
      http://www.mag2.com/m/0000193915.html
★このメールマガジンへの質問は下記Webページにて受け付けて
 います。わからない所がありましたら、どしどしと質問をお寄
 せください。
      http://www.flsi.co.jp/Java_text/
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

Copyright (C) 2011 Future Lifestyle Inc. 不許無断複製