124
Java 入門 1 Java 入門 目次 《基本編》 1.プログラミング周辺の話題 2 2.Java による初めてのプログラミング 3 3.Java アプリケーションの構造 4 4.「Hello World」アプレット 8 5.Java アプレットの構造 10 【資料1】 ASCII コード一覧表 11 【資料2】 Java のインストール 12 《基礎編》 1:データの型と代入 13 2.クラス&メソッド 28 3.制御文&加減算・関係・論理演算子 38 4.制御文2&ビット演算 46 5.クラスの作成 56 《参考》外部入力部品の例 69 6.継承 70 7.インターフェースとパッケージ 85 8.例外 93 9.マルチスレッドプログラミング 105 《トピック編》 補足1:GUI プログラミング 114 補足2:ネットワーク・プログラミング(原始的なチャット) 116 補足3:Java のアサーション機能 122 生産情報システム技術科 福良 博史 2006.7.6() 改定6.1

Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

1

Java 入門

目次

《基本編》

1.プログラミング周辺の話題 2

2.Java による初めてのプログラミング 3

3.Java アプリケーションの構造 4

4.「Hello World」アプレット 8

5.Java アプレットの構造 10

【資料1】 ASCII コード一覧表 11

【資料2】 Java のインストール 12

《基礎編》

1:データの型と代入 13

2.クラス&メソッド 28

3.制御文&加減算・関係・論理演算子 38

4.制御文2&ビット演算 46

5.クラスの作成 56

《参考》外部入力部品の例 69

6.継承 70

7.インターフェースとパッケージ 85

8.例外 93

9.マルチスレッドプログラミング 105

《トピック編》

補足1:GUI プログラミング 114

補足2:ネットワーク・プログラミング(原始的なチャット) 116

補足3:Java のアサーション機能 122

生産情報システム技術科

福良 博史

2006.7.6(木) 改定6.1 版

Page 2: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

2

1.プログラミング周辺の話題

ハードウェアとソフトウェア

プログラミングとそのための言語

プログラミング言語と皆さんが通常考えている算数との違い

例1:以下の手順で a の値は、最終的に幾つになる?

a=5*2

b=7

a=a+b

ソフトウェアの設計/構造化プログラミング(Dijkstra)/オブジェクト指向(UML)

課題:1から10までの和を求めなさい。

注)「10まで」の条件を、「n まで」としたらどうする。

用語集

Program

Interpreter

Compiler

Assembler

Machine Language

Machine

Java 関連の用語

Java Virtual Machine

Java Compiler

Java Interpreter

Java の言語仕様を読むために

形式言語

BNF 記法とその拡張

終端記号(terminal)と非終端記号(non terminal)

例:if、int など 例:文、フィールド など

Page 3: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

3

2.Java による初めてのプログラミング

「Hello World」アプリケーション

以下の手順に従うと、スタンドアロンの Java アプリケーションを作成して使用する

ことができる。

手順1:Java ソースファイルの作成

ここで示す Java コードで HelloWorldApp.java と指定されたファイルを作成する。

注:Java は、大文字と小文字を区別するので注意してコードを書くこと。

手順2:ソースファイルのコンパイル

Java コンパイラを使用してソースファイルをコンパイルする。

DOS プロンプト( Windows XX ):

コンパイルが成功した場合、コンパイラは HelloWorldApp.class と指定されたファイルを

作成する。コンパイルが失敗した場合は、上記で示したように正確にプログラムを入力し

て指定しているかどうか確認する。

手順3:アプリケーションの実行

Java インタプリタを使用してプログラムを

実行する。

DOS プロンプト( Windows XX ):

注:Java インタープリタへの引数は

ファイル名ではなく、実行するクラス名になる。

「 Hello World!」が標準出力で表示されるの

が見られる。

javac HelloWorldApp.java

java HelloWorldApp

/** HelloWorldApp クラスは標準出力に「Hello World!」を表示

* するアプリケーションを実装する。

*/

class HelloWorldApp {

public static void main(String[] args) {

System.out.println("Hello World!"); //文字列を表示する。

}

}

Page 4: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

4

3.Java アプリケーションの構造

1)Java コードのコメント

Java 言語は3つの種類のコメントをサポートする。

/* テキスト */

コンパイラは /* から */ までのすべてを無視する。

/** 文書 */

これはドキュメント生成のためのコメントを示す。コンパイラは、 /* と */ を使用する

コメントを無視するのと同じように、この種類のコメントを無視する。JDK javadoc ツー

ルは、自動的に作成される文書を準備する時に、文書コメントを使用する。javadoc の詳

細については、Java ツールマニュアルを参照すること。

// テキスト

コンパイラは、 // から行の最後までを無視する。

2)クラスを定義する

Java 言語では、すべてのメソッド(関数)と変数がクラスあるいはオブジェクト(クラ

スのインスタンス)内に存在する。

現実の世界でのクラスの例としては、料理法が、考えられる。たとえば、「雑煮の料理法」

があるとする。あなたが料理した雑煮は「雑煮の料理法」における1つのインスタンスで

あり、私が料理したものは全く別のインスタンスである。(両方の雑煮は同じ「ルックアン

ドフィール」かもしれない、「匂いと味」も似ているかもしれない、しかし別の物である。)

/**

* HelloWorldApp クラスは標準出力に「Hello World!」を

* 表示するアプリケーションを実装する。

*/

//文字列を表示する。

/** HelloWorldApp クラスは標準出力に「Hello World!」を表示

* するアプリケーションを実装する。

*/

class HelloWorldApp {

public static void main(String[] args) {

System.out.println("Hello World!"); //文字列を表示する。

}

}

Page 5: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

5

3)main() メソッド

すべての Java アプリケーションの中枢部は、その main()メソッドである。 Java イン

タプリタでアプリケーションを実行する時は、実行したいクラス名を指定する。 インタプ

リタは、そのクラス内で定義した main()メソッドを起動する。main()メソッドは、プログ

ラムの流れを制御し、必要とされる資源を割り当て、アプリケーションのために機能性を

提供する他のメソッドを実行する。

すべての Java アプリケーションは、シグニチャが次のようになる main()メソッドを含ま

なくてはならない。

public static void main(String[] args)

main()メソッドのメソッドシグニチャには、3つの修飾子が含まれる。

public は、main()メソッドがどんなオブジェクトによってでも呼び出されることを表す。

static は main()メソッドがクラスメソッドであることを表す。

void は main()メソッドが値を返さないことを表す。

main() メソッドの呼び出し

Java 言語での main()メソッドは、C 言語と C++ の main()関数に類似している。Java イ

ンタプリタが(アプリケーションの制御するクラスを起動することによって)アプリケー

ションを実行すると、クラスの main()メソッドを呼び出して開始する。main()メソッドは、

アプリケーションを実行するように要求された他のすべてのメソッドを呼び出す。

もし main()メソッドを持っていないクラスで Java インタプリタを起動しようとすると、

インタプリタはプログラムの実行を拒否して、以下にのようなエラーメッセージを表示す

る。

Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld/App

/** HelloWorldApp クラスは標準出力に「Hello World!」を表示

* するアプリケーションを実装する。

*/

class HelloWorldApp {

public static void main(String[] args) {

System.out.println("Hello World!"); //文字列を表示する。

}

}

Page 6: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

6

main() メソッドの引数

次のコードの太字・下線部のように、 main()メソッドは、 Strings の配列というひと

つの引数を受け取る。

public static void main(String[] args)

この String の配列は、実行時システムがアプリケーションに情報を渡すメカニズムであ

る。 配列でのそれぞれの String は、コマンド行引数と呼ばれる。 コマンド行引数によ

ってユーザは再コンパイルせずに、アプリケーションの操作に影響を与えることができる。

注) Java 実行環境で main() メソッドに渡す引数の数と型は、C 言語や C++ の main()

関数に渡す引数の数と型とは異なる。

4)クラスとオブジェクトの使用

Java アプリケーションの他のコンポーネントは、アプリケーションを実装するために作

成した支援のオブジェクト、クラス、メソッド、および Java 言語文である。

「Hello World」アプリケーションは、何かを行うために作成する Java プログラムとして

は、ほぼ最も単純なものである。大変単純なプログラムなので、HelloWorldApp 以外のク

ラスは定義する必要がない。 しかし、作成されるたいていのプログラムはもっと複雑であ

り、他のクラスや補助の Java コードを作成する必要がある。

「Hello World」アプリケーションは、Java 環境で提供される別のクラス-System クラス

-を使用する。System クラスは、システムに依存する機能性に対し、システムに依存しな

いアクセスを提供する。System クラスの情報については、システム資源の使用を参照する

こと。

次のリストの太字・下線部のコードは、System クラスのクラス変数の使用方法とインスタ

ンスメソッドの使用方法を示す。

/** HelloWorldApp クラスは標準出力に「Hello World!」を表示

* するアプリケーションを実装する。

*/

class HelloWorldApp {

public static void main(String[] args) {

System.out.println("Hello World!"); //文字列を表示する。

}

}

Page 7: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

7

5)クラスメソッドまたは変数の使用

System.out.println("Hello World!");

構成要素 System.out は、System クラス内の out 変数のフルネームになる。アプリケー

ションは決して System クラスをインスタンス化せず、out はクラス名から直接参照され

ることに注意する。 これは、out がクラス変数であり、クラスのインスタンスよりも、む

しろクラスと関連づけられた変数であるためである。同様にメソッドをクラスと関連づけ

ることができる。これはクラスメソッドである。

クラス変数とメソッドを参照するためには、ピリオド( "." )でクラス名とクラスメソッ

ド名あるいはクラス変数名を結合する。

6)インスタンスメソッドまたは変数の使用

クラスメソッドあるいはクラス変数でないメソッドと変数は、インスタンスメソッドとイ

ンスタンス変数として知られている。インスタンスメソッドと変数を参照するためには、

オブジェクトからメソッドと変数を参照しなくてはならない。

System の out 変数は、クラス変数である一方、標準出力を実装する PrintStream クラス

(Java 開発環境で提供されたクラス)のインスタンスを参照する。

System クラスがアプリケーションにロードされると、PrintStream をインスタンス化して、

新規の PrintStream オブジェクトを out クラス変数に割り当てる。 これでクラスのイン

スタンスを持つことになるので、そのインスタンスメソッドを呼び出すことができる。

System.out.println("Hello World!");

見てわかるように、クラスメソッドや変数を参照する方法と同様にして、インスタンスメ

ソッドや変数を参照する。 ピリオド( ".")でオブジェクト参照(out)と、インスタン

スメソッド名あるいは変数(println)を結合する。

Java コンパイラにより、クラス、インスタンスメソッド、変数への参照を一緒に階層化す

ることができるので、結果としてプログラム例に現れるような構成要素になる。

System.out.println("Hello World!");

Page 8: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

8

4.「Hello World」アプレット

以下の手順にしたがうと、アプレットを作成して使用することができる。

手順1:Java ソースファイルの作成

次に示す Java コードを使用して HelloWorld.java と指定したファイルを作成する。

手順2:ソースファイルのコンパイル

Java コンパイラを使用してソースファイルをコンパイルする 。

コンパイルが成功する場合、コンパイラは HelloWorld.class と指定されたファイルを作

成する。コンパイルが失敗した場合は、上記で示したように正確にプログラムを入力して

名前を指定したかを確認する。

手順3:アプレットを含む HTML ファイルの作成

HelloWorld.class. を含む同じディレクトリで Hello.html と指定されたファイルを

作成する。この HTML ファイルは次のテキストを含む。

import java.applet.Applet;

import java.awt.Graphics;

public class HelloWorld extends Applet {

public void paint(Graphics g) {

g.drawString("Hello world!", 50, 25); //メッセージ

g.drawLine(0, 0, 50, 100); // 直線

g.drawRect(70, 70, 30, 10); // 四角形

g.drawOval(100, 100, 60, 10); // 楕円

}

}

<HTML>

<HEAD><TITLE> A Simple Program </TITLE></HEAD>

<BODY>

これは、私が造った初めての Java のアプレットです。

<APPLET CODE="HelloWorld.class" WIDTH=400 HEIGHT=200></APPLET>

</BODY>

</HTML>

Page 9: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

9

手順4:HTML ファイルのロード

Java アプレットを実行することができるアプリケーションに HTML ファイルをロード

する 。 このアプリケーションには、Java 互換のブラウザ、あるいは JDK で提供した

Applet ビューワーのような Java アプレット参照プログラムがある。 HTML ファイルをロ

ードするためには、一般的にアプリケーションとして作成した HTML ファイルの URL を伝

える必要がある。 例えば、ブラウザの URL あるいはロケーションフィールドに次のよう

なことを入力する。

うまくこれらの手順を完了すると、ブラウザウィンドウで見ることができる。

ブラウザの替わりに、Applet ビューワーを用いる場合は、コマンドラインから以下のよう

なことをする。

DOS コマンドプロンプト( Windows 等 ):

【実行結果の例】

file:c:/user/j/Hello.html

appletviewer Hello.html

Page 10: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

10

5.Java アプレットの構造

・アプレットの実行

アプレットは HTML ページに組み込まれなければならない。 <APPLET>タグを使用して、

(少なくとも)Applet サブクラスの位置とアプレットスクリーン上に表示するエリアの大

きさを指定する。 Java ブラウザが <APPLET>タグと出くわすと、アプレットのためにスク

リーン上のスペースを予約し、ブラウザが実行しているコンピュータ上に Applet サブク

ラスをロードし、 Applet サブクラスのインスタンスを作成する。 次に、ブラウザはアプ

レットの init()と start()メソッド を呼び出し、アプレットが実行する。

import java.applet.Applet;

import java.awt.Graphics;

public class HelloWorld extends Applet {

public void paint(Graphics g) {

g.drawString("Hello world!", 50, 25);

}

}

クラスとパッケージのインポート 最初の2つの行を無効にした場合は、次のようにコードの残

りの部分を変更(太字・下線部)した場合に限り、アプレッ

トをコンパイルして実行することができる。

public class HelloWorld extends java.applet.Applet {

public void paint(java.awt.Graphics g) {

g.drawString("Hello world!", 50, 25);

}

} Applet サブクラスの定義 多くの機能を継承する。

アプレットメソッドの実装 HelloWorld ア プ レ ッ ト は、

paint()メソッドを実装する。 すべてのアプレットが、少なくと

も init()、 start()、 paint()メソッ

ドのうちの一つを実装しなくては

ならない。 Java アプリケーションと異なり、アプレットは main()メソッドを実装する必要がない。

paint()メソッドに渡す Graphics オブジェクトは、アプレットのスクリー

ン上の描画コンテキストを表す。 Graphics drawString() メソッドの最初の引数は、スクリーン上に描かれる文字列である。2番目と3番目の引数は、

スクリーンの左下隅を表す( x ,y)座標である。 このアプレットは(50,25)の位置において文字列「Hello world!」を描く。 アプレットの座標系は(0,0)で始まり、これはアプレットの表示領域の左上隅である。

<APPLET CODE="HelloWorld.class" WIDTH=150 HEIGHT=25>

</APPLET>

Page 11: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

11

【資料1】 ASCII コード一覧表 上位 3ビット→ ↓下位 4ビット 0 1 2 3 4 5 6 7

0 NUL DLE SP 0 @ P ` p 1 SOH DC1 ! 1 A Q a q 2 STX DC2 " 2 B R b r 3 ETX DC3 # 3 C S c s 4 EOT DC4 $ 4 D T d t 5 ENQ NAC % 5 E U e u 6 ACK SYN & 6 F V f v 7 BEL ETB ' 7 G W g w

8 BS CAN ( 8 H X h x 9 HT EM ) 9 I Y i y A LF/NL SUB * : J Z j z B VT ESC + ; K [ k { C FF FS , < L ¥ l | D CR GS - = M ] m } E SO RS . > N ^ n ~ F SI US / ? O _ o DEL

制御符号

注:「OS 毎の改行コードの違い」 (1)Windows は、CR+LF

(2)UNIX は、LF (3)Mac は、CR

・NUL ヌル(空文字) ・SOH ヘディング開始 ・STX テキスト開始 ・ETX テキスト終了 ・EOT 伝送終了 ・ENQ 問い合わせ ・ACK 肯定応答 ・BEL ベル ・BS バックスペース ・HT 水平タブ ・LF/NL 復帰/改行 ・VT 垂直タブ ・FF 改ページ ・CR 復帰 ・SO シフトアウト ・SI シフトイン ・DLE データリンクでの拡張

・DC1 制御装置 1 ・DC2 制御装置 2 ・DC3 制御装置 3 ・DC4 制御装置 4 ・NAC 否定応答 ・SYN 同期文字 ・ETB 伝送ブロック終了 ・CAN 取消 ・EM 媒体終端 ・SUB 置換キャラクタ ・ESC (制御コード)拡張 ・FS ファイルセパレータ ・GS グループセパレータ ・RS レコードセパレータ ・US ユニットセパレータ ・SP (半角)スペース ・DEL 削除

Page 12: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

12

【資料2】 Java のインストール

j2sdk-1_4_2_04-windows-i586-p.exe または jdk-1_5_0_06-windows-i586-p.exe をダブルクリックし、あとは、NEXT、Yes などと答えていく。すべて選択する。 【確認】 ①C ドライブに、j2sdk1.4.2_04 というフォルダができている。 ②Dos のコマンドプロンプトから以下のコマンドを入力し、結果を確認

【環境変数の設定】 スタート⇒設定⇒コントロール・パネル⇒システム⇒詳細タグ⇒環境変数ボタン ⇒「システム環境変数」の PATH の追加編集,JAVA-MOME の追加

環境変数 値

PATH .;c:¥j2sdk1.4.2_04¥bin; 既存の PATH の先頭に追加

JAVA_HOME c:¥j2sdk1.4.2_04

注意! 1.5のバージョンからは、 C:”¥Program Files¥java¥・・・” となるので path 設定に気をつけて! コマンドプロンプトを立ち上げなおし 以下のsetコマンドで、 環境変数の設定内容を確認 (今度は、java –version として上記の確認が可能です)

C:¥>c:¥j2sdk1.4.2_04¥bin¥java.exe -version java version "1.4.2_04" Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_04-b05) Java HotSpot(TM) Client VM (build 1.4.2_04-b05, mixed mode) C:¥>

注意! 既存の定義をツブサナイで! 「;」「既存の定義・・・」

というように、最初に「既存の定義」の前に 「;」(セミコロン)を追加してから この Java 用の PATH を記述するほうが安全です。

C:¥>set ・・・ JAVA_HOME=c:¥j2sdk1.4.2_04 ・・・ Path=.;c:¥j2sdk1.4.2_04¥bin;C:¥WINNT¥system32;C:¥WINNT;C:¥WINNT¥System32¥Wbem;・・・

Page 13: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

13

1:データの型と代入

プリミティブ型及び値

プリミティブ型(primitive type) は,Java 言語によってあらかじめ決められており,そ

れに対して予約されたキーワードで名前付けする。

PrimitiveType:

NumericType

boolean

NumericType:

IntegralType

FloatingPointType

IntegralType: one of

byte short int long char

FloatingPointType: one of

float double

プリミティブ値は,他のプリミティブ値と状態を共有しない。型をプリミティブ型とする

変数は,常にそれと同じ型のプリミティブ値を保持する。プリミティブ型の変数の値は,

その変数に対する代入演算によってだけ変更できる。

数値型(numeric types) は,整数的な型及び浮動小数点型とする。

整数的な型(integral types) は,byte,short,int 及び long(それぞれ,8 ビット,16

ビット,32 ビット及び 64 ビットの 2 の補数符号付き整数),並びに char(Unicode 文字

を表す 16 ビット符号無し整数)に分ける。

浮動小数点型(floating-point types) は,float(32 ビット IEEE 754 浮動小数点数)及び

double(64 ビット IEEE 754 浮動小数点数)とする。

型 boolean は二つの値,true(真)及び false(偽),だけをとる。

整数的な型及び値

整数的な型の値は,次の範囲の整数とする。

byte -128 以上,127 以下

short -32768 以上,32767 以下

int -2147483648 以上,2147483647 以下

long -9223372036854775808 以上,9223372036854775807 以下

char '¥u0000' 以上,'¥uffff' 以下,すなわち,0 以上,65535 以下

1.ブロック構造 2.文と行の違い 3.文の改行位置の自由度 4.クラスに所属する変数とメソッド 5.フィールドとローカル変数の初期化 6.変数のスコープ 7.コンパイル・エラーに表示される行と 実行時の例外処理で表示される行の違い

Page 14: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

14

整数演算

Java は,整数的な値に作用する多くの演算子を提供する。

比較演算子。結果は,型 boolean の値になる。

o 数値比較演算子 <,<=,> 及び >=

o 数値等価演算子 == 及び !=

数値演算子。結果は,型 int 又は型 long になる。

o 単項符号演算子 + 及び -

o 乗除演算子 *,/ 及び %

o 加法演算子 + 及び -

o 増分演算子 ++,接頭語及び接尾語の両方。

o 減分演算子 --,接頭語及び接尾語の両方。

o 符号付き及び符号無しシフト演算子 <<,>> 及び >>>

o ビット単位補数演算子 ̃

o 整数ビット単位演算子 &,¦ 及び ^

条件演算子 ? : 。

キャスト演算子。ある整数値を,任意の指定した数値型の値へ変換することができ

る。

文字列連結演算子 +。String オペランド及び整数的オペランドを与えたとき,整

数的オペランドをその値を表す 10 進数表記の String に変換し,次にその二つの

String を連結した新しい文字列を生成する。

浮動小数点型及び値

浮動小数点型は,float 及び double とし,2 進数浮動小数点計算のための IEEE 規格(IEEE

Standard for Binary Floating-Point Arithmetic),ANSI/IEEE 規格 754-1985(IEEE, New

York)で規定する,単精度 32 ビット及び倍精度 64 ビット形式の IEEE 754 の値及び演算を

表現する。

IEEE 754 規格は,正負の符号及び大きさからなる数だけではなく,正及び負のゼロ,正及

び負の 無限大(infinities),並びに特別な Not-a-Number (以降 NaN と略す)を含む。

NaN 値は,ゼロをゼロで割るなどの特別な演算の結果を表すために使用する。float 及び

double 型の NaN 定数は,Float.NaN 及び Double.NaN として,定義する。

型 float の有限非ゼロ値の形式は, とする。ここで s は, +1 又は -1,m は,

未満の正整数とし,e は, -149 以上 104 以下の整数とする。m が正であるが 未満で

あって,e が -149 に等しい形式の値を,非正規化(denormalized) されているという。

Page 15: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

15

型 double の有限非ゼロ値の形式は, とする,ここで s は, +1 又は -1,m は,

未満の正整数であり,e は, -1075 以上 970 以下の整数とする。m が正であって 未

満及び e が -1075 に等しい形式の値を,非正規化(denormalized)されているという。

NaN を除いて,浮動小数点値は最小値から最大値に向かって,負の無限大,負の有限非ゼ

ロ値,負のゼロ,正のゼロ,正の有限非ゼロ値,及び正の無限大の順に 順序付ける(ordered)。

正のゼロと負のゼロの比較結果は,等しいとする。したがって,式 0.0==-0.0 の結果は

true に,0.0>-0.0 の結果は false になる。しかし,その他の演算は,正及び負のゼロを

区別する。例えば,1.0/0.0 は正の無限大の値をもつ。一方,1.0/-0.0 の値は負の無限大

とする。Math.min 及び Math.max 演算も,正のゼロ及び負のゼロを区別する。

NaN は,順序付けしない(unordered)。したがって,数値比較演算子 <,<=,> 及び >= は,

オペランドのいずれか又は両方が NaN のとき false を返す。どちらかのオペランドが NaN

ならば,等価演算子 == は false を返し,どちらかのオペランドが NaN ならば,非等価演

算子 != は true を返す。特に, x が NaN のときに限って,x!=x は true を, x 又は y

が NaN ならば,(x<y) ==!(x>=y) は false を返す。

浮動小数点型の任意の値は,任意の数値型へキャストしてよい。又は任意の数値型からキ

ャストされてもよい。浮動小数点型と型 boolean との間では,キャストできない。

浮動小数点演算

Java は,浮動小数点値に作用する演算子を多数提供する。

比較演算子。結果は,型 boolean の値になる。

o 数値比較演算子 <,<=,> 及び >=。

o 数値等価演算子 == 及び !=。

数値演算子。結果は,型 float 又は型 double になる。

o 単項符号演算子 + 及び -。

o 乗除演算子 *,/ 及び %。

o 加法演算子 + 及び -。

o 増分演算子 ++,接頭語及び接尾語の両方。

o 減分演算子 --,接頭語及び接尾語の両方。

条件演算子 ? :。

キャスト演算子。ある浮動小数点値を,任意の指定した数値型の値へ変換する。

文字列連結演算子 +。String オペランド及び浮動小数点オペランドを与えたとき,

浮動小数点オペランドを,その値を表す 10 進表現の文字列に情報の損失無しに変

換し,次にそれら二つの文字列を連結した新しい String を生成する。

Page 16: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

16

boolean 型 及び boolean 値

型 boolean は,リテラル true 及び false で示す二つの可能な値をもつ論理的な量を表す。

論理演算子には,次の種類がある。

関係演算子 == 及び !=。

論理補数演算子 !。

論理演算子 &,^ 及び ¦。

条件付き AND 及び条件付き OR 演算子 &&及び ¦¦。

条件演算子 ? :。

文字列連結演算子 +。String オペランド及び論理オペランドを与えたとき,論理

オペランドを String("true" 又は "false")に変換し,それから,二つの文字列を

連結した新しい String を生成する。

論理式は,いくつかの種類の文において制御フローを決定する。

if 文。

while 文。

do 文。

for 文。

boolean 式はまた,条件演算子 ? :において,どの副文を評価するかを決定する。

boolean 式だけが,条件演算子 ? : の最初のオペランド,及び制御フロー文内で使用でき

る。任意の非ゼロ値が true となる C 言語の慣習に従い,整数 x は,式 x!=0 によって

boolean に変換できる。null でない任意の参照が true となる C 言語の慣習に従い,オブ

ジェクト参照 obj は,式 obj!=null によって boolean に変換できる。

boolean 値の型 boolean へのキャストは許される。型 boolean に関する他のキャストは

許されない。boolean 値は,文字列変換によって文字列に変換できる。

Page 17: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

17

変数の初期の値

Java プログラムのすべての変数は,その値が使用される前に,値をもっていなければなら

ない。

個々のクラス変数,インスタンス変数又は配列構成要素は,それを生成するときに

デフォルト値(default value) に初期化する

o 型 byte については,デフォルト値はゼロ,すなわち (byte)0 とする。

o 型 short については,デフォルト値はゼロ,すなわち (short)0 とする。

o 型 int については,デフォルト値はゼロ,すなわち 0 とする。

o 型 long については,デフォルト値はゼロ,すなわち 0L とする。

o 型 float については,デフォルト値は正のゼロ,すなわち 0.0f とする。

o 型 double については,デフォルト値は正のゼロ,すなわち 0.0d とする。

o 型 char については,デフォルト値は空文字,すなわち '¥u0000' とする。

o 型 boolean については,デフォルト値は false とする。

o すべての参照型については,デフォルト値は null とする。

個々のメソッド仮引数は,そのメソッドの呼出し元が提供する対応する実引数値に

初期化される。

個々のコンストラクタ仮引数は,クラスインスタンス生成式又は明示的なコンスト

ラクタ呼出しが提供する,対応する実引数値に初期化される。

例外ハンドラ仮引数は,その例外を表している投げられたオブジェクトを初期値と

してもつ。

局所変数には,使用前に,初期化又は代入によって,明確な代入の規則を使ってコ

ンパイラが検証できる方法で,値を明示的に与えなければならない。

プリミティブ型の拡大変換

プリミティブ型における次の 19 個の変換をプリミティブ型の拡大変換(widening

primitive conversion) と呼ぶ。

byte から short,int,long,float,又は double への変換。

short から int,long,float,又は double への変換。

char から int,long,float,又は double への変換。

int から long,float,又は double への変換。

long から float 又は double への変換。

float から double への変換。

Page 18: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

18

プリミティブ型の拡大変換は,数値の全体としての大きさについての情報を失わない。実

際,整数の型から他の整数の型への拡大変換及び型 float から型 double への拡大変換は,

いかなる情報も失うことはない。つまり,数値を正確に保存する。int 若しくは long の

値から float への変換,又は long の値から double への変換は,精度の損失(loss of precision),すなわち値の最小位の数ビットを失なうことがある。この場合,浮動小数点

の結果値は,IEEE 754 直近へのまるめモードを利用して,正しく丸めた整数値とする。

プリミティブ型の縮小変換

プリミティブに関する次の23個の変換をプリミティブ型の縮小変換(narrowing primitive

conversion) と呼ぶ。

byte から char への変換。

short から byte 又は char への変換。

char から byte 又は short への変換。

int から byte,short 又は char への変換。

long から byte,short,char 又は int への変換。

float から byte,short,char,int 又は long への変換。

double から byte,short,char,int,long 又は float への変換。

縮小変換は,数値全体の大きさの情報を失うことがあり,さらに精度を失うこともある。

符号付き整数の整数型 T への縮小変換は,単に n 個,最小位ビット以外のすべての情報

を捨てる。ここで,n は,型 T を表現するのに使用するビット数とする。数値の大きさに

関する情報の損失の可能性に加えて,結果値の符号が,入力値の符号と異なってしまうこ

とがある。

同様にして,文字型から整数型 T への縮小変換は,単に n 個,最小位ビット以外のすべ

ての情報を捨てる。ここで n は,型 T を表現するのに使用するビット数とする。数値の

大きさに関する情報の損失の可能性に加えて,文字が 16 ビットの符号なし整数値を表わす

にもかかわらず,結果値が,負の数になることがある。

浮動小数点数から整数型 T への縮小変換は,二つの段階を踏む。

1. 第一段階では,浮動小数点数を,T が long ならば long に変換し,T が byte,

short,char 又は int ならば int に変換する。

o 浮動小数点数が NaN ならば,変換の第一段階の結果は,int 又は long の 0

とする。

o そうでないときには,浮動小数点数が無限大でなければ,浮動小数点数は,

IEEE 754 のゼロへ向かう丸めモードを使ってゼロの方向の整数値 V に丸

める。このとき次の二つの場合が存在する。

Page 19: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

19

T が long であって,この整数値が long で表現できれば,第一段

階の結果は, long の値 V とする。

そうでないときには,この整数値が int として表現できれば,第

一段階の結果は,int の値 V とする。

o そうでないときには,次の二つのいずれかが真でなければならない。

値が小さすぎる(膨大な負の値又は負の無限大)。第一段階の結果

は,型 int 又は型 long の最小表現可能値とする。

値が大きすぎる(膨大な正の値又は正の無限大)。第一段階の結果は,

型 int 又は型 long の最大表現可能値とする。

2. 第二段階は,次のとおりとする。

o T が int 又は long ならば,変換の結果は,第一段階の結果とする。

o T が byte,char 又は short ならば,変換の結果は,第一段階の結果の型

T への縮小変換の結果とする。

・剰余演算子 %

2 項 % 演算子は暗黙の除算によってオぺランドの剰余を生成する。左辺オぺランドは被

除数とし,右辺オぺランドは除数とする。

C 及び C++ では,剰余演算子は整数オぺランドだけを受け入れるが,Java で

は浮動小数点のオペランドも受け入れる。

剰余演算は,(a/b)*b+(a%b) が a に等しいとする結果を生成する。この恒等式は,

被除数をその型に対する可能な最大の大きさの負数とするとき,及び除数が -1

(剰余は 0)のときの特別な場合においても成立する。この規則から次のこと

がいえる。剰余演算の結果は,被除数が負のときにだけ負とでき,被除数が正

のときにだけ正とできる。さらに,結果の大きさは常に除数の大きさより小さ

い。整数の剰余演算子に対する除数の値が 0ならば,ArithmeticExceptionが投げら

れる。

《参考》Excel の場合の MOD 関数は、以下の通り

MOD(n,d)=n-d*INT(n/d) を満足するようになっている

例: MOD(10,-4)=-2・・・10-(-4)*INT(10/-4)=10-(-4)*(-3)=10-12

Page 20: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

20

【練習 1】 class L0101 { //出力時の改行はどこで行われるか? public static void main(String args[]) { System.out.print("こんにちは!"); System.out.println("皆さん"); System.out.println("お茶を飲みましょう"); } } 【練習 2】 class L0102 { //このプログラムを正しく動かすには? public static void main(String args[]) { String s1; String s2="私は誰?"; System.out.println(s1); } } 【練習 3】 class L0103 { public static void main(String args[]) { float weight; weight = 89.5f; System.out.print("体重は、"); System.out.print(weight); System.out.println("Kg です"); } }

C:¥user¥java>javac L0101.java C:¥user¥java>java L0101 こんにちは!皆さん お茶を飲みましょう C:¥user¥java>

C:¥user¥java>javac L0102.java L0102.java:5: 変数 s1 は初期化されていない可能性があります。 System.out.println(s1); ^ エラー 1 個 C:¥user¥java>

class L0102 { public static void main(String args[]) { String s1; String s2="私は誰?"; System.out.println(s2); } } 【修正結果の出力】 C:¥user¥java>java L0102 私は誰?

C:¥user¥java>java L0103 体重は、89.5Kg です C:¥user¥java>

Page 21: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

21

【練習 4】 public class L0104 { public static void main(String args[]) { // 何処かでエラーが出る、どうしましょう? char ch = 'AB'; System.out.println("char -> " + ch); } } ヒント:文字と文字列の違いは何ですか? 【練習 5】 public class L0105 { public static void main(String args[]) { // 何処かでエラーが出る、どうしましょう? short s = 987654321; System.out.println("short -> " + s); } } ヒント:short は精度何バイト?、表現できる値は? 【練習 6】 public class L0106 { public static void main(String args[]) { // double d1,d2 の値を見比べてみましょう double d1 = 987654321.789; double d2 = 987654321123456789.789; System.out.println("double d1 -> " + d1); System.out.println("double d2 -> " + d2); } } 【練習 7】 class L0107 { public static void main(String args[]) { String s = "猫が言った" + "¥"我輩は猫である¥""; //「¥”」の意味? System.out.println(s); } } 【練習 8】 class L0108 { // 文字列のコンカチネイト(連結) public static void main(String args[]) { System.out.println("私は、" + "松本清張の" + "「砂の器」" + "を読みました。"); } }

C:¥user¥java>javac L0104.java L0104.java:4: 文字リテラルが閉じられていません。 char ch = 'AB'; ^ L0104.java:4: 文字リテラルが閉じられていません。 char ch = 'AB'; ^ エラー 2 個

C:¥user¥java>javac L0105.java L0105.java:4: 精度が落ちている可能性 検出値 : int 期待値 : short short s = 987654321; ^ エラー 1 個

C:¥user¥java>java L0106 double d1 -> 9.87654321789E8 double d2 -> 9.8765432112345677E17

C:¥user¥java>java L0107 猫が言った"我輩は猫である"

C:¥user¥java>java L0108 私は、松本清張の「砂の器」を読みました。

Page 22: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

22

【練習 9】 public class L0109 { public static void main(String args[]) { System.out.println("9/5=>" + 9/5); System.out.println("9%5=>" + 9%5); System.out.println("9/3=>" + 9/3); System.out.println("9%3=>" + 9%3); } } 【練習 10】 public class L0110 { public static void main(String args[]) { System.out.println("9%5=>" + 9%5); System.out.println("9%(-5)=>" + 9%(-5)); System.out.println("(-9)%5=>" + (-9)%5); System.out.println("(-9)%(-5)=>" + (-9)%(-5)); System.out.println("1.21/1.1 , 1.21%1.1=>" + 1.21/1.1 + "," + 1.21%1.1); } } 【練習 11】 class L0111 { //単項演算子 public static void main(String args[]) { int i = 10; i = -i; System.out.println("i= " + i); } } 【練習 12】 class L0112 { //型の違う精度が異なるもの同士の演算 public static void main(String args[]) { int i; float f; i = 10; f = 23.25f; System.out.println(i * f); } } 課題:System.out.println(2+3+”ABC”+4+5); として結果を見てみよう! ビックリするはず。

C:¥user¥java>java L0110 9%5=>4 9%(-5)=>4 (-9)%5=>-4 (-9)%(-5)=>-4 1.21/1.1 , 1.21%1.1=>1.0999999999999999,0.10999999999999988

C:¥user¥java>java L0111 i= -10

C:¥user¥java>java L0112 232.5

C:¥user¥java>java L0109 9/5=>1 9%5=>4 9/3=>3 9%3=>0

Page 23: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

23

【練習 13】 class L0113 { //型精度の大きい方への変換 public static void main(String args[]) { byte b = 127; int i; i = b; System.out.println(i); } } 【練習 14】 class L0114 { //この間違いは難しいでしょう public static void main(String args[]) { byte b; int i = 127; b = i; System.out.println(b); } } ヒント:型相違の対応。キャストとは何か? 【練習 15】 class L0115 { //練習14の回答です public static void main(String args[]) { byte b; int i = 127; b = (byte)i; System.out.println(b); } } 【練習 16】 class L0116 { //型精度の小さいほうへの変換 public static void main(String args[]) { byte b; int i = 259; b = (byte)i; System.out.println(b); // いくつの値が表示されるか?なぜこの値が表示されるか? } } 【練習 17】 class L0117 { //切り捨て public static void main(String args[]) { float f = 23.9999f; int i = (int)f; System.out.println(i); } }

C:¥user¥java>java L0113 127

C:¥user¥java>javac L0114.java L0114.java:5: 精度が落ちている可能性 検出値 : int 期待値 : byte b = i; ^ エラー 1 個

C:¥user¥java>java L0115 127

C:¥user¥java>java L0116 3

C:¥user¥java>java L0117 23

Page 24: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

24

【練習 18】 class L0118 { //文字の割り当て public static void main(String args[]) { char ch = 'A'; int i = ch; System.out.println(i); } } 課題:'A'を'a'や'1'にすると、どんな値が返ってくるか確かめましょう 【練習 19】 class L0119 { public static void main(String args[]) { byte b1 = 3; //おかしい、エラーが出てしまった!どうしよう? byte b2 = 2; byte b3 = b1 * b2; System.out.println(b3); } } ヒント:キャスト、演算子の優先順位 【練習 20】 class L0120 { public static void main(String args[]) { // 配列を宣言して領域を割り当てる int myarray[] = new int[5]; // 要素を初期化する myarray[0] = 10; myarray[1] = 20; myarray[2] = -30; myarray[3] = -40; myarray[4] = 50; // 要素数を表示する System.out.println("myarray.length = " + myarray.length); // 要素を表示する System.out.println(myarray[0]); System.out.println(myarray[1]); System.out.println(myarray[2]); System.out.println(myarray[3]); System.out.println(myarray[4]); } }

C:¥user¥java>java L0118 65

C:¥user¥java>javac L0119.java L0119.java:5: 精度が落ちている可能性 検出値 : int 期待値 : byte byte b3 = b1 * b2; ^ エラー 1 個

C:¥user¥java>java L0120 myarray.length = 5 10 20 -30 -40 50

Page 25: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

25

【練習 21】 class L0121 { //配列の初期化 public static void main(String args[]) { // 配列を宣言し,領域を割り当て,初期化する int myarray[] = { 11, 22, -33, -44, 50 }; // 要素数を表示する System.out.println("myarray.length = " + myarray.length); // 要素を表示する System.out.println(myarray[0]); System.out.println(myarray[1]); System.out.println(myarray[2]); System.out.println(myarray[3]); System.out.println(myarray[4]); } } 【練習 22】 class L0122 { //配列の参照 public static void main(String args[]) { // 配列 array1 を宣言し,領域を割り当てる float array1[] = new float[3]; // 配列 array1 を初期化する array1[0] = -1.23f; array1[1] = 4.5f; array1[2] = 67.89f; // 配列 array2 を宣言し,領域を割り当てる float array2[] = new float[3]; // 配列 array2 に配列 array1 と同じ配列を参照させる array2 = array1; // 配列 array2 の要素を表示する System.out.println("array2:"); System.out.println(array2[0]); System.out.println(array2[1]); System.out.println(array2[2]); // 要素を変更する array2[1] = 100; // 配列 array1 の要素を表示する System.out.println("array1:"); System.out.println(array1[0]); System.out.println(array1[1]); System.out.println(array1[2]); // 配列 array2 の要素を表示する System.out.println("array2:"); System.out.println(array2[0]); System.out.println(array2[1]); System.out.println(array2[2]); } }

C:¥user¥java>java L0121 myarray.length = 5 11 22 -33 -44 50

C:¥user¥java>java L0122 array2: -1.23 4.5 67.89 array1: -1.23 100.0 67.89 array2: -1.23 100.0 67.89

Page 26: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

26

【練習 23】 class L0123 { //二次元配列 public static void main(String args[]) { // 配列 myarray を宣言して領域を割り当てる int myarray[][] = new int[3][2]; // 要素を初期化する myarray[0][0] = 11; myarray[0][1] = 22; myarray[1][0] = -33; myarray[1][1] = 44; myarray[2][0] = 55; myarray[2][1] = 66; // 配列 myarray の要素数を表示する System.out.println("myarray.length = " + myarray.length); System.out.println("myarray[0].length = " + myarray[0].length); // 配列 myarray の要素を表示する System.out.println(myarray[0][0]); System.out.println(myarray[0][1]); System.out.println(myarray[1][0]); System.out.println(myarray[1][1]); System.out.println(myarray[2][0]); System.out.println(myarray[2][1]); } } 【練習 24】 class L0124 { //二次元配列の初期化 public static void main(String args[]) { // 配列を宣言し,領域を割り当て,初期化する int myarray[][] = { {99, 88}, {-77, 66}, {55, 44} }; // 要素数を表示する System.out.println("myarray.length = " + myarray.length); System.out.println("myarray[0].length = " + myarray[0].length); // 要素を表示する System.out.println(myarray[0][0]); System.out.println(myarray[0][1]); System.out.println(myarray[1][0]); System.out.println(myarray[1][1]); System.out.println(myarray[2][0]); System.out.println(myarray[2][1]); } }

C:¥user¥java>java L0123 myarray.length = 3 myarray[0].length = 2 11 22 -33 44 55 66

C:¥user¥java>java L0124 myarray.length = 3 myarray[0].length = 2 99 88 -77 66 55 44

Page 27: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

27

【練習 25】 class L0125 { //可変の二次元配列 public static void main(String args[]) { // 可変の配列を宣言し,領域を割り当て,初期化する int myarray[][] = { { 1, 2 }, { -3, 4, 5, -6 }, { 7 } }; // 配列とその要素の要素数を表示する System.out.println("myarray.length = " + myarray.length); System.out.println("myarray[0].length = " + myarray[0].length); System.out.println("myarray[1].length = " + myarray[1].length); System.out.println("myarray[2].length = " + myarray[2].length); // 要素を表示する System.out.println(myarray[0][0]); System.out.println(myarray[0][1]); System.out.println(myarray[1][0]); System.out.println(myarray[1][1]); System.out.println(myarray[1][2]); System.out.println(myarray[1][3]); System.out.println(myarray[2][0]); } }

C:¥user¥java>java L0125 myarray.length = 3 myarray[0].length = 2 myarray[1].length = 4 myarray[2].length = 1 1 2 -3 4 5 -6 7

Page 28: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

28

2.クラス&メソッド

SUN が提供している Java の部品群(API)の使い方を知る

注:「static」は、クラスに所属していて、インスタンスには所属していない! この意味はすぐには判らないかも知れませんが徐々に慣れてくるでしょう。

日本語訳が以下にある

http://java.sun.com/j2se/1.4/ja/docs/ja/api/index.html

JavaTM 2 Platform, Standard Edition, 1.4.0 API 仕様

クラス:Math の例

Page 29: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

29

クラス:String の例

コンストラクタ

メソッド一覧(部分)

1メソッドの詳細

1.API の見方 2.コンストラクタ、デストラクタ、 ファイナライザ 3.ガーベジコレクション main()メソッド内での

メモリー・リークの防止策 4.NaN などの特殊な値

Page 30: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

30

【練習 1】 class L0201 { //Math クラスの静的メソッド例 public static void main(String args[]) { System.out.println("Max of -10 and -5 is " + Math.max(-10, -5)); System.out.println("Min of -11 and -6 is " + Math.min(-11, -6)); System.out.println("Absolute value of 20 is " + Math.abs(-20)); System.out.println("Absolute value of -25 is " + Math.abs(-25)); System.out.println("The ceiling of 26.01 is " + Math.ceil(26.01)); System.out.println("The ceiling of 37.0 is " + Math.ceil(37.0)); System.out.println("The floor of 45.01 is " + Math.floor(45.01)); System.out.println("The floor of 47.0 is " + Math.floor(47.0)); } } 【練習 2】 class L0201 { //Math クラスの静的変数 public static void main(String args[]) { System.out.println("Exp = " + Math.E); System.out.println("PI(π) = " + Math.PI); } } 【練習 3】 class L0203 { //円の公式を使った計算例 public static void main(String args[]) { double radius = 10; double area = Math.PI * radius * radius; double circumference = 2 * Math.PI * radius; System.out.println("半径= " + radius); System.out.println("面積=" + area); System.out.println("円周=" + circumference); } } 課題:縦10m、横20m の長方形の面積と、周囲の長さを計算するプログラム を作成しなさい。

C:¥user¥java>java L0201 Max of -10 and -5 is -5 Min of -11 and -6 is -11 Absolute value of 20 is 20 Absolute value of -25 is 25 The ceiling of 26.01 is 27.0 The ceiling of 37.0 is 37.0 The floor of 45.01 is 45.0 The floor of 47.0 is 47.0

C:¥user¥java>java L0202 Exp = 2.718281828459045 PI(π) = 3.141592653589793

C:¥user¥java>java L0203 半径= 10.0 面積=314.1592653589793 円周=62.83185307179586

Page 31: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

31

【練習 4】 class L0204 { //String クラスのインスタンス・メソッド(substring) public static void main(String args[]) { String s = "One Two Three Four Five Six Seven"; String substring = s.substring(4, 10); System.out.println(substring); } } 課題:このプログラムの s の値をそのまま用いて Ten と表示するプログラムを つくりなさい。 【練習 5】 class L0205 { //String クラスのインスタンス・メソッド(indexOf) public static void main(String args[]) { String s1 = "The total cost is $45.67"; int i1 = s1.indexOf('$'); String s2 = s1.substring(i1); System.out.println(s2); } } 課題:s1 の値はそのままとし、このプログラムを改造して、

「$」を表示せず、値の後ろに「ドル」と表示するようにしてみましょう。 【練習 6】 class L0206 { //Integer クラスの静的メソッド&インスタンス・メソッド(valueOf) public static void main(String args[]) { String s = "128"; Integer obj = Integer.valueOf(s); int i = obj.intValue(); i += 11; System.out.println(i); } } 【練習 7】 class L0207 { //Integer クラスの静的メソッド&インスタンス・メソッド(valueOf) //(書き方のバリエーション) public static void main(String args[]) { String s = "12"; int i = Integer.valueOf(s).intValue(); i += 87; System.out.println(i); } }

C:¥user¥java>java L0204 Two Th

C:¥user¥java>java L0205 $45.67

C:¥user¥java>java L0206 139

C:¥user¥java>java L0207 99

Page 32: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

32

【練習 8】 class L0208 { // Binary(2 進) Hex(16 進) Octal(8 進) public static void main(String args[]) { int i = 11; System.out.println("Binary => " + Integer.toBinaryString(i)); System.out.println("Hex => " + Integer.toHexString(i)); System.out.println("Octal => " + Integer.toOctalString(i)); } } 課題:値255の2進数、8進数、16進数を求めてみましょう。 【練習 9】 class L0209 { //Integer オブジェクトの生成と2つのコンストラクタ public static void main(String args[]) { Integer iobj1 = new Integer(5); Integer iobj2 = new Integer("6"); int i1 = iobj1.intValue(); int i2 = iobj2.intValue(); int sum = i1 + i2; System.out.println("i1 = " + i1); System.out.println("i2 = " + i2); System.out.println("sum = i1 + i2 = " + sum); } } 課題:iobj1 の値を「5」ではなく、「a」とするとどうなるか? iobj2 の値を「"6"」ではなく、「"a"」とするとどうなるか? 「0xa」ではどうか? 【練習 10】 class L0210 { //複数の変数から、同じオブジェクトを参照 public static void main(String args[]) { Integer obj1 = new Integer(5); Integer obj2 = obj1; Integer obj3 = obj1; System.out.println(obj1); System.out.println(obj2); System.out.println(obj3); System.out.println("obj3.intValue * 3 = " + obj3.intValue()*3); } }

C:¥user¥java>java L0208 Binary => 1011 Hex => b Octal => 13

C:¥user¥java>java L0209 i1 = 5 i2 = 6 sum = i1 + i2 = 11

C:¥user¥java>java L0210 5 5 5 obj3.intValue * 3 = 15

Page 33: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

33

【練習 11】 class L0211 { //同じ変数が、別のオブジェクトの参照に乗り換える public static void main(String args[]) { Integer obj = new Integer(5); System.out.println(obj); obj = new Integer(6); System.out.println(obj); obj = new Integer(7); System.out.println(obj); } } 【練習 12】 class L0212 { //資源(メモリ)のゴミ集め:Garbage Collection public static void main(String args[]) { Integer i = new Integer(5); System.out.println(i); i = new Integer(6); System.out.println

("この時点で、Integer(5)として生成したオブジェクトは、再利用可能となる"); System.out.println(i); } } 【練習 13】 class L0213 { //Double public static void main(String args[]) { // 変数を宣言して初期化する double d1 = 0; double d2 = 0; double d11 = 11; // 除算 double d3 = d1/d2; System.out.println("0/0=>"+d3); // 0÷0 // 無限と NaN のテスト System.out.println(Double.isInfinite(d3)); System.out.println(Double.isNaN(d3)); // 最大,最小,無限の各値を表示する System.out.println(Double.MAX_VALUE); System.out.println(Double.MIN_VALUE); System.out.println(Double.POSITIVE_INFINITY); System.out.println(Double.NEGATIVE_INFINITY); double d4 = d11/d2; System.out.println("11/0=>"+d4); // 数値÷0 } }

C:¥user¥java>java L0211 5 6 7

C:¥user¥java>java L0212 5 この時点で、Integer(5)として生成したオブジェクトは、再利用可能となる 6

C:¥user¥java>java L0213 0/0=>NaN false true 1.7976931348623157E308 4.9E-324 Infinity -Infinity 11/0=>Infinity

Page 34: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

34

【練習 14】 class L0214 { //StringBuffer クラスのコンストラクタ //StringBuffer クラスのインスタンス・メソッド(capacity, length) public static void main(String args[]) { StringBuffer sb1 = new StringBuffer(); StringBuffer sb2 = new StringBuffer(30); StringBuffer sb3 = new StringBuffer("abcde"); System.out.println("sb1.capacity = " + sb1.capacity()); System.out.println("sb1.length = " + sb1.length()); System.out.println("sb2.capacity = " + sb2.capacity()); System.out.println("sb2.length = " + sb2.length()); System.out.println("sb3.capacity = " + sb3.capacity()); System.out.println("sb3.length = " + sb3.length()); } } 【練習 15】 class L0215 { //StringBuffer クラスのコンストラクタ //StringBuffer クラスのインスタンス・メソッド(toString, append,insert,reverse) public static void main(String args[]) { StringBuffer sb = new StringBuffer("abcde"); System.out.println("sb.capacity = " + sb.capacity()); System.out.println("sb.length = " + sb.length()); System.out.println("sb.toString = " + sb.toString()); sb.append("xyz"); System.out.println("sb.capacity = " + sb.capacity()); System.out.println("sb.length = " + sb.length()); System.out.println("sb.toString = " + sb.toString()); sb.append(3); System.out.println("sb.capacity = " + sb.capacity()); System.out.println("sb.length = " + sb.length()); System.out.println("sb.toString = " + sb.toString()); sb.insert(2,"123"); System.out.println("sb.capacity = " + sb.capacity()); System.out.println("sb.length = " + sb.length()); System.out.println("sb.toString = " + sb.toString()); sb.reverse(); System.out.println("sb.capacity = " + sb.capacity()); System.out.println("sb.length = " + sb.length()); System.out.println("sb.toString = " + sb.toString()); } }

C:¥user¥java>java L0214 sb1.capacity = 16 sb1.length = 0 sb2.capacity = 30 sb2.length = 0 sb3.capacity = 21 sb3.length = 5

C:¥user¥java>java L0215 sb.capacity = 21 sb.length = 5 sb.toString = abcde sb.capacity = 21 sb.length = 8 sb.toString = abcdexyz sb.capacity = 21 sb.length = 9 sb.toString = abcdexyz3 sb.capacity = 21 sb.length = 12 sb.toString = ab123cdexyz3 sb.capacity = 21 sb.length = 12 sb.toString = 3zyxedc321ba

Page 35: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

35

【練習 16】 class L0216 { //String オブジェクトの配列 public static void main(String args[]) { String array[] = new String[5]; array[0] = "String 0"; array[1] = "String 1"; array[2] = "String 2"; array[4] = "String 4"; System.out.println(array.length); System.out.println(array[0]); System.out.println(array[1]); System.out.println(array[2]); System.out.println(array[3]); System.out.println(array[4]); } } 【練習 17】 class L0217 { //String オブジェクトの配列 public static void main(String args[]) { String array[] = new String[5]; array[0] = "Short string"; array[1] = "A much longer string"; array[2] = "This is a complete sentence!"; array[3] = "Token"; array[4] = "This is the longest element in the " + "array"; int total = array[0].length(); total += array[1].length(); total += array[2].length(); total += array[3].length(); total += array[4].length(); System.out.println("文字列の長さの平均 = " + total/5); } } 【練習 18】 class L0218 { //混合オブジェクトの配列 public static void main(String args[]) { Object array[] = new Object[5]; array[0] = new Integer(4); array[1] = new String("Hello"); array[2] = new Boolean("true"); array[3] = new Character('a'); array[4] = new Double(45.67); System.out.println(array[0]); System.out.println(array[1]); System.out.println(array[2]); System.out.println(array[3]); System.out.println(array[4]); } }

C:¥user¥java>java L0216 5 String 0 String 1 String 2 null String 4

C:¥user¥java>java L0217 文字列の長さの平均 = 21

C:¥user¥java>java L0218 4 Hello true a 45.67

Page 36: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

36

【練習 19】 class L0219 { //コマンドラインの引数 public static void main(String args[]) { System.out.println("args.length = " + args.length); System.out.println("args[0] = " + args[0]); System.out.println("args[1] = " + args[1]); System.out.println("args[2] = " + args[2]); } } 【練習 20】 class L0220 { //コマンドラインの引数:整数を入力 public static void main(String args[]) { // 最初の整数を取得する int i = Integer.parseInt(args[0]); // 次の整数を取得する int j = Integer.parseInt(args[1]); // 合計を表示する int sum = i + j; System.out.println("合計:" + sum); } } 【練習 21】 class L0221 { //コマンドラインの引数:double public static void main(String args[]) { // 1 番目の double 型引数を取得 double d1 = Double.valueOf(args[0]).doubleValue(); // 2 番目の double 型引数を取得 double d2 = Double.valueOf(args[1]).doubleValue(); // 積を表示する double product = d1 * d2; System.out.println("Product is " + product); } } 課題:コマンドラインから、半径を double 型で受け取り、円の面積を求める プログラムを作成しなさい。

C:¥user¥java>java L0219 abc 納豆 豆腐 args.length = 3 args[0] = abc args[1] = 納豆 args[2] = 豆腐

C:¥user¥java>java L0220 123 456 合計:579

C:¥user¥java>java L0221 1.2 1.1 Product is 1.32

Page 37: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

37

【練習 22】 class L0222 { //System クラス:配列一部分コピー(arraycopy) public static void main(String args[]) { int array1[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; int array2[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; System.arraycopy(array1, 2, array2, 3, 5); System.out.print("array2: "); System.out.print(array2[0] + " "); System.out.print(array2[1] + " "); System.out.print(array2[2] + " "); System.out.print(array2[3] + " "); System.out.print(array2[4] + " "); System.out.print(array2[5] + " "); System.out.print(array2[6] + " "); System.out.print(array2[7] + " "); System.out.print(array2[8] + " "); System.out.println(array2[9]); } } 【練習 23】 class L0223 { //1970.1.1 0 時(グリニッジ標準時)からの // 経過ミリ秒(currentTimeMillis) public static void main(String args[]) { int i=1; System.out.println("("+(i++)+")"+System.currentTimeMillis()); System.out.println("("+(i++)+")"+System.currentTimeMillis()); System.out.println("("+(i++)+")"+System.currentTimeMillis()); System.out.println("("+(i++)+")"+System.currentTimeMillis()); System.out.println("("+(i++)+")"+System.currentTimeMillis()); System.out.println("("+(i++)+")"+System.currentTimeMillis()); System.out.println("("+(i++)+")"+System.currentTimeMillis()); System.out.println("("+(i++)+")"+System.currentTimeMillis()); System.out.println("("+(i++)+")"+System.currentTimeMillis()); System.out.println("("+(i++)+")"+System.currentTimeMillis()); } }

C:¥user¥java>java L0222 array2: 0 0 0 2 3 4 5 6 0 0

C:¥user¥java>java L0223 (1)1089969468905 (2)1089969468915 (3)1089969468915 (4)1089969468925 (5)1089969468925 (6)1089969468935 (7)1089969468935 (8)1089969468945 (9)1089969468945 (10)1089969468955

Page 38: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

38

3.制御文&加減算・関係・論理演算子

if 文

for 文

加算:+、+=

減算:-、-=

インクリメント:++

デクリメント:--

大小比較:<、>、<=、>=

等しい:==

等しくない:!=

論理積:&、&&

論理和:¦、¦¦

排他論理和:^

否定:!

真:true

偽:false

Page 39: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

39

【練習 1】 class L0301 { public static void main(String args[]) { //平方根を求める(sqrt) // 値が負の場合は虚数:if のみ double d = Double.valueOf(args[0]).doubleValue(); if(d < 0) System.out.println(Math.sqrt(-d) + "i"); if(d >= 0) System.out.println(Math.sqrt(d)); } } 【練習 2】 class L0302 { public static void main(String args[]) { //平方根を求める(sqrt) // 値が負の場合は虚数:if+else double d = Double.valueOf(args[0]).doubleValue(); if(d < 0) System.out.println(Math.sqrt(-d) + "i"); else System.out.println(Math.sqrt(d)); } } 【練習 3】 class L303 { public static void main(String args[]) { //分母が0で割り算をしない double d1 = Double.valueOf(args[0]).doubleValue(); double d2 = Double.valueOf(args[1]).doubleValue(); if(d2 == 0) System.out.println("ゼロでは割れません!"); else System.out.println("Answer is: " + d1/d2); } } 【練習 4】 class L0304 { public static void main(String args[]) { //if-else のコード・ブロック if(args.length > 0) { double angle = Double.valueOf(args[0]).doubleValue(); double radians = angle * Math.PI/180; System.out.println("cosine: " + Math.cos(radians)); System.out.println("sine: " + Math.sin(radians)); System.out.println("tangent: " + Math.tan(radians)); } else { System.out.println("コマンド・ラインの引数に" + "角度を 1 個入れてください"); } } }

C:¥user¥java>java L0301 3 1.7320508075688772 C:¥user¥java>java L0301 100 10.0

C:¥user¥java>java L0302 2 1.4142135623730951 C:¥user¥java>java L0302 -9 3.0i

C:¥user¥java>java L0303 3 4 Answer is: 0.75 C:¥user¥java>java L0303 3 0 ゼロでは割れません! C:¥user¥java>java L0303 0 4 Answer is: 0.0

C:¥user¥java>java L0304 コマンド・ラインの引数に角度を 1個入れてください C:¥user¥java>java L0304 90 cosine: 6.123233995736766E-17 sine: 1.0 tangent: 1.633123935319537E16 C:¥user¥java>java L0304 60 cosine: 0.5000000000000001 sine: 0.8660254037844386 tangent: 1.7320508075688767

Page 40: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

40

【練習 5】 public class L0305 { public static void main(String args[]) { //for(初期値, ループ継続判定, 増分演算) for(int num = 1; num < 11; num = num + 1) System.out.print(num + " "); System.out.println("terminating"); } } 【練習 6】 public class L0306 { public static void main(String args[]) { //先程のプログラムと実行結果が違う! for(int num = 11; num < 11; num = num + 1) System.out.print(num + " "); System.out.println("terminating"); } } 【練習 7】 public class L0307 { public static void main(String args[]) { //for のコード・ブロック int sum = 0; int prod = 1; for(int num = 1; num < 6; num = num + 1) { sum = sum + num; prod = prod * num; } System.out.println("積=" + prod + ", 和=" + sum); } } 【練習 8】 public class L0308 { public static void main(String args[]) { //増分が1とは限らない for(int i = 0; i < 101; i = i + 5) System.out.print(i + " "); System.out.println(""); } }

C:¥user¥java>java L0305 1 2 3 4 5 6 7 8 9 10 terminating

C:¥user¥java>java L0306 terminating

C:¥user¥java>java L0307 積=120, 和=15

C:¥user¥java>java L0308 0 5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90 95 100

Page 41: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

41

【練習 9】 class L0309 { public static void main(String args[]) { //文字と数字の件数カウント int digits = 0; int letters = 0; int elseChars = 0; for(int i = 0; i < args[0].length(); i = i + 1) { char ch = args[0].charAt(i); if(Character.isDigit(ch)) digits += 1; else if(Character.isLetter(ch)) letters += 1; else elseChars+=1; } System.out.println("数字は " + digits + " 個"); System.out.println(“文字は " + letters + " 個"); System.out.println("他の文字は " + elseChars + " 個"); } } 【練習 10】 class L0310 { public static void main(String args[]) { //素数の判定 // コマンドライン引数を変換する int num = Integer.parseInt(args[0]); // 要素を判定する boolean prime = true; for(int i = 2; i <= num/2; i = i + 1) if((num % i) == 0) prime = false; // 結果を表示する if(prime == true) System.out.println("The number is prime."); else System.out.println("The number is not prime."); } } 課題:与えられた正の整数の因数(整数を割り切ることが出来る値)を全て表示するプロ

グラムを作成しなさい。たとえば12の場合、2,3,4,6を表示する。 課題:与えられた整数が、奇数か偶数か判定するプログラムを作成しなさい。

C:¥user¥java>java L0309 abc 今日は 123!#$%'()=+-/¥ 数字は 3 個 文字は 6 個 他の文字は 12 個

C:¥user¥java>java L0310 17 The number is prime. C:¥user¥java>java L0310 121 The number is not prime.

「“」「&」「<」「>」に注意

Page 42: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

42

【練習 11】 class L0311 { public static void main(String args[]) { //インクリメント演算子:演算子が後 int i, j; i = 10; j = i++; /* i と j との値はどうなる? */ System.out.println("i= " + i + " , j= " + j); } } 【練習 12】 class L0312 { public static void main(String args[]) { //インクリメント演算子:演算子が前 int i, j; i = 10; j = ++i; /* i と j との値はどうなる? */ System.out.println("i= " + i + " , j= " + j); } } 【練習 13】 class L0313 { public static void main(String args[]) { //文字数カウント・プログラムの改訂版 int digits = 0; int letters = 0; int elseChars = 0; for(int i = 0; i < args[0].length(); i++) { char ch = args[0].charAt(i); if(Character.isDigit(ch)) ++digits; else if(Character.isLetter(ch)) ++letters; else ++elseChars; } System.out.println("数字は " + digits + " 個です"); System.out.println("文字は " + letters + " 個です"); System.out.println("その他の文字は " + elseChars + " 個です"); } }

C:¥user¥java>java L0311 i= 11 , j= 10

C:¥user¥java>java L0312 i= 11 , j= 11

C:¥user¥java>java L0313 de ジャヴァ 456/ 数字は 3 個です 文字は 6 個です その他の文字は 1 個です

Page 43: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

43

【練習 14】 class L0314 { public static void main(String args[]) { //インクリメント&デクリメントの実験 int i; i = 0; System.out.println(" i=>"+i); // 0 を表示 System.out.println("++i=>"+(++i)); // 1 を表示 System.out.println("i++=>"+(i++)); // 1 を表示 System.out.println(" i=>"+i); // 2 を表示 System.out.println("--i=>"+(--i)); // 1 を表示 System.out.println("i--=>"+(i--)); // 1 を表示 System.out.println(" i=>"+i); // 0 を表示 } } 【練習 15】 class L0315 { public static void main(String args[]) { //バックスラッシュ:エスケープシーケンス System.out.print("This is line one¥n"); System.out.print("This is line two¥n"); System.out.print("This is line three"); if (args[0].equals("back") && args[1].equals("back")) // && の動きの確認 System.out.print("¥nabcde¥b¥b "); else if (args[0].equals("back") && args[1].equals("go")) System.out.print("¥nabcde¥bx"); } }

C:¥user¥java>java L0314 i=>0 ++i=>1 i++=>1 i=>2 --i=>1 i--=>1 i=>0

C:¥user¥java>java L0315 back back This is line one This is line two This is line three abc e C:¥user¥java>java L0315 back go This is line one This is line two This is line three abcdx C:¥user¥java>java L0315 go This is line one This is line two This is line three C:¥user¥java>java L0315 back This is line one This is line two This is line threeException in thread "main" java.lang.ArrayIndexOutOfBoundsExce ption: 1 at L0315.main(L0315.java:6)

¥n(改行)と ¥b(バックスペース) の働きを確認

&&論理演算子の優先

順位による判定順序の

動作確認

Page 44: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

44

《課題1.》 1.練習 15 に文字列の比較に「equals()」というメソッドを利用している。 なぜ「==」を使わないのか? 2.String s1=”abc”; String s2==”a”+”bc”;として s1==s2 を調べると true となるはず。 この理由は何か?上記1.の理由が正しく答えられると、この現象はオカシイ? 《課題2.》 1.論理演算子「&&」と「||」の安全性を考えなさい 【練習 16】 class L0316 { public static void main(String args[]) { //関係演算子の実験 int i = Integer.parseInt(args[0]); int j = Integer.parseInt(args[1]); System.out.println("i = " + i); System.out.println("j = " + j); System.out.println("Relational operators:"); System.out.println("i < j " + (i < j)); System.out.println("i <= j " + (i <= j)); System.out.println("i == j " + (i == j)); System.out.println("i > j " + (i > j)); System.out.println("i >= j " + (i >= j)); System.out.println("i != j " + (i != j)); } } 【練習 17】 class L0317 { public static void main(String args[]) { //三項演算子 「(条件)?真:偽」 int i = Integer.parseInt(args[0]); int j = Integer.parseInt(args[1]); System.out.println((i > j) ? i : j); } } 課題:三項演算子を用いて、与えられた整数が奇数か偶数かを判定するプログラムを作成

しなさい。

C:¥user¥java>java L0316 11 123 i = 11 j = 123 Relational operators: i < j true i <= j true i == j false i > j false i >= j false i != j true C:¥user¥java>java L0316 11 5 i = 11 j = 5 Relational operators: i < j false i <= j false i == j false i > j true i >= j true i != j true C:¥user¥java>java L0316 11 11 i = 11 j = 11 Relational operators: i < j false i <= j true i == j true i > j false i >= j true i != j false

C:¥user¥java>java L0317 10 20 20 C:¥user¥java>java L0317 20 10 20 C:¥user¥java>java L0317 15 15 15

Page 45: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

45

【練習 18】 class L0318 { public static void main(String args[]) { //論理演算子の実験 boolean i = Boolean.valueOf(args[0]).booleanValue(); boolean j = Boolean.valueOf(args[1]).booleanValue(); System.out.println("i = " + i); System.out.println("j = " + j); System.out.println("Logical operators:"); System.out.println("i & j " + (i & j)); System.out.println("i | j " + (i | j)); System.out.println("i ^ j " + (i ^ j)); System.out.println("!i " + !i); System.out.println("i && j " + (i && j)); System.out.println("i || j " + (i || j)); System.out.println("i == j " + (i == j)); System.out.println("i != j " + (i != j)); } }

C:¥user¥java>java L0318 true true i = true j = true Logical operators: i & j true i | j true i ^ j false !i false i && j true i || j true i == j true i != j false C:¥user¥java>java L0318 true false i = true j = false Logical operators: i & j false i | j true i ^ j true !i false i && j false i || j true i == j false i != j true

C:¥user¥java>java L0318 false false i = false j = false Logical operators: i & j false i | j false i ^ j false !i true i && j false i || j false i == j true i != j false C:¥user¥java>java L0318 false true i = false j = true Logical operators: i & j false i | j true i ^ j true !i true i && j false i || j true i == j false i != j true

Page 46: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

46

4.制御文2&ビット演算

if 文

for 文

while 文

switch 文

break 文

continue 文

ビットの論理積:&

ビットの論理和:¦

ビットの排他論理和:^

ビットの補数:̃

n<<s の値は n のビット位置を s ビット左にシフトしたものとする

n>>s の値は, n のビット位置を符号拡張を伴って s ビット右にシフトしたものとする

n>>>s の値は n のビット位置をゼロ拡張を伴って s ビット右にシフトしたものとする

1.手続き型言語の3要素:順次、分岐、繰返し 参考:HTML、SQL、LISP、ML、PROLOG など 2.ラベル付・・・ブロックとケース 3.フローチャートと NS チャート 4.UML

Page 47: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

47

【練習 1】 class L0401 { public static void main(String args[]) {

//if-else による場合分け(case 文的利用) int i = Integer.valueOf(args[0]).intValue(); if (i < 0) System.out.println("負の値"); else if (i == 0) System.out.println("ゼロ"); else if (i == 1) System.out.println("「1」"); else if (i == 2) System.out.println("「2」"); else if (i == 3) System.out.println("「3」"); else System.out.println("3より大きい値=>"+ i); } } 【練習 2】 class L0402 { public static void main(String args[]) { //if のネスト(入れ子) int i = Integer.parseInt(args[0]); if (i > 0) if (i > 3) System.out.println("i > 3"); else System.out.println("i > 0 and i <= 3"); else System.out.println("i <= 0"); } } 【練習 3】 class L0403 { public static void main(String args[]) {

//for 初期値を別から与える&decrement int i = Integer.parseInt(args[0]); for( ; i > 0; i--) System.out.print(i + " "); System.out.println(""); } } 課題:args が無い場合に例外処理が発生する。これを回避するように改造しなさい。

C:¥user¥java>java L0401 -10 負の値 C:¥user¥java>java L0401 0 ゼロ C:¥user¥java>java L0401 1 「1」 C:¥user¥java>java L0401 2 「2」 C:¥user¥java>java L0401 3 「3」 C:¥user¥java>java L0401 4 3より大きい値=>4

C:¥user¥java>java L0402 -5 i <= 0 C:¥user¥java>java L0402 0 i <= 0 C:¥user¥java>java L0402 3 i > 0 and i <= 3 C:¥user¥java>java L0402 4 i > 3

C:¥user¥java>java L0403 5 5 4 3 2 1

Page 48: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

48

【練習 4】 class L0404 { public static void main(String args[]) { //for 増分をブロック内部で処理 int i; for(i = 0; i < 10; ) { System.out.print(i+" "); i++; } System.out.print("¥n"); } } 【練習 5】 class L0405 { public static void main(String args[]) { //while int i = Integer.parseInt(args[0]); while (i > 0) { System.out.print(i + " "); i--; } System.out.println(""); } } 【練習 6】 class L0406 { public static void main(String args[]) { //母音(AEIOU)の勘定 int vowels = 0; int i = args[0].length() - 1; while (i >= 0) { char c = args[0].charAt(i); if(c == 'A' || c == 'a') ++vowels; else if(c == 'e' || c == 'E') ++vowels; else if(c == 'i' || c == 'I') ++vowels; else if(c == 'o' || c == 'O') ++vowels; else if(c == 'u' || c == 'U') ++vowels; --i; } System.out.println("母音の数= " + vowels); } }

C:¥user¥java>java L0404 0 1 2 3 4 5 6 7 8 9

C:¥user¥java>java L0405 5 5 4 3 2 1 C:¥user¥java>java L0405 1 1 C:¥user¥java>java L0405 0 C:¥user¥java>

C:¥user¥java>java L0406 Hello,ladies,and,gentlemen! 母音の数= 9

Page 49: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

49

【練習 7】 class L0407 { public static void main(String args[]) { //素数の洗い出し //(Lesson3 練習 10 参照) int count = 0; int number = 2; do { // 要素があるかどうかテストする boolean prime = true; for(int i = 2; i < number/2 + 1; i++) { if((number % i) == 0) prime = false; } // 素数がある場合は,表示する if(prime == true) { System.out.print(number + " "); ++count; } // 数値を増分する ++number; } while(count < 14);

System.out.println(""); } } 課題:count の上限を 14 ではなく、args から入力させるように改造しなさい。 args から入力する値を変えて実行し、その時間を計測してみなさい。 【練習 8】 class L0408 { public static void main(String args[]) { //for のネスト(入れ子) int i, j, k; for (i = 0; i < 3; i++) for (j = 0; j < 26; j++) for (k = 0; k < 2; k++) System.out.print((char)('A' + j)); } } 課題:出力を以下のように A~Z 毎に改行するように、このプログラムを改造しなさい

C:¥user¥java>java L0407 2 3 5 7 11 13 17 19 23 29 31 37 41 43

C:¥user¥java>java L0408 AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZAABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZAABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ

C:¥user¥java>java L0408 AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ

Page 50: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

50

【練習 9】 class L0409 { public static void main(String args[]) { //break によるループ脱出1 int i; for (i = 1; i < 50; i++) { System.out.println(i); if (i == 5) break; } } } 【練習 10】 class L0410 { public static void main(String args[]) { //break によるループ脱出2 for (int i = 0; i < args.length; i++) { if (args[i].startsWith("$")) { System.out.println(args[i]); break; } } } } 【練習 11】 class L0411 { public static void main(String args[]) { //break で抜けるブロックはどこ? int i,j=0; Break1: for (i = 0; i < 5; i++) { for (j = 0; j < 7; j++) { System.out.print(j+" "); if (i<2 & j == 2) break; if (i>=3 & j == 4) break Break1; } } System.out.println("i="+i+",j="+j); } } 【練習 12】 class L0412 { public static void main(String args[]) {

//continue によるブロック先頭への戻り for (int x = 0; x < 7; x++) { if (x < 3) continue; System.out.println(x); } } }

C:¥user¥java>java L0410 a$ 1$ $3 $4 b$ $3

C:¥user¥java>java L0409 1 2 3 4 5

C:¥user¥java>java L0411 0 1 2 0 1 2 0 1 2 3 4 5 6 0 1 2 3 4 i=3,j=4

C:¥user¥java>java L0412 3 4 5 6

Page 51: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

51

【練習 13】 class L0413 { public static void main(String args[]) {

//乱数利用による break&continue の実験 int i = 0; while (true) { double d = Math.random(); if (d < .2 || d > .8) continue; System.out.println("d=" + d + ",i=" + i); if (++i == 10) break;

} } } 課題: if (d < .2 || d > .8) continue; の二行をコメントにして実行して、結果を比べなさい。 【練習 14】 class SwitchDemo { public static void main(String args[]) { //case による場合分け int i = Integer.parseInt(args[0]); switch (i) { case 1: System.out.println("一"); break; case 2: System.out.println("二"); break; case 3: System.out.println("三"); break; case 4: System.out.println("四"); break; default: System.out.println("一から四、以外の数字"); } } }

C:¥user¥java>java L0413 d=0.7585014127118366,i=0 d=0.570464848440942,i=1 d=0.35131334509029166,i=2 d=0.6684128798602036,i=3 d=0.5484472418258748,i=4 d=0.36480225271041844,i=5 d=0.372007754712664,i=6 d=0.7237338441625478,i=7 d=0.7171107829007677,i=8 d=0.6511117251458205,i=9

C:¥user¥java>java L0414 1 一 C:¥user¥java>java L0414 2 二 C:¥user¥java>java L0414 3 三 C:¥user¥java>java L0414 4 四 C:¥user¥java>java L0414 5 一から四、以外の数字

Page 52: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

52

【練習 15】 class L0415 { public static void main(String args[]) { //break が無いと動作はどうなるか? int i = Integer.parseInt(args[0]); switch (i) { case 4: System.out.println("3 より大きい"); case 3: System.out.println("2 より大きい"); case 2: System.out.println("1 より大きい"); break; case 1: System.out.println("0 より大きい"); break; default: System.out.println("その他"); } } } 【練習 16】 class L0416 { public static void main(String args[]) { //case のOR条件の書き方 // 引数の先頭の文字を取得する char ch = args[0].charAt(0); // 先頭の文字が母音か子音かを判断する switch (ch) { case 'a': case 'e': case 'i': case 'o': case 'u': case 'y': System.out.println("小文字の母音用文字です"); break; default: System.out.println("aeiou 以外の文字です"); } } } 【練習 17】 class L0417 { public static void main(String args[]) { //コンパイル・エラーの文言を確認しなさい int i = 1; switch (i) { case i: System.out.println("1"); } } }

C:¥user¥java>java L0416 a 小文字の母音用文字です C:¥user¥java>java L0416 u 小文字の母音用文字です C:¥user¥java>java L0416 E aeiou 以外の文字です C:¥user¥java>java L0416 y 小文字の母音用文字です

C:¥user¥java>java L0415 1 0 より大きい C:¥user¥java>java L0415 2 1 より大きい C:¥user¥java>java L0415 3 2 より大きい 1 より大きい C:¥user¥java>java L0415 4 3 より大きい 2 より大きい 1 より大きい C:¥user¥java>java L0415 5 その他

C:¥user¥java>javac L0417.java L0417.java:5: 定数式が必要です。 case i: ^ エラー 1 個

Page 53: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

53

【練習 18】 class L0418 { public static void main(String args[]) { //ビット演算1 char c = 'A'; byte b = 100; short s = 101; int i = -100; long lo = 100; System.out.println("c & 0xf=>" + (c & 0xf)); //0xf<=>0x0f System.out.println("b | 1=>" + (b | 1)); System.out.println("s ^ 1=>" + (s ^ 1)); System.out.println("~i=>" + (~i)); System.out.println("lo|1=>" + (lo | 1)); System.out.println("i >> 2=>" + (i >> 2)); System.out.println("i >>> 2=>" + (i >>> 2)); System.out.println("i << 2=>" + (i << 2)); System.out.println("s >> 2=>" + (s >> 2)); System.out.println("s >>> 2=>" + (s >>> 2)); System.out.println("s << 2=>" + (s << 2)); } } 【練習 19】 class L0419 { public static void main(String args[]) { //ビット演算2 byte b = -5; for (int i = 7; i >= 0; i--) { if ((b & 0x80) == 0) System.out.println("Bit " + i + " is 0"); else System.out.println("Bit " + i + " is 1"); b <<= 1; } } }

C:¥user¥java>java L0418 c & 0xf=>1 b | 1=>101 s ^ 1=>100 ~i=>99 lo|1=>101 i >> 2=>-25 i >>> 2=>1073741799 i << 2=>-400 s >> 2=>25 s >>> 2=>25 s << 2=>404

C:¥user¥java>java L0419 Bit 7 is 1 Bit 6 is 1 Bit 5 is 1 Bit 4 is 1 Bit 3 is 1 Bit 2 is 0 Bit 1 is 1 Bit 0 is 1

Page 54: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

54

【練習 20】 class L0420 { public static void main(String args[]) { //整数の16進表示 System.out.println("s -->"+Int2Hex(0)); System.out.println("s -->"+Int2Hex(-1)); System.out.println("s -->"+Int2Hex(256+15)); System.out.println("s -->"+(256+15)); } static String Int2Hex(int i) {

StringBuffer sb= new StringBuffer();

if (i==0) sb.append("00000000"); //ゼロの場合、16 進全桁ゼロ表示の文字列を返す

else { //頭ゼロを空白にしない。すべて同じ桁にあわせる

if (i == 0xffffffff )

sb.append( Integer.toHexString(i));

else if ((i & 0xf0000000)!=0) sb.append( Integer.toHexString(i));

else if ((i & 0xff000000)!=0) sb.append("0" + Integer.toHexString(i));

else if ((i & 0xfff00000)!=0) sb.append("00" + Integer.toHexString(i));

else if ((i & 0xffff0000)!=0) sb.append("000" + Integer.toHexString(i));

else if ((i & 0xfffff000)!=0) sb.append("0000" + Integer.toHexString(i));

else if ((i & 0xffffff00)!=0) sb.append("00000" + Integer.toHexString(i));

else if ((i & 0xfffffff0)!=0) sb.append("000000" + Integer.toHexString(i));

else sb.append("0000000" + Integer.toHexString(i));

}

return sb.toString();

} } 【練習 21】 class L0421 { //アルゴリズムの工夫 練習 20 と同一機能 public static void main(String args[]) { //整数の16進表示 System.out.println("s -->"+Int2Hex(0)); System.out.println("s -->"+Int2Hex(-1)); System.out.println("s -->"+Int2Hex(256+15)); System.out.println("s -->"+(256+15)); } public static String Int2Hex(int i) { StringBuffer sb= new StringBuffer(); //頭ゼロを空白にしない。すべて同じ桁にあわせる sb.append("00000000".substring(0,8-Integer.toHexString(i).length()) +Integer.toHexString(i)); return sb.toString(); } }

C:¥user¥java>java L0420 s -->00000000 s -->ffffffff s -->0000010f s -->271

C:¥user¥java>java L0421 s -->00000000 s -->ffffffff s -->0000010f s -->271

Page 55: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

55

【練習 22】 class L0422 { public static void main(String args[]) { //ビット演算3 int s = Integer.parseInt(args[0]); System.out.println("s -->"+L0421.Int2Hex(s)); //注意:練習 L0421 を利用! System.out.println("s -->"+s); System.out.println("s & 0xf->"+(s & 0xf)); System.out.println("s | 1 ->"+(s | 1)); System.out.println("s ^ 1 ->"+(s ^ 1)); System.out.println("~s ->"+(~s)); System.out.println("s >> 2 ->"+(s >> 2)); System.out.println("s >>> 2->"+(s >>> 2)); System.out.println("s << 2 ->"+(s << 2)); } }

C:¥user¥java>java L0422 255 s -->000000ff s -->255 s & 0xf->15 s | 1 ->255 s ^ 1 ->254 ~s ->-256 s >> 2 ->63 s >>> 2->63 s << 2 ->1020 C:¥user¥java>java L0422 16 s -->00000010 s -->16 s & 0xf->0 s | 1 ->17 s ^ 1 ->17 ~s ->-17 s >> 2 ->4 s >>> 2->4 s << 2 ->64 C:¥user¥java>java L0422 1 s -->00000001 s -->1 s & 0xf->1 s | 1 ->1 s ^ 1 ->0 ~s ->-2 s >> 2 ->0 s >>> 2->0 s << 2 ->4 C:¥user¥java>java L0422 123456789 s -->075bcd15 s -->123456789 s & 0xf->5 s | 1 ->123456789 s ^ 1 ->123456788 ~s ->-123456790 s >> 2 ->30864197 s >>> 2->30864197 s << 2 ->493827156

Page 56: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

56

5.クラスの作成

クラス宣言

クラス宣言(class declaration)

ClassDeclaration:

ClassModifiersopt class Identifier Superopt Interfacesopt ClassBody

クラス修飾子

クラス宣言は,クラス修飾子(class modifiers)を含んでよい。

ClassModifiers:

ClassModifier

ClassModifiers ClassModifier

ClassModifier: one of

public abstract final

メソッドのシグネチャ

メソッドの シグネチャ(signature) は,メソッドの名前並びにメソッドに対する形式仮引

数の個数及び型で構成する。クラスは,同じシグネチャをもつ二つのメソッドを宣言して

はならない。そうでなければ,コンパイル時エラーが発生する。

メソッド修飾子

MethodModifiers:

MethodModifier

MethodModifiers MethodModifier

MethodModifier: one of

public protected private

abstract static final synchronized native

Page 57: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

57

【練習 1】 class Point3D { //このクラスは、独立したクラスでしょうか? Object の子供です。 double x; double y; double z; } class L0501 { public static void main(String args[]) { Point3D p = new Point3D(); //インスタンスを生成 p.x = 1.1; //クラスの中の変数を直接使っている p.y = 3.4; p.z = -2.8; System.out.println("p.x = " + p.x); System.out.println("p.y = " + p.y); System.out.println("p.z = " + p.z); } } 【練習 2】 class Point3D { double x; double y; double z; } class L0502 { public static void main(String args[]) { //1 個のクラスから複数の異なるインスタンスを生成 Point3D p1 = new Point3D(); Point3D p2 = new Point3D(); // p1 の座標 p1.x = 1.1; p1.y = 3.4; p1.z = -2.8; // p2 の座標 p2.x = 100.1; p2.y = 103.4; p2.z = -202.8; System.out.println("p1.x = " + p1.x); System.out.println("p1.y = " + p1.y); System.out.println("p1.z = " + p1.z); System.out.println("p2.x = " + p2.x); System.out.println("p2.y = " + p2.y); System.out.println("p2.z = " + p2.z); } }

C:¥user¥java>java L0501 p.x = 1.1 p.y = 3.4 p.z = -2.8

C:¥user¥java>java L0502 p1.x = 1.1 p1.y = 3.4 p1.z = -2.8 p2.x = 100.1 p2.y = 103.4 p2.z = -202.8

Page 58: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

58

【練習 3】 class Point3D { double x; double y; double z; Point3D(double ax, double ay, double az) { //戻り値の定義が無いことに注意! //コンストラクタ Constructor x = ax; y = ay; z = az; } } class L0503 { public static void main(String args[]) { //コンストラクタの働きを確認 Point3D p = new Point3D(1.1, 2.2, -3.3); System.out.println("p.x = " + p.x); System.out.println("p.y = " + p.y); System.out.println("p.z = " + p.z); } }

C:¥user¥java>java L0503 p.x = 1.1 p.y = 2.2 p.z = -3.3

Page 59: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

59

【練習 4】 class Point3D { double x; double y; double z; Point3D(double ax) { //コンストラクタのシグニチャの理解 x = ax; y = 10; z = 20; } Point3D(double ax, double ay) { x = ax; y = ay; z = 30; } Point3D(double ax, double ay, double az) { x = ax; y = ay; z = az; } } class L0504 { public static void main(String args[]) { //コンストラクタのオーバーロード //シグニチャの概念を確認 Point3D p1 = new Point3D(1.1); System.out.println("p1.x = " + p1.x); System.out.println("p1.y = " + p1.y); System.out.println("p1.z = " + p1.z); Point3D p2 = new Point3D(1.1, 2.2); System.out.println("p2.x = " + p2.x); System.out.println("p2.y = " + p2.y); System.out.println("p2.z = " + p2.z); Point3D p3 = new Point3D(1.1, 2.2, -3.3); System.out.println("p3.x = " + p3.x); System.out.println("p3.y = " + p3.y); System.out.println("p3.z = " + p3.z); } }

C:¥user¥java>java L0504 p1.x = 1.1 p1.y = 10.0 p1.z = 20.0 p2.x = 1.1 p2.y = 2.2 p2.z = 30.0 p3.x = 1.1 p3.y = 2.2 p3.z = -3.3

Page 60: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

60

【練習 5】 class Hoge { double w; Hoge(String s) { //コンストラクタのシグニチャの利用例 w = Double.valueOf(s).doubleValue(); } Hoge(StringBuffer sb) { String s = sb.toString(); w = Double.valueOf(s).doubleValue(); } Hoge(double d) { w = d; } } class L0505 { public static void main(String args[]) { Hoge w1 = new Hoge("5.5"); System.out.println(w1.w); StringBuffer sb = new StringBuffer("-17.8"); Hoge w2 = new Hoge(sb); System.out.println(w2.w); Hoge w3 = new Hoge(2.5e-17); System.out.println(w3.w); } } 課題: Hoge w1 = new Hoge("5.5"); この行を Hoge w1 = new Hoge("zz5.5aa"); と変更すると、 どのようなことが発生するか、確かめてみましょう。 【練習 6】 class Point3D { // this の働きの確認 double x; double y; double z; Point3D(double x, double y, double z) { this.x = x; this.y = y; this.z = z; } } class L0506 { public static void main(String args[]) { //this <=> Current Object Point3D p = new Point3D(1.1, 2.2, -3.3); System.out.println("p.x = " + p.x); System.out.println("p.y = " + p.y); System.out.println("p.z = " + p.z); } }

C:¥user¥java>java L0505 5.5 -17.8 2.5E-17

C:¥user¥java>java L0506 p.x = 1.1 p.y = 2.2 p.z = -3.3

Page 61: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

61

【練習 7】 class Circle { //コンストラクタと this の応用例 double x; double y; double radius; Circle(double x) { this(x, 10, 20); } Circle(double x, double y) { this(x, y, 30); } Circle(double x, double y, double radius) { this.x = x; this.y = y; this.radius = radius; } } class L0507 { public static void main(String args[]) { Circle c = new Circle(3.3); System.out.println("c.x = " + c.x); System.out.println("c.y = " + c.y); System.out.println("c.radius = " + c.radius); c = new Circle(3.3, -4.4); System.out.println("c.x = " + c.x); System.out.println("c.y = " + c.y); System.out.println("c.radius = " + c.radius); c = new Circle(3.3, -4.4, 5.5); System.out.println("c.x = " + c.x); System.out.println("c.y = " + c.y); System.out.println("c.radius = " + c.radius); } }

C:¥user¥java>java L0507 c.x = 3.3 c.y = 10.0 c.radius = 20.0 c.x = 3.3 c.y = -4.4 c.radius = 30.0 c.x = 3.3 c.y = -4.4 c.radius = 5.5

Page 62: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

62

【練習 8】 class Bag { //値が入っていない変数は初期化される boolean flag; int i, j = 2, k = 3, l, m; double array[] = { -3.4, 8.8e100, -9.2e-100 }; String s1, s2 = new String("Hello"); } class L0508 { public static void main(String args[]) { Bag bag = new Bag(); System.out.println("bag.flag="+bag.flag); System.out.println("bag.i="+bag.i); System.out.println("bag.j="+bag.j); System.out.println("bag.k="+bag.k); System.out.println("bag.l="+bag.l); System.out.println("bag.m="+bag.m); for (int i = 0; i < bag.array.length; i++) System.out.println("bag.array["+i+"]="+bag.array[i]); System.out.println("bag.s1="+bag.s1); System.out.println("bag.s2="+bag.s2); } } 【練習 9】 class Thing { static int count; //静的変数の参照実験 String name; Thing(String name) { this.name = name; ++count; } } class L0509 { public static void main(String args[]) { System.out.println("First Thing=" + Thing.count); Thing t1 = new Thing("Bowling Ball"); System.out.println(t1.name + " t1=" + t1.count); System.out.println(t1.name + " Thing=" + Thing.count); Thing t2 = new Thing("Ping Pong Ball"); System.out.println(t2.name + " t2=" + t2.count); System.out.println(t2.name + " Thing=" + Thing.count); Thing t3 = new Thing("Football"); System.out.println(t3.name + " t3=" + t3.count); System.out.println(t3.name + " Thing=" + Thing.count); } }

C:¥user¥java>java L0508 bag.flag=false bag.i=0 bag.j=2 bag.k=3 bag.l=0 bag.m=0 bag.array[0]=-3.4 bag.array[1]=8.8E100 bag.array[2]=-9.2E-100 bag.s1=null bag.s2=Hello

C:¥user¥java>java L0509 First Thing=0 Bowling Ball t1=1 Bowling Ball Thing=1 Ping Pong Ball t2=2 Ping Pong Ball Thing=2 Football t3=3 Football Thing=3

Page 63: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

63

【練習 10】 class X { static int array[]; static { //静的初期化ブロックの例 array = new int[6]; for (int i = 0; i < 6; i++) array[i] = i; } } class L0510 { public static void main(String args[]) { for (int i = 0; i < 6; i++) System.out.println(X.array[i]); } } 【練習 11】 class TaxCalc { static double solve(double a) { //静的メソッドの例 return a *= 1.05; } } class L0511 { public static void main(String args[]) { System.out.println("代金は、"+(int)TaxCalc.solve(2000)+"円です"); } } 【練習 12】 class MyObject { //変数のスコープ & 隠蔽 static short s = 400; // 静的変数 int i = 200; // インスタンス変数 void f() { System.out.println("s = " + s); System.out.println("i = " + i); short s = 30; // ローカル変数 int i = 10; // ローカル変数 double d = 1E100; // ローカル変数 System.out.println("MyObject.s = " + MyObject.s); System.out.println("s = " + s); // System.out.println("MyObject.i = " + MyObject.i); System.out.println("i = " + i +"¥nd = " + d); } } class L0512 { public static void main(String args[]) { MyObject myObject = new MyObject(); myObject.f(); } } 課題:// System.out.println("MyObject.i = " + MyObject.i); 上記コメント行を生かすとどうなるか、確認しなさい。

C:¥user¥java>java L0510 0 1 2 3 4 5

C:¥user¥java>java L0511 代金は、2100 円です

C:¥user¥java>java L0512 s = 400 i = 200 MyObject.s = 400 s = 30 i = 10 d = 1.0E100

課題:浮動小数点数値を金銭

の勘定に用いてよいか?

Page 64: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

64

【練習 13】 class ClassX { //ローカル変数と変数のスコープ1 int i = 1000; void f() { int i = 100; System.out.println(i); g(); } void g() { System.out.println(i); } } class L0513 { public static void main(String args[]) { ClassX classZ = new ClassX(); classZ.f(); } } 【練習 14】 class ClassY { //ローカル変数と変数のスコープ2 int i = 1000; void f() { System.out.println(i); for (int i = 0; i < 5; i++) { System.out.print(i + " "); } System.out.println(); System.out.println(i); } } class L0514 { public static void main(String args[]) { ClassY classZZ = new ClassY(); classZZ.f(); } }

C:¥user¥java>java L0513 100 1000

C:¥user¥java>java L0514 1000 0 1 2 3 4 1000

Page 65: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

65

【練習 15】 class Point3D { double x; double y; double z; Point3D(double x) { this(x, 0, 0); } Point3D(double x, double y) { this(x, y, 0); } Point3D(double x, double y, double z) { this.x = x; this.y = y; this.z = z; } void move(double x) { //インスタンス・メソッドのシグニチャの確認 this.x = x; } void move(double x, double y) { this.x = x; this.y = y; } void move(double x, double y, double z) { this.x = x; this.y = y; this.z = z; } } class L0515 { public static void main(String args[]) { Point3D p = new Point3D(1.1, 2.2, -3.3); p.move(5); System.out.println("p.x = " + p.x); System.out.println("p.y = " + p.y); System.out.println("p.z = " + p.z); p.move(6, 7); System.out.println("p.x = " + p.x); System.out.println("p.y = " + p.y); System.out.println("p.z = " + p.z); p.move(8, -9, 10); System.out.println("p.x = " + p.x); System.out.println("p.y = " + p.y); System.out.println("p.z = " + p.z); } }

C:¥user¥java>java L0515 p.x = 5.0 p.y = 2.2 p.z = -3.3 p.x = 6.0 p.y = 7.0 p.z = -3.3 p.x = 8.0 p.y = -9.0 p.z = 10.0

Page 66: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

66

【練習 16】 class L0516 { //call-by-value(副作用なし):int 変数 //call-by-reference(副作用):配列とオブジェクト public static void main(String args[]) { // 変数を初期化する int i = 5; int j[] = { 1, 2, 3, 4 }; StringBuffer sb = new StringBuffer("abcde"); // 変数を表示する display(i, j, sb); // メソッドを呼び出す a(i, j, sb); // もう一度変数を表示する display(i, j, sb); } static void a(int i, int j[], StringBuffer sb) { i = 7; j[0] = 11; sb.append("fghij"); } static void display(int i, int j[], StringBuffer sb) { System.out.println(i); for (int index = 0; index < j.length; index++) System.out.print(j[index] + " "); System.out.println(""); System.out.println(sb); } }

C:¥user¥java>java L0516 5 1 2 3 4 abcde 5 11 2 3 4 abcdefghij

Page 67: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

67

【練習 17】 class L0517 { //call-by-value(副作用なし):配列 public static void main(String args[]) { // 変数を初期化する int x[] = { 11, 12, 13, 14, 15 }; // 変数を表示する display(x); // メソッドを呼び出す change(x); // もう一度変数を表示する display(x); } public static void change(int x[]) { int y[] = { 21, 22, 23, 24, 25 }; x = y; for (int i = 0; i < x.length; i++) System.out.print(x[i] + " "); System.out.println(""); } public static void display(int x[]) { for (int i = 0; i < x.length; i++) System.out.print(x[i] + " "); System.out.println(""); } } 【練習 18】 class L0518 { //call-by-value(副作用なし)2 public static void main(String args[]) { // 変数を初期化する StringBuffer sb = new StringBuffer("abcde"); // 変数を表示する System.out.println(sb); // メソッドを呼び出す a(sb); // もう一度変数を表示する System.out.println(sb); } public static void a(StringBuffer sb) { sb = new StringBuffer("wxyz"); } }

C:¥user¥java>java L0517 11 12 13 14 15 21 22 23 24 25 11 12 13 14 15

C:¥user¥java>java L0518 abcde abcde

Page 68: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

68

【練習 19】 class L0519 { //call-by-value(副作用なし) //call-by-reference(副作用) public static void main(String args[]) { StringBuffer sba = new StringBuffer("aaaaa"); StringBuffer sbb = new StringBuffer("bbbbb"); System.out.println("sba = " + sba); System.out.println("sbb = " + sbb); f(sba, sbb); System.out.println("sba = " + sba); System.out.println("sbb = " + sbb); } public static void f(StringBuffer sb1, StringBuffer sb2) { sb1 = new StringBuffer("ccccc"); sb2.append("ddddd"); } } 【練習 20】 class AnotherObject { int i; String s; double d; AnotherObject(int i, String s, double d) { this.i = i; this.s = s; this.d = d; } void display() { System.out.println("i = " + i + "; s = " + s + "; d = " + d); } } class L0520 { public static void main(String args[]) { AnotherObject ao1 = new AnotherObject(5, "Hello", 3.4E100); AnotherObject ao2 = ao1; ao1.display(); ao2.display(); ao1.i = 3; ao1.s = "New string"; ao1.d = 6.02E23; ao2.display(); } } 課題:財布クラスを作成しなさい。持ち主、残高、入出金などが出来るように考える。

C:¥user¥java>java L0519 sba = aaaaa sbb = bbbbb sba = aaaaa sbb = bbbbbddddd

C:¥user¥java>java L0520 i = 5; s = Hello; d = 3.4E100 i = 5; s = Hello; d = 3.4E100 i = 3; s = New string; d = 6.02E23

Page 69: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

69

《参考》 外部入力部品 の例

import java.io.*; public class Typein { public static void displayPrompt(String prompt) { System.out.print(prompt + " "); System.out.flush(); } public static void inErase() { int dummy;

try { while((System.in.available()) != 0) dummy = System.in.read();

} catch(java.io.IOException e) { System.out.println("入力エラー ");

} } public static String inString(String prompt) { inErase(); displayPrompt(prompt); return inString4String(); } public static String inString4String(){ String s=""; try { BufferedReader r = new BufferedReader(new InputStreamReader(System.in), 1); s = r.readLine(); } catch (java.io.IOException e) { System.out.println("入力エラー "); } return s; } public static String inString() { int oneChar; String str = ""; boolean finished = false; while(!finished) {

try { oneChar = System.in.read(); if (oneChar < 0 || (char)o neChar == '¥n') finished = true; else if ((char)oneChar != '¥r') str = str + (char) oneChar; } catch(java.io.IOException e) { System.out.println("入力エラー"); finished = true;

} } return str; } public static int inInt(String prompt) { while(true) {

inErase(); displayPrompt(prompt);

try { return Integer.valueOf(inString().trim()).intValue(); } catch(NumberFormatException e) { System.out.println("整数値を入力してください "); } } } public static char inChar(String prompt) { int oneChar = 0;

inErase(); displayPrompt(prompt); try {

oneChar = System.in.read(); } catch(java.io.IOException e) { System.out.println("入力エラー ");

} inErase(); return (char) oneChar;

} public static double inDouble(String prompt) { while(true) { inErase();

displayPrompt(prompt); try {

return Double.valueOf(inString().trim()).do ubleValue(); } catch(NumberFormatException e) { System.out.println("(浮動)小数点数値を入力してください "); } } } }

public class Driver { public static void main(String[] args) { double x, area; int y,area2; char c; String s; x = Typein.inDouble("正方形の一辺> "); area = x*x; System.out.println("面積: " + area); y = Typein.inInt("正方形の一辺 (整数 )> "); area2 = y*y; System.out.println("面積: " + area2); c = Typein.inChar("一文字> "); System.out.println("一文字:" + c); s = Typein.inString("文字列> "); System.out.println("文字列:" + s); } }

C:¥user¥java >java Driver 正方形の一辺> zzz (浮動)小数点数値を入力してください 正方形の一辺> 1.2 面積:1.44 正方形の一辺 (整数 )> a 整数値を入力してください 正方形の一辺 (整数 )> 13 面積:169 一文字> abc 一文字:a 文字列> xyz 文字列:xyz

Page 70: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

70

6.継承 クラス java.lang.Object がルートクラス 親子関係のクラス(スーパクラス、サブクラス)の例

class Point { int x, y; }

final class ColoredPoint extends Point { int color; }

class Colored3dPoint extends ColoredPoint { int z; } // error

この例は,次の関係をもつ。

クラス Point は,java.lang.Object の直接的サブクラスとする。

クラス java.lang.Object は,クラス Point の直接的スーパクラスとする。

クラス ColoredPoint は,クラス Point の直接的サブクラスとする。

クラス Point は,クラス ColoredPoint の直接的スーパクラスとする。

クラス Colored3dPoint の宣言は,final クラス ColoredPoint を拡張しようとしているの

で,コンパイル時エラーが発生する。

サブクラス(subclass)の関係は,直接的サブクラス関係の推移的閉包(transitive

closure)とする。次のいずれかが真ならば,クラス A は,クラス C のサブクラスとする。

A が C の直接的サブクラス。

A が B のサブクラス,及び B が C のサブクラスとなるクラス B が存在する。た

だし,この定義は,再帰的に適用される。

A が C のサブクラスであるときは必ず,クラス C は,クラス A の スーパクラス

(superclass) であると呼ぶ。

次に例を示す。

class Point { int x, y; }

class ColoredPoint extends Point { int color; }

final class Colored3dPoint extends ColoredPoint { int z; }

この例での関係は,次のとおり。

クラス Point は,クラス ColoredPoint のスーパクラスとする。

クラス Point は,クラス Colored3dPoint のスーパクラスとする。

クラス ColoredPoint は,クラス Point のサブクラスとする。

クラス ColoredPoint は,クラス Colored3dPoint のスーパクラスとする。

クラス Colored3dPoint は,クラス ColoredPoint のサブクラスとする。

クラス Colored3dPoint は,クラス Point のサブクラスとする。

Page 71: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

71

クラスは,その直接的スーパクラスから,クラス内でコードにアクセス可能であり,クラ

ス内の宣言によって上書き又は隠ぺいされていないスーパクラスのすべてのメソッドを

(abstract であってもなくても)継承(inherits) する。

クラスがインスタンスメソッドを宣言している場合,そのメソッド宣言は,そのクラスの

スーパクラス内で同じシグネチャをもつ任意及びすべてのメソッドを上書き(override)す

ると呼ぶ。上書きされなければ,そのスーパクラスのメソッドは,クラス内のコードから

アクセス可能とする。また,クラスで宣言されたメソッドが abstract でなければ,そのメ

ソッドの宣言は,クラスのスーパクラスで同じシグネチャをもつ任意及びすべての

abstract 宣言のメソッドを 実装(implement) すると呼ぶ。実装されなければ,そのスー

パクラスのメソッドは,クラス内のコードからアクセス可能とする。

クラスの二つのメソッド(両方とも同じクラスで宣言されているか,両方とも一つのクラス

から継承されているか,又は一方は,宣言され他方は継承されているか,にかかわらず) が

同じ名前をもつが異なるシグネチャをもてば,メソッド名は,オーバロード(overloaded)

されたと呼ぶ。

Page 72: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

72

【練習 1】 class W { //子、孫、曾孫と情報が引き継がれる float f; } class KO extends W { StringBuffer sb; } class MAGO extends KO { String s; } class HIMAGO extends MAGO { Integer i; } class L0601 { public static void main(String args[]) { HIMAGO hi = new HIMAGO(); hi.f = 4.567f; hi.sb = new StringBuffer("abcde"); hi.s = "今日は暑い"; hi.i = new Integer(41); System.out.println("hi.f = " + hi.f); System.out.println("hi.sb = " + hi.sb); System.out.println("hi.s = " + hi.s); System.out.println("hi.i = " + hi.i); } } 【練習 2】 class E { //継承の打消し、先祖の変数を隠す int x; } class F extends E { String x; } class L0602 { public static void main(String args[]) { F f = new F(); f.x = "ここはどこ?"; System.out.println("f.x = " + f.x); E e = new E(); e.x = 45; System.out.println("e.x = " + e.x); } }

C:¥user¥java>java L0601 hi.f = 4.567 hi.sb = abcde hi.s = 今日は暑い hi.i = 41

C:¥user¥java>java L0602 f.x = ここはどこ? e.x = 45

Page 73: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

73

【練習 3】 class P { //静的変数も、継承の打消し、先祖の変数を隠す static int x; } class Q extends P { static String x; } class L0603 { public static void main(String args[]) { P p = new P(); p.x = 55; System.out.println("p.x = " + p.x); Q q = new Q(); q.x = "私は誰?"; System.out.println("q.x = " + q.x); } } 【練習 4】 class M100 { //隠された変数をキーワード super を用いて参照 int i = 100; } class M200 extends M100 { int i = 200; void display() { System.out.println("i = " + i); System.out.println("super.i = " + super.i); } } class L0604 { public static void main(String args[]) { M200 m200 = new M200(); m200.display(); } }

C:¥user¥java>java L0603 p.x = 55 q.x = 私は誰?

C:¥user¥java>java L0604 i = 200 super.i = 100

Page 74: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

74

【練習 5】 class A1 { //オブジェクトの型は C1で、かつ、割り当てられたものも C1 void hello() { System.out.println("私は A1"); } } class B1 extends A1 { void hello() { System.out.println("私は B1"); } } class C1 extends B1 { void hello() { System.out.println("私は C1"); } } class L0605 { public static void main(String args[]) { C1 obj = new C1(); obj.hello(); } } 【練習 6】 class A2 { void hello() { //オブジェクトの型は A2でも、割り当てられたものは C2 //メソッドのオーバーライド System.out.println("私は A2"); } } class B2 extends A2 { void hello() { System.out.println("私は B2"); } } class C2 extends B2 { void hello() { System.out.println("私は C2"); } } class L0606 { public static void main(String args[]) { A2 obj = new C2(); obj.hello(); } }

C:¥user¥java>java L0605 私は C1

C:¥user¥java>java L0606 私は C2

Page 75: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

75

【練習 7】 class I1 { //キーワード super のハシゴ void hello(String s) { System.out.println("I1: " + s); } } class J1 extends I1 { void hello(String s) { super.hello(s); System.out.println("J1: " + s); } } class K1 extends J1 { void hello(String s) { super.hello(s); System.out.println("K1: " + s); } } class L0607 { public static void main(String args[]) { System.out.println("I1 のインスタンス作成"); I1 obj = new I1(); obj.hello("オハヨウ"); System.out.println("J1 のインスタンス作成"); obj = new J1(); obj.hello("こんにちは"); System.out.println("K1 のインスタンス作成"); obj = new K1(); obj.hello("今晩は"); } }

C:¥user¥java>java L0607 I1 のインスタンス作成 I1: オハヨウ J1 のインスタンス作成 I1: こんにちは J1: こんにちは K1 のインスタンス作成 I1: 今晩は J1: 今晩は K1: 今晩は

Page 76: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

76

【練習 8】 class S1 { //スーパークラスとサブクラスのどちらのコンストラクタが先に動く? int s1; S1() { System.out.println("S1 のコンストラクタ"); s1 = 1; } } class T1 extends S1 { int t1; T1() { System.out.println("T1 のコンストラクタ"); t1 = 2; } } class U1 extends T1 { int u1; U1() { System.out.println("U1 のコンストラクタ"); u1 = 3; } } class L0608 { public static void main(String args[]) { U1 u1 = new U1(); System.out.println("u1.s1 = " + u1.s1); System.out.println("u1.t1 = " + u1.t1); System.out.println("u1.u1 = " + u1.u1); } }

C:¥user¥java>java L0608 S1 のコンストラクタ T1 のコンストラクタ U1 のコンストラクタ u1.s1 = 1 u1.t1 = 2 u1.u1 = 3

Page 77: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

77

【練習 9】 class S2 { //スーパークラスのコンストラクタを明示的に呼び出し int s2; S2(int s2) { System.out.println("S2 のコンストラクタ"); this.s2 = s2; } } class T2 extends S2 { int t2; T2(int s2, int t2) { super(s2); System.out.println("T2 のコンストラクタ(super(s2)後)"); this.t2 = t2; } } class U2 extends T2 { int u2; U2(int s2, int t2, int u2) { super(s2, t2); System.out.println("U2 のコンストラクタ(super(s2,t2)後)"); this.u2 = u2; } } class L0609 { public static void main(String args[]) { U2 u2 = new U2(1, 2, 3); System.out.println("u2.s2 = " + u2.s2); System.out.println("u2.t2 = " + u2.t2); System.out.println("u2.u2 = " + u2.u2); } } C:¥user¥java>java L0609

S2 のコンストラクタ T2 のコンストラクタ(super(s2)後) U2 のコンストラクタ(super(s2,t2)後) u2.s2 = 1 u2.t2 = 2 u2.u2 = 3

Page 78: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

78

【練習 10】 abstract class 形 { //抽象クラス・・・インスタンスは生成できない! abstract void 表示(); //メソッドに何も記述が無い!実装は、サブクラスで行う //通常複数のサブクラスがある } // サブクラスで実装するメソッドを事前に定める class 円 extends 形 { void 表示() { System.out.println("円形"); } } class 四角 extends 形 { void 表示() { System.out.println("四角形"); } } class 三角 extends 形 { void 表示() { System.out.println("三角形"); } // 課題:この「表示()」メソッドをコメントにすると何が起こる? } class L0610 { public static void main(String args[]) { 形 形のオブジェ = new 円(); System.out.println("オブジェクト->"+形のオブジェ); 形のオブジェ.表示(); 形のオブジェ = new 四角(); System.out.println("オブジェクト->"+形のオブジェ); 形のオブジェ.表示(); 形のオブジェ = new 三角(); System.out.println("オブジェクト->"+形のオブジェ); 形のオブジェ.表示(); } } 【練習 11】 final class V1 { //キーワード final は、サブクラスを持てない(拡張できない) } //つまり、このプログラムをコンパイルすると・・・ class V2 extends V1 { } class L0611 { public static void main(String args[]) { V1 obj = new V1(); } }

C:¥user¥java>java L0610 オブジェクト->円@11a698a 円形 オブジェクト->四角@107077e 四角形 オブジェクト->三角@7ced01 三角形

C:¥user¥java>javac L0611.java L0611.java:4: final V1 からは継承できません。 class V2 extends V1 { ^ エラー 1 個

Page 79: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

79

【練習 12】 class L { //定数を定義するために、キーワード final を変数の修飾に使う static final double tax = 0.05; static final String taxName="消費税"; } class L0612 { public static void main(String args[]) { System.out.println("二千円の本の" + L.taxName +"は、"+ (int)(2000*L.tax) + "円で

す"); } } 【練習 13】 class Person { //コンストラクタの修飾 public,private String name; int age; public Person(String name, int age) { this.name = name; this.age = age; } private Person() { } } class L0613 { public static void main(String args[]) { // public コンストラクタは呼び出せる Person p1 = new Person("太郎", 30); System.out.println(p1.name); System.out.println(p1.age); // private コンストラクタは呼び出せない // Person p2 = new Person(); //この行を生かすと、コンパイルは・・・? } }

C:¥user¥java>java L0612 二千円の本の消費税は、100 円です

C:¥user¥java>java L0613 太郎 30

Page 80: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

80

【練習 14】 abstract class JetPlane { //ポリモーフィズム:サブクラス毎に、異なるメソッドの実装 abstract int numEngines(); } class DC8 extends JetPlane { int numEngines() { return 4; } } class DC10 extends JetPlane { int numEngines() { return 3; } } class L0614 { public static void main(String args[]) { JetPlane j1 = new DC8(); JetPlane j2 = new DC10(); System.out.println("DC10 のエンジンは"+new DC10().numEngines()); System.out.println("DC8 のエンジンは"+new DC8().numEngines()); System.out.println("j1 のエンジンは"+j1.numEngines()); System.out.println("j2 のエンジンは"+j2.numEngines()); System.out.println("j1 のクラスは"+j1.getClass()); System.out.println("j2 のクラスは"+j2.getClass()); } }

C:¥user¥java>java L0614 DC10 のエンジンは 3 DC8 のエンジンは 4 j1 のエンジンは 4 j2 のエンジンは 3 j1 のクラスは class DC8 j2 のクラスは class DC10

Page 81: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

81

【練習 15】 class Singleton { //singleton クラス(生成できるクラスが 1 個だけ)の実験 static Singleton singleton; private Singleton() { } public static Singleton getInstance() { if(singleton == null) singleton = new Singleton(); return singleton; } } class NoSingleton { static NoSingleton nosingleton; private NoSingleton() { } public static NoSingleton getInstance() { nosingleton = new NoSingleton(); return nosingleton; } } class L0615 { public static void main(String args[]) { Singleton s1 = Singleton.getInstance(); Singleton s2 = Singleton.getInstance(); if (s1 == s2) System.out.println("Equal---Singleton,s1="+s1+”,s2=”+s2); else System.out.println("Not equal---Singleton,s1="+s1+”,s2=”+s2); NoSingleton nos1 = NoSingleton.getInstance(); NoSingleton nos2 = NoSingleton.getInstance(); if (nos1 == nos2) System.out.println("Equal---NoSingleton,nos1="+nos1+",nos2="+nos2); else System.out.println("Not equal---NoSingleton,nos1="+nos1+",nos2="+nos2); } }

C:¥user¥java>java L0615 Equal---Singleton,s1=Singleton@194df86,s2=Singleton@194df86 Not equal---NoSingleton,nos1=NoSingleton@f5da06,nos2=NoSingleton@bd0108

Page 82: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

82

【練習 16】 class L0616 {//オブジェクトやクラスでの toString()メソッドのオーバーライド(1) public static void main(String args[]) { Integer obj1 = new Integer(8); Class cls = obj1.getClass(); System.out.println(cls); String obj2 = new String("abc"); cls = obj2.getClass(); System.out.println(cls); } } 【練習 17】 class Hoge { //オブジェクトやクラスでの toString()メソッドのオーバーライド(2) static int i = 7; int j; Hoge(int j) { this.j = j; } public String toString() { return "Hoge: i = " + i + "; j = " + j; } } class L0617 { public static void main(String args[]) { Hoge hogehoge = new Hoge(23); System.out.println(hogehoge); } } 【練習 18】 class L0618 { //何が表示されるでしょううか?(3) public static void main(String args[]) { Integer obj = new Integer("7"); Class cls = obj.getClass(); Class supercls = cls.getSuperclass(); System.out.println(cls.getName()); System.out.println(supercls.getName()); } }

C:¥user¥java>java L0616 class java.lang.Integer class java.lang.String

C:¥user¥java>java L0617 Hoge: i = 7; j = 23

C:¥user¥java>java L0618 java.lang.Integer java.lang.Number

Page 83: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

83

【練習 19】 応用例 abstract class Computer { String serial; String spStrings = " " ; /* 20 byte space */ String sp; String name; public Computer(String serial) { this.serial = serial; } abstract double getWeights(); abstract String getCPU(); public String toString() { Class cls = getClass(); name = cls.getName(); sp = spStrings.substring(0,15-name.length()); //この sp を使わないと実行結果1 return name + sp +": " + //この sp を使うと実行結果2(見やすいでしょ?) serial + " " + getWeights()+ " " + getCPU(); } } class ThinkPadA30 extends Computer { final static double WEIGHTS = 3.4; final static String CPU = "モバイル インテル Celeron プロセッサ 1.20GHz"; public ThinkPadA30(String serial) { super(serial); } public double getWeights() { return WEIGHTS; } public String getCPU() { return CPU; } } class ThinkPadX30 extends Computer { final static double WEIGHTS = 1.7; final static String CPU = "モバイル インテル Pentium III プロセッサ 1.20GHz-M"; public ThinkPadX30(String serial) { super(serial); } public double getWeights() { return WEIGHTS; } public String getCPU() { return CPU; } }

Page 84: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

84

class IBMNetVistaA30 extends Computer { final static double WEIGHTS = 7.4; final static String CPU = "インテル Pentium4 プロセッサ 1.80 GHz"; public IBMNetVistaA30(String serial) { super(serial); } public double getWeights() { return WEIGHTS; } public String getCPU() { return CPU; } } class L0619 { static int NUM_max = 6; public static void main(String args[]) { // 領域を宣言して割り当てる Computer computers[] = new Computer[NUM_max]; // パソコンの作成 computers[0] = new ThinkPadA30("tp12345"); computers[1] = new IBMNetVistaA30("dt01234"); computers[2] = new ThinkPadX30("tp12346"); computers[3] = new ThinkPadX30("tp12347"); computers[4] = new ThinkPadA30("tp12348"); computers[5] = new IBMNetVistaA30("dt01235"); // パソコンの表示 for(int i = 0; i < NUM_max; i++) { Computer a = computers[i]; System.out.println(a); } } } 実行結果1 実行結果2 C:¥user¥java>java L0619 ThinkPadA30 : tp12345 3.4 モバイル インテル Celeron プロセッサ 1.20GHz

IBMNetVistaA30 : dt01234 7.4 インテル Pentium4 プロセッサ 1.80 GHz

ThinkPadX30 : tp12346 1.7 モバイル インテル Pentium III プロセッサ 1.20GHz-M

ThinkPadX30 : tp12347 1.7 モバイル インテル Pentium III プロセッサ 1.20GHz-M

ThinkPadA30 : tp12348 3.4 モバイル インテル Celeron プロセッサ 1.20GHz

IBMNetVistaA30 : dt01235 7.4 インテル Pentium4 プロセッサ 1.80 GHz

C:¥user¥java>java L0619

ThinkPadA30null: tp12345 3.4 モバイル インテル Celeron プロセッサ 1.20GHz

IBMNetVistaA30null: dt01234 7.4 インテル Pentium4 プロセッサ 1.80 GHz

ThinkPadX30null: tp12346 1.7 モバイル インテル Pentium III プロセッサ 1.20GHz-M

ThinkPadX30null: tp12347 1.7 モバイル インテル Pentium III プロセッサ 1.20GHz-M

ThinkPadA30null: tp12348 3.4 モバイル インテル Celeron プロセッサ 1.20GHz

IBMNetVistaA30null: dt01235 7.4 インテル Pentium4 プロセッサ 1.80 GHz

Page 85: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

85

7.インターフェースとパッケージ

インタフェース宣言は,メンバを定数及び抽象メソッドとする新しい参照型を導入する。

この型は実装をもたないが,関係ないクラスがその抽象メソッドに実装を提供することで,

そのインタフェースを実装できる。

Java プログラムは,パッケージの集合で構成する。各パッケージは,型に対する名前の

独自の集合をもつが,これが名前の衝突を防ぐのを支援する。型は,public と宣言した場

合に限り,それを宣言しているパッケージの外部からアクセス可能とする。

パッケージの名前付けの構造は階層的とする。

一つのコンパイル単位は,次の三つの部分からなる。それぞれは省略可能とする。

package 宣言。コンパイル単位が属するパッケージの完全限定名を与える。

import 宣言。他のパッケージの型を単純名で参照可能とする。

クラス及びインタフェース型の型宣言。

小規模なプログラム及び暫定的な開発では,パッケージに名前を付けなかったり,単純名

を用いることもできるが,Java コードを広く配布する場合は,一意なパッケージ名を選択

することが望ましい。これによって,二つの開発グループが偶然同じパッケージ名を使用

し,それらのパッケージを後に一つのプログラムで使用する場合に発生する名前の衝突を

防ぐことができる。

Page 86: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

86

【練習 1】 import java.text.DecimalFormat; class L0701 { public static void main(String args[]) { if (args.length!=2) { // 引数のエラーチェックの例 System.out.println("身長(m) 体重(kg) の 2 つの引数を入れてください"); return; } double h = Double.valueOf(args[0]).doubleValue(); double w = Double.valueOf(args[1]).doubleValue(); DecimalFormat formPattern = new DecimalFormat(); // format パターンが使える formPattern.applyPattern("#,###.00"); DecimalFormat formPatternH = new DecimalFormat(); // format パターン formPatternH.applyPattern("###.0"); System.out.println("体重=" + formPattern.format(w)); System.out.println("身長=" + formPattern.format(h)); System.out.println("肥満度=" + formPatternH.format(w/(h*h))); } } 【練習 2】 import java.text.DecimalFormat; interface taijyu { // メソッドの宣言を集めたもの(実装しない!)親 double getStandardWeight(); } interface weight extends taijyu { //メソッドの宣言を集めたもの(実装しない!)子 double getHimando(); } interface sex { // 定数の定義ができる String male = "m"; String female = "f"; } class Volume { double height, weight; Volume(double height, double weight) { this.height = height; this.weight = weight; } } abstract class Person { abstract void display(); } class Male extends Person implements weight { //メソッドの実装を行う Volume v; Male(Volume v) { this.v = v; } public void display() { System.out.println("男性"); } public double getStandardWeight() { return (v.height-80)*0.7; } public double getHimando() { return v.weight*100/getStandardWeight() - 100; } }

C:¥user¥java>java L0701 1.72 85.0 体重=85.00 身長=1.72 肥満度=28.7

Page 87: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

87

class Female extends Person implements weight { //メソッドの実装を行う Volume v; Female(Volume v) { this.v = v; } public void display() { System.out.println("女性"); } public double getStandardWeight() { return (v.height-70)*0.6; } public double getHimando() { return v.weight*100/getStandardWeight() - 100; } } class fugo { // マイナスの場合に▲を表示するために利用 public static String pm(double n) { if (n>=0) return ""; else return "▲"; } } class L0702 { public static void main(String args[]) { if (args.length!=3 || // 引数のエラーチェックの例 !args[0].equals(sex.male) & !args[0].equals(sex.female) ) { System.out.println(" 性別(m/f) 身長 体重 の3つの引数を入れてください"); return; } String s = args[0]; double h = Double.valueOf(args[1]).doubleValue(); double w = Double.valueOf(args[2]).doubleValue(); DecimalFormat formPattern = new DecimalFormat(); // format パターンが使える formPattern.applyPattern("#,###.00"); if (s.equals(sex.male)) { Male pp = new Male(new Volume(h,w)); pp.display(); System.out.println("標準体重=" + formPattern.format(pp.getStandardWeight())); System.out.println("肥満度=" + fugo.pm(pp.getHimando()) //Math.abs は絶対値

+ formPattern.format(Math.abs(pp.getHimando()))); } else { Female pp = new Female(new Volume(h,w)); pp.display(); System.out.println("標準体重=" + formPattern.format(pp.getStandardWeight())); System.out.println("肥満度=" + fugo.pm(pp.getHimando()) //Math.abs は絶対値

+ formPattern.format(Math.abs(pp.getHimando()))); } if (s instanceof String) System.out.println("s は String のインスタンスです"); } }

C:¥user¥java>java L0702 f 1.72 85.0 女性 標準体重=-40.97 肥満度=▲307.48 s は String のインスタンスです C:¥user¥java>java L0702 m 1.72 85.0 男性 標準体重=-54.80 肥満度=▲255.12 s は String のインスタンスです

Page 88: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

88

【練習 3】 //Java の練習用用フォルダの子供として、pフォルダを作成 // そのpフォルダの中に package pのプログラムを格納すること! ------------------------------A.java--------------------------------------- package p; public class A { public int aPublic = 11; // どこからでもアクセス可 protected int aProtected = 22; // 同一パッケージ or 子孫からはアクセス可(protected) private int aPrivate = 33; // 同一クラス内からのみアクセス可(private) public void a1() { System.out.println("a1"); } } ------------------------------B.java--------------------------------------- package p; public class B { public int bPublic = 44; // どこからでもアクセス可 protected int bProtected = 55; // 同一パッケージ or 子孫からはアクセス可(protected) private int bPrivate = 66; // 同一クラス内からのみアクセス可(private) public void b1() { System.out.println("b1"); } } ------------------------------C.java--------------------------------------- package p; class C { public static void main(String args[]) { A a = new A(); a.a1(); B b = new B(); b.b1(); System.out.println("c1"); System.out.println(a.aPublic); System.out.println(a.aProtected); // System.out.println(a.aPrivate); //同一クラス以外不可 System.out.println(b.bPublic); System.out.println(b.bProtected); // System.out.println(b.bPrivate); //同一クラス以外不可 } } // コンパイルは、pの親フォルダで、javac p¥*.java とコマンドを入れる // 実行は、同じ位置で、java p/C とコマンドを入れる。java p¥C は駄目!

C:¥user¥java>javac p¥*.java C:¥user¥java>java p/C a1 b1 c1 11 22 44 55 C:¥user¥java>java p.C a1 b1 c1 11 22 44 55

Page 89: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

89

【練習 4】 // pフォルダの兄弟としてqフォルダを作成し、そこに以下のプログラムを格納する ------------------------------PackageImport.java----------------------------- package q; import p.*; class L0704 extends A { public static void main(String args[]) { A a = new A(); a.a1(); B b = new B(); b.b1(); System.out.println(a.aPublic); // public メンバにアクセスできる //System.out.println(a.aProtected); // スーパークラスの protectedメンバにアクセスできない // System.out.println(a.aPrivate); // private メンバにはアクセスできない System.out.println(b.bPublic); // public メンバにアクセスできる // System.out.println(b.bProtected); // アクセスできない // System.out.println(b.bPrivate); // private メンバにはアクセスできない } } // コンパイル、実行は、上記のパッケージと同じ要領(p と q とは兄弟フォルダ) // q の親フォルダで、javac q¥*.java とコマンドを入れる // 実行は、同じ位置で、java q/ PackageImport とコマンドを入れる。

C:¥user¥java>javac q¥*.java C:¥user¥java>java q/L0704 a1 b1 11 44 C:¥user¥java>java q.L0704 a1 b1 11 44

Page 90: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

90

パッケージの参考情報 C:¥user¥java>javac saifuTest.java C:¥user¥java>java saifuTest お金不足。今太郎は、1200円持っている (1)太郎が 700円持っている (2)花子が 20500円持っている (3)太郎が 700円持っている C:¥user¥java>cd ¥java-temp C:¥java-temp>dir ドライブ C のボリューム ラベルは ローカル ディスク です ボリューム シリアル番号は 1071-7B8A です C:¥java-temp のディレクトリ 2004/07/29 00:08 <DIR> . 2004/07/29 00:08 <DIR> .. 0 個のファイル 0 バイト 2 個のディレクトリ 55,713,644,544 バイトの空き領域 C:¥java-temp>java -cp ¥user¥java saifuTest お金不足。今太郎は、1200円持っている (1)太郎が 700円持っている (2)花子が 20500円持っている (3)太郎が 700円持っている C:¥java-temp>java saifuTest Exception in thread "main" java.lang.NoClassDefFoundError: saifuTest C:¥java-temp>set classpath=¥user¥java C:¥java-temp>java saifuTest お金不足。今太郎は、1200円持っている (1)太郎が 700円持っている (2)花子が 20500円持っている (3)太郎が 700円持っている C:¥java-temp> ------------------------------------------------------------------- saifuTestX.javaプログラムの最初に以下に示す package 行がある。 package my.saifu; しかも、このファイルは、 c:¥user¥java¥my¥saifu¥saifuTestX.java というフォルダ構造になっている C:¥user¥java>javac my¥saifu¥saifuTestX.java C:¥user¥java>java my.saifu.saifuTestX お金不足。今太郎は、1200円持っている (1)太郎が 700円持っている (2)花子が 20500円持っている (3)太郎が 700円持っている

Page 91: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

91

------------------------------------------------------------------- C:¥user¥java>type saifuM.txt ManifestVersion: 1.0 Main-Class: saifuTest C:¥user¥java>jar cf saifu.jar Saifu.class C:¥user¥java>jar uf saifu.jar saifuTest.class C:¥user¥java>jar ufm saifu.jar saifuM.txt C:¥user¥java>java -jar saifu.jar お金不足。今太郎は、1200円持っている (1)太郎が 700円持っている (2)花子が 20500円持っている (3)太郎が 700円持っている ------------------------------------------------------------------- C:¥user¥java>jar cf saifuX.jar my¥saifu¥SaifuX.class C:¥user¥java>jar uf saifuX.jar my¥saifu¥saifuTestX.class C:¥user¥java>set classpath=my¥saifu¥saifuX.jar C:¥user¥java>move saifuX.jar my¥saifu¥ C:¥user¥java>java my.saifu.saifuTestX お金不足。今太郎は、1200円持っている (1)太郎が 700円持っている (2)花子が 20500円持っている (3)太郎が 700円持っている ------------------------------------------------------------------- C:¥user¥java>jar cf saifuXP.jar my¥saifu¥SaifuX.class C:¥user¥java>jar uf saifuXP.jar my¥saifu¥saifuTestX.class C:¥user¥java>jar ufm saifuXP.jar my¥saifu¥saifuM.txt C:¥user¥java>type my¥saifu¥saifuM.txt ManifestVersion: 1.0 Main-Class: my.saifu.saifuTestX C:¥user¥java>java -jar saifuXP.jar お金不足。今太郎は、1200円持っている (1)太郎が 700円持っている (2)花子が 20500円持っている (3)太郎が 700円持っている ------------------------------------------------------------------- C:¥user¥java¥my¥saifu>jar cf saifuXX.jar SaifuX.class C:¥user¥java¥my¥saifu>jar uf saifuXX.jar saifuTestX.class C:¥user¥java¥my¥saifu>jar ufm saifuXX.jar saifuM.txt C:¥user¥java¥my¥saifu>java -jar saifuXX.jar Exception in thread "main" java.lang.NoClassDefFoundError: my/saifu/saifuTestX C:¥user¥java¥my¥saifu>java -jar ..¥..¥saifuXP.jar お金不足。今太郎は、1200円持っている (1)太郎が 700円持っている (2)花子が 20500円持っている (3)太郎が 700円持っている

Page 92: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

92

=================================================================== //saifuTestX.javaのソース package my.saifu; class SaifuX { private String name; private int amount; SaifuX(String name, int amount) { this.name=name; this.amount=amount; } void in(int amount) { this.amount += amount; } boolean out(int amount) { if (this.amount>=amount) { this.amount -= amount; return true; } else return false; } String getName() { return this.name; } int getAmount() { return this.amount; } } class saifuTestX { public static void main(String[] args) { SaifuX s1 = new SaifuX("太郎",1000); SaifuX s2 = new SaifuX("花子",2000); s1.in(200); if (s1.out(2000)==false) System.out.println("お金不足。今"+s1.getName()+"は、"+s1.getAmount()+"円持っている"); s1.out(500); s2.out(1500); s2.in(20000); System.out.println("(1)"+s1.getName()+"が"+s1.getAmount()+"円持っている"); System.out.println("(2)"+s2.getName()+"が"+s2.getAmount()+"円持っている"); s2=s1; //こうすると何が起こるか?注目! System.out.println("(3)"+s2.getName()+"が"+s2.getAmount()+"円持っている"); } }

Page 93: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

93

8.例外

Java プログラムが,Java 言語の意味制約に違反するとき,Java 仮想計算機は,このエラ

ーを例外(exception)としてプログラムに知らせる。それらの違反の例として,配列境界の

外でのインデクス付けがある。あるプログラミング言語及びその処理系には,プログラム

を強制的に終了することによって,それらのエラーに対応するものがある。他のプログラ

ム言語では,処理系が任意又は予測不能な方法で対応することを許しているものもある。

これらの方法のいずれも,Java の設計目標,移植性及び頑健性とは適合しない。代わりに,

Java は,意味制約に違反したとき,例外を投げ,例外が発生した点からプログラマが指定

可能な点への非局所的な制御の移動を引き起こすことを規定している。例外は,それが発

生した点から投げられる(thrown)と言い,制御が移動する点で捕捉される(caught)と言う。

Java プログラムは,throw 文を使用して,明示的に例外を投げることもできる。これは,

普通なら負の値を期待しないところで整数値-1 のような予期しない値を返し,エラー条件

を処理する古風な方式の代替手段を提供する。経験的に,その予期しない値は,呼び出し

元で無視されるか又は検査されないことが多いことが知られており,頑健的でない若しく

は望ましくない振舞い又はその両方をプログラムにもたらす。

すべての例外は,クラス Throwable のインスタンス又はそのサブクラスの一つによって表

現される。それらのオブジェクトは,例外が発生する点からそれを捕捉するハンドラへと

情報を運ぶために使用される。ハンドラは,try 文の catch 節によって構築される。例外

を投げる過程において,Java 仮想計算機は,現在のスレッド内で開始はしたが完了してい

ない,任意の式,文,メソッド及びコンストラクタ呼出し,静的初期化子並びにフィール

ド初期化式を,一つずつ中途完了する。この処理は,その例外のクラス又はその例外のク

ラスのスーパクラスの名前を指定することによってその特定の例外を扱うことを示すハン

ドラを見つけるまで続けられる。

例外の原因

例外は,次の三つの理由(reasons)の内の一つによって投げられる。

異常な実行状態が,Java 仮想計算機によって同期的に検出された。その条件は,

次の理由で発生する。

o 式の評価が,Java 言語の正常な意味規則に違反した。 例えば,ゼロによ

る除算など。

o Java プログラムのロード又はリンクの部分で,エラーが発生した。

o 資源の限界を超過した。 例えば,あまりにも多くのメモリを使用したなど。

Page 94: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

94

Java コードが,throw 文を実行した。

非同期な例外が,次のいずれかの理由で発生した。

o クラス Thread のメソッド stop を呼び出した。

o 仮想計算機内で内部エラーが発生した。

例外は,クラス Throwable のインスタンス及びそのサブクラスのインスタンスによって表

現される。これらのクラスをまとめて,例外クラス(exception classes)とする。

パッケージ java.lang の標準実行時例外定義

ArithmeticException:除数ゼロでの整数除算演算などの例外的な計算状況が発生

した。

ArrayStoreException:配列の要素の型と代入互換でないクラスの値を配列要素に

格納しようとした。

ClassCastException:オブジェクトへの参照を不適切な型へキャストしようとした。

IllegalArgumentException:メソッドに,不当若しくは不適切な引数が渡された,

又はメソッドが不適切なオブジェクトで呼び出された。このクラスは次のサブクラ

スを含む。

o IllegalThreadStateException:要求された操作に対してスレッドが適切な

状態になかった。

o NumberFormatException:String を数値型の値へ変換しようとしたが,そ

の String が適切な形式をもっていなかった。

IllegalMonitorStateException:スレッドが,ロックされていないオブジェクトを

待機している他のスレッドを,待機,又は通知しようとした。

IndexOutOfBoundsException:(配列,文字列若しくはベクトルを参照する)ある種

のインデクス,又は二つのインデクス値若しくは一つのインデクス及び一つの長さ

のいずれかで規定される範囲が,領域を越えた。

NegativeArraySizeException:負の長さで配列を生成しようとした。

NullPointerException:オブジェクト参照を要求されるところで,空参照をしよう

とした。

SecurityException:セキュリティ違反を検出した。

パッケージ java.util の付加的な標準非検査実行時例外定義

java.util.EmptyStackException:空スタックの要素にアクセスしようとした。

java.util.NoSuchElementException:空ベクトルの要素にアクセスしようとした。

Page 95: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

95

【練習 1】 class L0801 { //何が起こるか、行番号の表示のされかたを確認すること public static void main(String args[]) { a(); } static void a() { b(); } static void b() { c(); } static void c() { d(); } static void d() { int i = 1; int j = 0; System.out.println(i/j); } } 【練習 2】 class L0802 { public static void main(String args[]) { try { //例外発生の監視対象ブロック System.out.println("Before Division"); int i = Integer.parseInt(args[0]); int j = Integer.parseInt(args[1]); System.out.println(i/j); System.out.println("After Division"); } catch (ArithmeticException e) { // catch ブロック:例外発生の種類毎の対応 System.out.println("ArithmeticException"); } catch (ArrayIndexOutOfBoundsException e) { System.out.println("ArrayIndex" + "OutOfBoundsException"); } catch (NumberFormatException e) { System.out.println("NumberFormatException"); } finally { //省略可。try が正常に処理された場合 try に return があっても必ず実行 System.out.println("Finally block"); } } } 確認して欲しい内容・・・以下の実行時に何が表示されるか? 1.java L0802 10 2 2.java L0802 10 0 3.java L0802 10 a 4.java L0802 10 5.java L0802 aa 6.java L0802

C:¥user¥java>java L0801 Exception in thread "main" java.lang.ArithmeticException: / by zero at L0801.d(L0801.java:9) at L0801.c(L0801.java:5) at L0801.b(L0801.java:4) at L0801.a(L0801.java:3) at L0801.main(L0801.java:2)

C:¥user¥java>java L0802 10 2 Before Division 5 After Division Finally block

Page 96: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

96

【練習 3】 class L0803 { public static void main(String args[]) { try { Object obj = new Integer("85"); System.out.println("Before cast"); Integer inObj = (Integer)obj; System.out.println("After cast by Integer"); Double dbObj = (Double)obj; System.out.println("After cast by Double"); } catch (Exception e) { System.out.println(e); } finally { // これは動くか? 言語仕様 5.5p.72 参照 System.out.println("例外処理後、これが動く"); } } } 【練習 4】 //例外発生個所に catch が無いと、上にサカノボッテ、マッチする例外条件を探す class L0804 { public static void main(String args[]) { try { System.out.println("Before a"); a(); System.out.println("After a"); } catch (Exception e) { // これは動くか? System.out.println("main: " + e); } finally { // これは動くか? System.out.println("main: finally"); } } public static void a() { try { System.out.println("Before b"); b(); System.out.println("After b"); } catch (ArithmeticException e) { // これは動くか? System.out.println("a: " + e); } finally { // これは動くか? System.out.println("a: finally"); } }

C:¥user¥java>java L0803 Before cast After cast by Integer java.lang.ClassCastException 例外処理後、これが動く

Page 97: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

97

public static void b() { try { System.out.println("Before c"); c(); System.out.println("After c"); } catch (ArrayIndexOutOfBoundsException e) { // これは動くか? System.out.println("b: " + e); } finally { // これは動くか? System.out.println("b: finally"); } } public static void c() { try { System.out.println("Before d"); d(); System.out.println("After d"); } catch (NumberFormatException e) { // これは動くか? System.out.println("c: " + e); } finally { // これは動くか? System.out.println("c: finally"); } } public static void d() { try { int array[] = new int[4]; array[10] = 10; // ここで例外が発生 } catch (ClassCastException e) { //これは動くか? System.out.println("d: " + e); } finally { // これは動くか? System.out.println("d: finally"); } } }

C:¥user¥java>java L0804 Before a Before b Before c Before d d: finally c: finally b: java.lang.ArrayIndexOutOfBoundsException: 10 b: finally After b a: finally After a main: finally

Page 98: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

98

【練習 5】 class L0805 { // 二重に例外処理が重なった場合の動きを確認 public static void main(String args[]) { try { System.out.println("Before a"); a(); System.out.println("After a"); } catch (Exception e) { System.out.println("main: " + e); } finally { System.out.println("main: finally"); } } public static void a() { try { System.out.println("Before b"); b(); System.out.println("After b"); } catch (ArithmeticException e) { System.out.println("a: " + e); } finally { System.out.println("a: finally"); } } public static void b() { try { System.out.println("Before c"); c(); System.out.println("After c"); } catch (ArrayIndexOutOfBoundsException e) { System.out.println("b: " + e); } finally { System.out.println("b: finally"); } }

Page 99: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

99

public static void c() { try { System.out.println("Before d"); d(); System.out.println("After d"); } catch (NumberFormatException e) { System.out.println("c: " + e); } finally { System.out.println("c: finally"); } } public static void d() { try { Object obj = new Float("85.56"); System.out.println("Before cast"); Double dobj = (Double)obj; System.out.println("After cast"); } catch (ClassCastException e) { System.out.println("d: " + e); int i = 1; int j = 0; System.out.println("Before division"); int k = i/j; System.out.println("After division"); System.out.println(k); } finally { System.out.println("d: finally"); } } } 【練習 6】 class L0806 { //コンパイル時に引っかかるハズ。何故か?どうすれば良いか? public static void main(String args[]) { try { System.out.println("Try Block"); } catch (Exception e) { System.out.println("Exception"); } catch (ArithmeticException e) { System.out.println("ArithmeticException"); } } }

C:¥user¥java>java L0805 Before a Before b Before c Before d Before cast d: java.lang.ClassCastException Before division d: finally c: finally b: finally a: java.lang.ArithmeticException: / by zero a: finally After a main: finally

C:¥user¥java>javac L0806.java L0806.java:9: 例外 java.lang.ArithmeticException はすでにキャッチされています。 catch (ArithmeticException e) { ^ エラー 1 個

Page 100: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

100

【練習 7】 class L0807 { // throw で自分から例外を発生させることができる public static void main(String args[]) { try { System.out.println("Before a"); a(); System.out.println("After a"); } catch (ArithmeticException e) { System.out.println("main: " + e); } finally { System.out.println("main: finally"); } } public static void a() { try { System.out.println("Before b"); b(); System.out.println("After b"); } catch (ArithmeticException e) { System.out.println("a: " + e); } finally { System.out.println("a: finally"); } } public static void b() { try { System.out.println("Before c"); c(); System.out.println("After c"); } catch (ArithmeticException e) { System.out.println("b: " + e); } finally { System.out.println("b: finally"); } }

Page 101: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

101

public static void c() { try { System.out.println("Before d"); d(); System.out.println("After d"); } catch (ArithmeticException e) { System.out.println("c: " + e); throw e; } finally { System.out.println("c: finally"); } } public static void d() { try { int i = 1; int j = 0; System.out.println("Before division"); System.out.println(i/j); System.out.println("After division"); } catch (ArithmeticException e) { System.out.println("d: " + e); throw e; } finally { System.out.println("d: finally"); } } }

C:¥user¥java>java L0807 Before a Before b Before c Before d Before division d: java.lang.ArithmeticException: / by zero d: finally c: java.lang.ArithmeticException: / by zero c: finally b: java.lang.ArithmeticException: / by zero b: finally After b a: finally After a main: finally

Page 102: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

102

【練習 8】 class L0808 { //自分で例外を発生させる。finally が動くか確認すること。 public static void main(String args[]) { try { System.out.println("Before a"); a(); System.out.println("After a"); } catch (Exception e) { System.out.println("main: " + e); e.printStackTrace(); // printStackTrace()メソッド コメントにすると? } finally { System.out.println("main: finally"); } } public static void a() { try { System.out.println("Before throw statement"); throw new ArithmeticException(); } catch (Exception e) { System.out.println("a: " + e); e.printStackTrace(); // printStackTrace()メソッド コメントにすると? } finally { System.out.println("a: finally"); } } }

C:¥user¥java>java L0808 Before a Before throw statement a: java.lang.ArithmeticException java.lang.ArithmeticException at L0808.a(L0808.java:18) at L0808.main(L0808.java:5) a: finally After a main: finally

Page 103: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

103

【練習 9】 class L0809 { public static void main(String args[]) { a(); } public static void a() { try { b(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } // public static void b() { //この throws(s付き)をコメントにするとどうなるか? public static void b() throws ClassNotFoundException { c(); } // public static void c() { //この throws(s付き)をコメントにするとどうなるか? public static void c() throws ClassNotFoundException { Class cls = Class.forName("java.lang.Integer"); //これが例外発生になる可能性あり System.out.println(cls.getName()); System.out.println(cls.isInterface()); } }

C:¥user¥java>java L0809 java.lang.Integer false

Page 104: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

104

【練習 10】 import java.util.*; class L0810 { // 自分で独自の例外を作成することが出来る! public static void main(String args[]) { a(); } static void a() { try { b(); } catch (Exception e) { e.printStackTrace(); } } // static void b() { // こちらにかえるとコンパイルエラーが発生! static void b() throws ExceptionA { try { c(); } catch (ExceptionB e) { e.printStackTrace(); } } static void c() throws ExceptionA, ExceptionB { Random random = new Random(); int i = random.nextInt(); // 乱数発生 if(i % 2 == 0) { throw new ExceptionA("余りがゼロ i=" + i); } else { throw new ExceptionB("余りが有る i=" + i); } } } class ExceptionA extends Exception { public ExceptionA(String message) { super(message); } } class ExceptionB extends Exception { public ExceptionB(String message) { super(message); } }

C:¥user¥java>java L0810 ExceptionB: 余りが有る i=-708509015 at L0810.c(L0810.java:30) at L0810.b(L0810.java:17) at L0810.a(L0810.java:8) at L0810.main(L0810.java:4)

Page 105: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

105

9.マルチスレッドプログラミング

これまでの記述の大半は,文又は式を,一度に一つ,つまり一つの スレッド(thread) で

実行する Java コードの振舞いだけに関係していたが,Java 仮想計算機は,一度に多数の

スレッドを実行することができる。これらのスレッドは,共有主メモリに存在する Java

の値及びオブジェクトを操作する Java コードを独立して実行する。複数のスレッドは,複

数のハードウェアプロセッサを搭載したり,一つのハードウェアプロセッサを時分割した

り,又は複数のハードウェアプロセッサを時分割することによって,実現してもよい。

Java は,スレッドの並行活動を 同期化する(synchronizing) 機構を提供することによっ

て,並行的だが決定論的な振舞いを示すプログラムを支援する。スレッドを同期化するた

めに,Java では,モニタ(monitor) を使用する。モニタは,モニタが保護するコード領域

を一度にただ一つのスレッドだけが実行可能にするための高度な機構とする。モニタの振

舞いは,ロック(lock) によって表現する。各オブジェクトには,一つのロックが存在する。

synchronized 文は,マルチスレッド操作にだけ関係する次の二つの特別な動作を実行する。

オブジェクトへの参照の計算後及びその本体の実行前に,そのオブジェクトに関連

する ロック設定 をする。

オブジェクト本体の実行が正常完了又は中途完了した後,そのロックの ロック解

除(unlock) をする。

便宜上,メソッドを synchronized 宣言してよい。このようなメソッドは,その本体が

synchronized 文に含まれているかのように動作する。

クラス Object のメソッド wait, notify,及び notifyAll は,一つのスレッドから他の

スレッドへの効率的な制御の転送を提供する。スレッドは,計算に手間のかかる,単なる

“スピン”(内部状態の変化の有無を知るために,オブジェクトのロック設定とロック解

除を繰り返すこと)ではなく,むしろ他のスレッドが notify を使って目覚めさせるとき

まで wait でそれ自体を一時停止させることができる。これは,スレッドが(共通の資源

を共有するとき競合しないようにする)相互排他関係よりもむしろ,(共通の目標につい

て積極的に協力する)生産者-消費者関係をもつ状況に,特に適している。

スレッドは,コードを実行する際に一連の動作を実行する。スレッドは,変数の値を 使用

(use) したり,又は変数に新しい値を 代入(assign) してよい。(その他の動作として,

算術演算,条件検査,及びメソッド呼出しを含むが,これらは,直接には変数に関係しな

い。)複数の並行スレッドが,一つの共有変数に関して動作すれば,その変数への動作が

タイミング依存な結果となることがある。このタイミング依存性は,並行プログラミング

Page 106: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

106

固有のもので,Java において,この規格だけではプログラムの実行結果が決定できない数

少ない部分の一つとなる。

各スレッドは,作業メモリをもち,その中に,すべてのスレッドが共有する主メモリ上の

変数値の複製を保持してもよい。共有変数にアクセスするためには,スレッドは,通常ま

ずロックを取得し,その作業メモリをフラッシュする。これは,共有値が共有主メモリか

らスレッドの作業メモリにロードされることを保証する。スレッドがロックを解除すると

き,作業メモリに保持された値が主メモリに書き込まれることを保証する。

ここでは,特定の低水準の動作に関する,スレッドの主メモリとの相互作用,及びスレッ

ド同志の相互作用について規定する。これらの動作が発生してもよい順序についての規則

が存在する。これらの規則は,Java の任意の実装への制約を与え,Java プログラマは,規

則に依存することで並行 Java プログラムの可能な動作を予測できる。しかしながら,規

則では,意図的に開発者へ自由裁量を与えている。その意図は,並行コードの実行速度及

び効率の大幅向上を可能とする標準的なハードウェア及びソフトウェア技術を受け入れる

ためである。

規則の要点を次に示す。

同期化の構文を正しく使用することが,一つのスレッドから他のスレッドへの,共

有変数を介する値の転送又は値の設定を信頼できるものにする。

スレッドが変数の値を使用する場合,それが取得する値は,実際にそのスレッド又

は他のスレッドによって変数に記憶した値とする。そのプログラムが,適正な同期

化コードを含まないとしてもこれは成り立つ。例えば,二つのスレッドが異なるオ

ブジェクトへの参照を同じ変数に記憶した場合,結果として,その変数は,いずれ

かのオブジェクトへの参照を含み,他のオブジェクトの参照又は壊れた参照値を含

むことはない。 (long 値及び double 値には,特別な例外が存在する。を参照す

ること。)

明示的な同期化処理がない場合,Java 処理系は,予期しない順序で主メモリを更

新してもよい。したがって,予想に反する動作を回避したいプログラマは,明示的

な同期化を使用しなければならない。

Page 107: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

107

【練習 1】 class ThreadX extends Thread { //終了は、CTL+c スレッドの実験 public void run() { try { int a=0; while(true) { a = a + 1000; Thread.sleep(a); System.out.println("Thread の実験 sleep=" + a); } } catch(InterruptedException ex) { ex.printStackTrace(); } } } class L0901 { public static void main(String args[]) { ThreadX tx = new ThreadX(); tx.start(); } } 【練習 2】 class RunnableY implements Runnable { public void run() { try { int a=0; while(true) { a = a + 1000; Thread.sleep(a); System.out.println("Runnable の実装 sleep=" + a); } } catch(InterruptedException ex) { ex.printStackTrace(); } } } class L0902{ public static void main(String args[]) { RunnableY ry = new RunnableY(); Thread t = new Thread(ry); t.start(); } }

C:¥user¥java>java L0901 Thread の実験 sleep=1000 Thread の実験 sleep=2000 Thread の実験 sleep=3000

C:¥user¥java>java L0902 Runnable の実装 sleep=1000 Runnable の実装 sleep=2000 Runnable の実装 sleep=3000

Page 108: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

108

【練習 3】 class ThreadM extends Thread { //二つのスレッドの出方を観察すること public void run() { try { for (int i = 0; i < 20; i++) { Thread.sleep(1000); System.out.println("ThreadM"); } } catch (InterruptedException ex) { ex.printStackTrace(); } } } class ThreadN extends Thread { public void run() { try { for (int i = 0; i < 10; i++) { Thread.sleep(3000); System.out.println("ThreadN"); } } catch(InterruptedException ex) { ex.printStackTrace(); } } } class L0903 { public static void main(String args[]) { ThreadM tm = new ThreadM(); tm.start(); ThreadN tn = new ThreadN(); tn.start(); try { tm.join(); tn.join(); System.out.println("Both threads have finished"); } catch (Exception e) { e.printStackTrace(); } } }

C:¥user¥java>java L0903 ThreadM ThreadM ThreadM ThreadN ThreadM ThreadM ThreadM ThreadN ThreadM ThreadM ThreadM ThreadN ThreadM ThreadM ThreadM ThreadN ThreadM ThreadM ThreadM ThreadN ThreadM ThreadM ThreadM ThreadN ThreadM ThreadM ThreadN ThreadN ThreadN ThreadN Both threads have finished

Page 109: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

109

【練習 4】 class Account { private int balance = 0; private int am = 0; synchronized void deposit(int amount, int i) //同期 synchronized を削除してみる throws InterruptedException{ am = amount; // 排他制御の確認のための細工 Thread.sleep((11-i)*10); // スレッドの非同期化の細工 balance = balance + am; am = 0; // 排他制御の確認のための細工 } int getBalance() { return balance; } } class Customer extends Thread { Account account; public int id; Customer(Account account, int id) { this.account = account; this.id = id; } public void run() { try { int a=0; System.out.print("<"+id); for (int i = 0; i < 100; i++) { a = a + 1; Thread.sleep(a); // スレッドの非同期化の細工 account.deposit(10,id); } System.out.print(">"+id); } catch(Exception e) { e.printStackTrace(); } } } class L0904 { private final static int NUMCUSTOMERS = 10; public static void main(String args[]) { Account account = new Account(); // 勘定の開始 Customer customers[] = new Customer[NUMCUSTOMERS]; // スレッドの作成 for (int i = 0; i < NUMCUSTOMERS; i++) { customers[i] = new Customer(account,i); customers[i].start(); } for (int i = 0; i < NUMCUSTOMERS; i++) { try { customers[i].join(); } catch(InterruptedException e) { e.printStackTrace(); } } System.out.print("¥n"); System.out.println("口座の残高は 10000 か?:" + account.getBalance()); } } C:¥user¥java>java L0904

<0<1<2<3<4<5<6<7<8<9>0>1>2>3>4>5>6>7>8>9 口座の残高は 10000 か?:10000

Page 110: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

110

【練習 5】 class A { B b; synchronized void a1() { System.out.println("Starting a1"); b.b2(); } synchronized void a2() { System.out.println("Starting a2"); } } class B { A a; synchronized void b1() { System.out.println("Starting b1"); a.a2(); } synchronized void b2() { System.out.println("Starting b2"); } } class Thread1 extends Thread { A a; Thread1(A a) { this.a = a; } public void run() { for (int i = 0; i < 100000; i++) { a.a1(); } } } class Thread2 extends Thread { B b; Thread2(B b) { this.b = b; } public void run() { for (int i = 0; i < 100000; i++) { b.b1(); } } } class L0905 { public static void main(String args[]) { A a = new A(); B b = new B(); a.b = b; b.a = a; Thread1 t1 = new Thread1(a); // スレッドの作成 Thread2 t2 = new Thread2(b); // スレッドの作成 t1.start(); t2.start(); try { // スレッドの完了を待つ t1.join(); t2.join(); } catch(Exception e) { e.printStackTrace(); } System.out.println("Done!"); } }

C:¥user¥java>java L0905 Starting a1 Starting b2 Starting a1 Starting b2 Starting a1 Starting b2 Starting a1 Starting b1

C:¥user¥java>java L0905 Starting a1 Starting b2 Starting a1 Starting b2 Starting a1 Starting b2 Starting a1 Starting b2 Starting b1 Starting a2 Starting b1 Starting a2 Starting b1 Starting a2 Starting b1 Starting a2 Starting b1 Starting a2 Starting b1 Starting a2 Starting b1 Starting a2 Starting b1 Starting a2 Starting b1 Starting a2 Starting b1 Starting a2 Starting b1 Starting a2 Starting b1 Starting a2 Starting b1 Starting a1

Page 111: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

111

付録 【練習 6】 class Producer extends Thread { Queue queue; Producer(Queue queue) { this.queue = queue; } public void run() { int i = 0; try { while(true) { System.out.println("----------sleep---"); Thread.sleep(1000); queue.add(i++); } } catch (InterruptedException e) { e.printStackTrace(); } } } class Consumer extends Thread { String str; Queue queue; Consumer(String str, Queue queue) { this.str = str; this.queue = queue; } public void run() { while(true) { System.out.println(str + ": " + queue.remove()); } } } class Queue { private final static int SIZE = 10; int array[] = new int[SIZE]; int r = 0; int w = 0; int count = 0; synchronized void add(int i) { // 待ち行列がいっぱいの場合は待機する while(count == SIZE) { try { wait(); System.out.println("------zzz add---"); } catch(InterruptedException ie) { ie.printStackTrace();

Page 112: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

112

System.exit(0); } } // 配列にデータを追加して書き込みポインタを更新する array[w++] = i; if(w >= SIZE) w = 0; // count カウントを 1 つ増やす ++count; // 待機中のスレッドに通知する notifyAll(); } synchronized int remove() { // 待ち行列が空の場合は待機する while(count == 0) { try { wait(); System.out.println("------zzz remove---"); } catch(InterruptedException ie) { ie.printStackTrace(); System.exit(0); } } // 配列からデータを読み取って読み取りポインタを更新する int element = array[r++]; if(r >= SIZE) r = 0; // countを 1 つ減らす --count; // 待機中のスレッドに通知する notifyAll(); System.out.println("count=" + count + " , r=" + r); // データを返す return element; } } class L0906 { public static void main(String args[]) { Queue queue = new Queue(); new Producer(queue).start(); new Consumer("ConsumerA", queue).start(); new Consumer("ConsumerB", queue).start(); new Consumer("ConsumerC", queue).start(); } }

Page 113: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

113

C:¥user¥java>java L0906 ----------sleep--- ------zzz remove--- count=0 , r=1 ConsumerA: 0 ------zzz remove--- ------zzz remove--- ----------sleep--- ------zzz remove--- count=0 , r=2 ConsumerB: 1 ------zzz remove--- ------zzz remove--- ----------sleep--- ------zzz remove--- count=0 , r=3 ConsumerC: 2 ------zzz remove--- ----------sleep--- ------zzz remove--- ----------sleep--- ------zzz remove--- count=0 , r=4 ConsumerA: 3 ------zzz remove--- ------zzz remove--- ------zzz remove--- count=0 , r=5 ConsumerA: 4 ------zzz remove--- ------zzz remove--- ----------sleep--- ------zzz remove--- count=0 , r=6 ConsumerB: 5 ------zzz remove--- ------zzz remove--- ----------sleep--- ------zzz remove--- count=0 , r=7 ----------sleep--- ------zzz remove--- ------zzz remove--- ConsumerC: 6 ----------sleep--- ------zzz remove--- count=0 , r=8 ConsumerA: 7 ------zzz remove--- ------zzz remove--- ----------sleep--- ------zzz remove--- count=0 , r=9 ------zzz remove--- ------zzz remove--- ConsumerA: 8 ----------sleep--- ------zzz remove--- count=0 , r=0 ConsumerB: 9 ------zzz remove--- ------zzz remove--- ------zzz remove--- ----------sleep--- count=0 , r=1 ------zzz remove--- ------zzz remove--- ConsumerC: 10 ----------sleep--- ------zzz remove--- count=0 , r=2 ------zzz remove--- ------zzz remove--- ConsumerA: 11 ----------sleep--- ------zzz remove--- count=0 , r=3 ConsumerB: 12 ・・・

C:¥user¥java>java L090 ----------sleep--- ----------sleep--- ------zzz remove--- count=0 , r=1 ConsumerA: 0 ------zzz remove--- ------zzz remove--- ----------sleep--- ------zzz remove--- count=0 , r=2 ConsumerA: 1 ------zzz remove--- ------zzz remove--- ----------sleep--- ------zzz remove--- count=0 , r=3 ConsumerB: 2 ------zzz remove--- ------zzz remove--- ----------sleep--- ------zzz remove--- count=0 , r=4 ------zzz remove--- ------zzz remove--- ConsumerB: 3 ----------sleep--- ------zzz remove--- count=0 , r=5 ------zzz remove--- ------zzz remove--- ConsumerC: 4 ------zzz remove--- count=0 , r=6 ----------sleep--- ------zzz remove--- ------zzz remove--- ConsumerA: 5 ----------sleep--- ------zzz remove--- count=0 , r=7 ------zzz remove--- ------zzz remove--- ConsumerB: 6 ----------sleep--- ------zzz remove--- count=0 , r=8 ------zzz remove--- ------zzz remove--- ConsumerC: 7 ----------sleep--- ------zzz remove--- count=0 , r=9 ConsumerA: 8 ------zzz remove--- ------zzz remove--- ----------sleep--- ------zzz remove--- count=0 , r=0 ConsumerB: 9 ------zzz remove--- ------zzz remove--- ------zzz remove--- count=0 , r=1 ----------sleep--- ------zzz remove--- ------zzz remove--- ConsumerC: 10 ----------sleep--- ------zzz remove--- count=0 , r=2 ConsumerA: 11 ------zzz remove--- ------zzz remove--- ----------sleep--- ------zzz remove--- count=0 , r=3 ConsumerB: 12 ・・・

Page 114: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

114

1.実行結果 2.コンパイルと実行操作 3.Gui01.java のプログラム・ソースコード

import java.awt.*; import javax.swing.*; public class Gui01 { public static void main(String[] args) { JFrame frame; frame = new JFrame("初めての GUI"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container container = frame.getContentPane(); container.setLayout(new FlowLayout()); container.add(new JLabel("今日は!!!GUI 動いた?")); frame.setSize(200,100); frame.setVisible(true); } }

補足1:GUI プログラミング

課題 2章の練習5(L0205)の

下に書かれている課題を、

この画面にも表示するよ

うにしましょう。

Page 115: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

115

1.実行結果 3.Button01.java のプログラム・ソースコード

import java.awt.*; import java.awt.event.*; import javax.swing.*; class BtnColor extends JFrame implements ActionListener { Container container; JLabel label; JButton bt,bt2; public BtnColor(String name, int x, int y, int w, int h, JButton b, JButton b2) { bt = b; bt2 = b2; label = new JLabel("ボタンの実験開始"); setTitle (name); setLocation (x, y); setSize (w,h); container = getContentPane(); container.setBackground(Color.YELLOW); container.setLayout(new FlowLayout()); container.add(b); container.add(label); container.add(b2); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public void actionPerformed (ActionEvent ae) { String msg = JOptionPane.showInputDialog("色を入力","青"); String msg2=""; if (ae.getSource() == bt) msg2 = " ボタン1押下"; if (ae.getSource() == bt2) msg2 = " ボタン2押下"; if (msg==null) { container.setBackground(Color.WHITE); label.setText("背景に白をセット"+msg2); } else if (msg.equals("青")) { container.setBackground(Color.BLUE); label.setText("背景に青をセット"+msg2); } else { container.setBackground(Color.YELLOW); label.setText("背景に黄をセット"+msg2); } if (container.getBackground()==Color.white) System.out.println("背景が白"); setVisible(true); } } public class Button01 {

public static void main(String[] args) { JButton btn = new JButton("色を変えよう"); JButton btn2 = new JButton("ボタン2個目"); BtnColor bcolor = new BtnColor("画面の実験",300,100,200,400,btn,btn2); btn.addActionListener(bcolor); btn2.addActionListener(bcolor); bcolor.setVisible(true); } }

2.コンパイルと実行操作

課題 ・背景色の初期値は白とする。 ・ボタン押下時に、以下のよう

に背景を変更する。 1.白なら、黄色に変える。 2.黄色なら、青に変える。 3.青なら、赤に変える。 4.赤なら、黄色に変える。

「ボタン」と「背景色」と「ラベルのテキスト内容変更」

二個のボタ

ンの識別

背景色の

識別

ラベルのテキ

スト書き換え

の前準備

ラベルの

テキスト

入れ替え

注:container.XXX は、 getContentPane().XXX と書ける

Page 116: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

116

【操作方法】 1.コマンドプロンプトを2つ立ち上げる。 2.一方は、「java ChatListen」もう一方は、「java ChatSend 自分の名前」と起動。 3.ChatListen は、メッセージの表示用として利用する。 4.ChatSend は、メッセージを送信するために利用。改行すると、メッセージを送る。 5.プロトコルは、UDP による垂れ流し方式です。負荷がどうなるかは、実験のお楽し

み。 ChatListen.java プログラム import java.net.*; import java.io.*; public class ChatListen { public static void main(String[] arg){ String multicastAddress = "224.0.0.1" ; int port = 7000 ; byte[] buff = new byte[1024] ; try{ InetAddress chatgroup = InetAddress.getByName(multicastAddress) ; MulticastSocket soc = new MulticastSocket(port) ; soc.joinGroup(chatgroup) ; while(true){ DatagramPacket recv = new DatagramPacket(buff,buff.length) ; soc.receive(recv) ; if(recv.getLength() > 0){ System.out.write(buff,0,recv.getLength()) ; } } }catch(Exception e){ e.printStackTrace() ; System.exit(1) ; } } }

補足2:ネットワーク・プログラミング(原始的なチャット)

IP アドレス:224.0.0.1 は、マルチキャストアドレス

《課題》ポート番号の若い番号は通

常使わない。理由を調べよう。

Page 117: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

117

ChatSend.java プログラム import java.net.*; import java.io.*; public class ChatSend { static String name; public static void main(String[] arg){ String multicastAddress = "224.0.0.1" ; int port = 7000 ; MulticastSocket s = null; byte[] nameBuff = new byte[25]; byte[] buff = new byte[1024]; byte[] buffTemp = new byte[1024]; if (arg.length!=0) name=arg[0]+">"; else { System.out.println(

"名前を入れてください(例): java ChatSend 太郎"); return; } nameBuff=name.getBytes(); int nameBL=nameBuff.length; try{ InetAddress chatgroup = InetAddress.getByName(multicastAddress) ; MulticastSocket soc = new MulticastSocket(port) ; soc.joinGroup(chatgroup) ; Loop1: while(true){ int n = System.in.read

(buffTemp,0,buffTemp.length-nameBL-1) ; if(n > 0){ System.arraycopy

(nameBuff,0,buff,0,nameBL); System.arraycopy

(buffTemp,0,buff,nameBL,n); DatagramPacket dp = new DatagramPacket

(buff,nameBL+n,chatgroup,port) ; soc.send(dp) ; } else break Loop1; } }catch(Exception e){ e.printStackTrace() ; System.exit(1) ; } } }

Page 118: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

118

XML の利用 Chat.xml ファイル <?xml version="1.0" encoding="SHIFT_JIS"?> <ChatInformation> <client id="a01"> <name>山田野かかし</name> <email>[email protected]</email> </client> <environment> <machine>DOS/V</machine> <os>Windows2000Professional</os> </environment> <environment> <machine>DOS/V</machine> <os>Windows98</os> </environment> </ChatInformation> XML の入門の入門 1.XML のタグは、利用者が自分の責任でタグの名称、構造の定義を決める 2.XML のタグの開始と終了は、必ず「対」になっていること 3.XML のタグは、大文字、小文字が区別されている 4.XML のタグは、日本語も可であるが、国外とのデータ交換を考えると、難しい? 5.XML の利用は、CSV 形式の情報交換よりはるかに保守性に富んでいる 6.XML の利用は、現状では CSV 形式以上にプログラミングの能力を要求される 7.歴史的には、XML(eXtensible Markup Language)は、SGML(Standard Generalized Markup

Language)から派生してきた言語です。DTD(Document Type Definition)を用いて構

造の定義が出来る。SGML は仕様が大きく複雑であるため、一般への普及が難しかっ

た。一方で HTML は仕様を特定化し、Web の標準言語となる。このため HTML では

決められたタグしか使えず、商取引などに必要なデータの表現が十分にできない欠点

がある。SGML の拡張性生かして発展させたのが XML です。 8.XML の利用は、 http://www.rosettanet.org/RosettaNet/Rooms/DisplayPages/LayoutInitial

が電子部品業界の標準として、有名です。その他、例のごとく@it の HP の

http://www.atmarkit.co.jp/fxml/links/indexpage/xmlapps.html に、色々な業界の話がリンク

されています。

Page 119: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

119

XML 読み込みプログラム例 GetXmlDom.java プログラム import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.*; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.xml.sax.SAXException; public class GetXmlDom { public static void main(String argv[]) { try { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setNamespaceAware(true); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse("Chat.xml"); Element el = doc.getDocumentElement(); String tagname=el.getTagName(); System.out.println(tagname+",n="+el.getNodeValue()); NodeList nList=doc.getElementsByTagName("*"); int i; Node node; for(i=0;i < nList.getLength();i++){ node = nList.item(i); String nodeName=node.getNodeName(); if(nodeName.equals("name")) { System.out.println ("名前="+node.getFirstChild().getNodeValue()); } System.out.println("element="+nodeName); } // } catch(ParserConfigurationException pce) { // pce.printStackTrace(); // } catch(SAXException se) { // se.printStackTrace(); // } catch(IOException ioe) { // ioe.printStackTrace(); } catch(Exception e) { e.printStackTrace(); } } }

C:¥user¥java>java GetXmlDom ChatInformation,n=null element=ChatInformation element=client 名前=山田野かかし element=name element=email element=environment element=machine element=os element=environment element=machine element=os

Page 120: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

120

ChatInf.java プログラム XML ファイルから、名前を取り出すチャット用の XML アクセス・クラス import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.*; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.xml.sax.SAXException; public class ChatInf { static String chatN="名無し"; public static String getName() { try { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setNamespaceAware(true); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse("Chat.xml"); Element el = doc.getDocumentElement(); String tagname=el.getTagName(); NodeList nList=doc.getElementsByTagName("*"); int i; Node node; for(i=0;i < nList.getLength();i++){ node = nList.item(i); String nodeName=node.getNodeName(); if(nodeName.equals("name")) { chatN=node.getFirstChild().getNodeValue(); } } return chatN; } catch(Exception e) { e.printStackTrace(); } return chatN; } }

Page 121: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

121

ChatSend プログラムを XML からクライアント名を持ってくるように改造 ChatSend.java プログラム import java.net.*; import java.io.*; public class ChatSend { static String name; public static void main(String[] arg){ String multicastAddress = "224.0.0.1" ; int port = 7000 ; MulticastSocket s = null; byte[] nameBuff = new byte[25]; byte[] buff = new byte[1024]; byte[] buffTemp = new byte[1024]; /* if (arg.length!=0) name=arg[0]+">"; else { System.out.println("名前を入れてください(例): java ChatSend 太郎"); return; } */ name=ChatInf.getName()+">"; nameBuff=name.getBytes(); int nameBL=nameBuff.length; try{ InetAddress chatgroup = InetAddress.getByName(multicastAddress) ; MulticastSocket soc = new MulticastSocket(port) ; soc.joinGroup(chatgroup) ; Loop1: while(true){ int n = System.in.read(buffTemp,0,buffTemp.length-nameBL-1) ; if(n > 0){ System.arraycopy(nameBuff,0,buff,0,nameBL); System.arraycopy(buffTemp,0,buff,nameBL,n); DatagramPacket dp = new DatagramPacket(buff,nameBL+n,chatgroup,port) ; soc.send(dp) ; } else break Loop1; } }catch(Exception e){ e.printStackTrace() ; System.exit(1) ; } } }

Page 122: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

122

アサーションは、その地点での前提条件をテストできるもので、アサーション実行時に true

となるべき論理式を記述し、ソフトウェアの信頼性に必要とされており、バグの早期発見や保

守のためのドキュメントとしても役立つものとなっている。このアサーションは Javaの場合、

assert 文によって記述し、assertが記述された論理式が偽の場合は、例外処理が発生する。こ

の例では、ループの前後の二箇所に assert文を記述している。

図1 Javaによるプログラム例

図1のプログラムを実行するためのテストドライバの例を図2に示す。アサーションを利用す

る場合のコンパイルと実行例を図3に示す。

図2Javaのプログラムのテストドライバ例

図3 Javaの実行結果

注:Java1.5からは、-source 1.4は不要

public class Sum{ private int s; public Sum() { s = 0; } public int calcSum(int first, int last){ int i; assert s==0; for(i = first; i <= last; i++) s += i; assert i==last+1

&& s==(((last+1)*last)/2)-(((first-1)*first)/2); return s; } public int getSum() { return s; } }

class TestSum{ public static void main(String[] args) { Sum s = new Sum(); System.out.println("s の値を得る="+s.getSum()); System.out.println("和を計算="+s.calcSum(1,10)); System.out.println("s の値を得る="+s.getSum()); } }

C:¥user¥java>javac -source 1.4 *.java C:¥user¥java>java -ea TestSum s の値を得る=0 和を計算=55 s の値を得る=55

情報隠蔽

アサーション

情報隠蔽をクラスのフィールドに

privateとすることで実現している。

こうすることでこのフィールドは、

外部のクラスからは直接アクセスす

ることができないように保護するこ

とが可能となる。

補足3:Java のアサーション機能

Page 123: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

123

提出課題1. 4章の練習7(L0407)のプログラムを以下のように改造しなさい。 ① count の上限を14とするのではなく、args から入力できるように改造する。 2章の練習20等を参考にしてください。 ② 表示方法:2,3,5・・・と、途中の区切りは、空白ではなくカンマ(,)とする。 注意:表示方法は、なるべく見た目に自然なようにしてください。

例:「,2,3」と開始にカンマが付いたり、 「2,3,5,」と最後にカンマが残ったり しないようにしてほしい。 (どうしても判らなければ、かまいません)

③ 実行時間を計測しなさい。 ミリ秒取得は、2章の練習23(L0223)を参考にしてください。 ループの開始前とループ終了後にミリ秒を取得し、「差」を求めて表示する。 ④ args から入力する値は、「17」と「100」とする。 つまり、

javac L0407 17 javac L0407 1000

とコマンドを2回実行し、結果を表示する。 ⑤コマンドプロンプトの操作イメージ 提出課題2. 数値、文字および、文字列が与えられたら、その値の表示と16進での表示をしなさい。

>java L0407 4 2,3 nnnnnnミリ秒

Page 124: Java入門 - FC2mizar.web.fc2.com/null/study/java.pdf · 2010-11-06 · Java 入門 2 1.プログラミング周辺の話題 ハードウェアとソフトウェア プログラミングとそのための言語

Java 入門

124

以下に、Java 言語の主な参考資料を記します。 参考文献 1.「独習 Java」 Joseph O’Neil著 翔泳社 2.「Java プログラミング Black Book 」Steven Holzner 著 インプレス 3.「Effective Java プログラミング言語ガイド」

J. Bloch 著 ピアソン・エデュケーション 4.「Java Puzzlers 罠、落とし穴、コーナーケース」

J. Bloch, J. Neal 著 ピアソン・エデュケーション 5.「基礎からわかる TCP/IP Java ネットワークプログラミング」第二版

小高知宏著 オーム社 6.”An Introduction to Object-Oriented Programming with Java” C. Thomas Wu 著 McGraw-Hill 参考ホームページ 1.http://java.sun.com/docs/books/tutorial/

Sun のチュートリアル集で、ここに色々なサンプルがある。 2.http://java.sun.com/docs/books/jls/ Java の言語仕様です。 3.http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/index.html Java の API です。 4.http://wisdom.sakura.ne.jp/system/java/awt/ GUI 全般のサンプルがある。