Java5.0 2007 年 4 月 23 日 作 成 青 山 システムズ 青 山
1.JAVAプログラミング Javaは 以 下 の 工 程 を 経 て 実 行 されます JavaソースプラグラムはJavaコンパイラによりコンパイルされ Javaバイトコードに 変 換 さ れます JavaバイトコードはJVM(Java 仮 想 マシン) 上 で 実 行 されます JavaバイトコードはJVM 上 で 実 行 されます OS 上 で 実 行 されるわけではありません これはJavaプログラムはJVMがインストールされていれば OSに 依 存 せず 実 行 す ることができると 言 えます Javaの 特 徴 として 言 われている Write Once, Run Anywhere ( 一 度 プログラムを 作 ると どこでも 実 行 させることができる 環 境 に 合 わせてプログラムを 変 更 する 必 要 がない)ということです 青 山 システムズ 2
2.JAVAの 基 礎 2.1JAVAプログラミング Javaプログラミングには パッケージ 宣 言 インポート 宣 言 クラス インタフェースの 定 義 を 順 番 に 書 く 必 要 がある それぞれ パッケージ 宣 言 以 外 は1つのファイルにいくつ 書 いてもよい 青 山 システムズ 3
2.JAVAの 基 礎 2.2キーワードと 識 別 子 キーワード abstract, boolean, break, byte, case, catch, char, class, const, continue, default, do, double, else, extends, final, finally, float, for, goto, if, implements, import, instanceof, int, interface, long, native, new, package, private, protected, public, return, short, static, strictfp, super, switch, synchronized, this, throw, throws, transient, try, void, volatile, while 識 別 子 プログラムで 使 われるクラス フィールド メソッドなどの 名 前 は 識 別 子 と 呼 ばれる キーワードは 変 数 名 やメソッド 名 などの 識 別 子 として 用 いること はできません 青 山 システムズ 4
2.JAVAの 基 礎 2.3 基 本 データ(プリミティブ 型 ) 変 数 の 型 変 数 には 基 本 データ 型 と 参 照 型 の2 種 類 ある 基 本 データ 型 文 字 整 数 種 別 論 理 値 浮 動 小 数 char byte short int long float double 型 boolean 真 偽 値 true または false 2バイトUNICODE 文 字 ' u0000'~' uffff' 1バイト 符 号 付 整 数 -128~127 2バイト 符 号 付 整 数 -32768~32767 4バイト 符 号 付 整 数 -2147483648~ 2147483647 8バイト 符 号 付 整 数 約 -922 京 ~ 約 922 京 4バイト 浮 動 小 数 点 数 8バイト 浮 動 小 数 点 数 説 明 青 山 システムズ 5
2.JAVAの 基 礎 2.4 修 飾 子 修 飾 子 クラス インタ フェース メソッド コンスト ラクタ ブロック 変 数 説 明 public アクセス 修 飾 子 protected アクセス 修 飾 子 private アクセス 修 飾 子 static スタティック 修 飾 子 final ファイナル 修 飾 子 abstract 抽 象 修 飾 子 native ネイティブ 修 飾 子 synchronized 同 期 修 飾 子 transient 一 時 的 修 飾 子 volatile 揮 発 性 修 飾 子 strictfp 厳 密 浮 動 小 数 修 飾 子 const 定 数 青 山 システムズ 6
2.JAVAの 基 礎 2.4 修 飾 子 許 される 修 飾 子 は 複 数 書 いてもよいが 相 互 に 矛 盾 するものは 書 いてはいけない 青 山 システムズ 7
2.JAVAの 基 礎 2.5アクセス 制 御 public protected private は アクセス 修 飾 子 と 呼 ばれ 指 定 した 変 数 やクラスなどを どの 範 囲 から 参 照 可 能 かのスコープを 制 御 するのに 用 いられます クラス インタフェース メソッド コ ンストラクタ 変 数 の 修 飾 子 として 利 用 できます public は すべてのクラスからの 参 照 を 許 す protected は 他 ファイル 他 クラスからのアクセス をプロテクトする private は 自 クラスからのアクセスしか 許 さない という 意 味 になります アクセス 修 飾 子 自 クラス 自 ファイル サブクラス 他 クラス サブクラス 他 ファイル 他 クラス public protected なし private 青 山 システムズ 8
2.JAVAの 基 礎 2.6JavaBeansの 命 名 規 則 JavaBeans 再 利 用 が 容 易 なソフトウェアの 基 本 単 位 をコ ンポーネントと 言 う JavaBeansは コンポーネントの 構 成 方 法 を 示 す メソッドに 関 する 規 則 setterメソッド getterメソッド 青 山 システムズ 9
2.JAVAの 基 礎 2.7 静 的 インポート staticなフィールド メソッドの 修 飾 部 分 を 省 略 できる import static java.lang.math.pi; import static java.lang.system.out; と 宣 言 することによって プログラム 中 では PI outと 書 くことができる 青 山 システムズ 10
2.JAVAの 基 礎 2.8アプリケーションとアプレット Javaプログラムには アプリケーションとアプレッ トの2 種 類 があります アプリケーションはJVM 上 で 直 接 実 行 される プログラムコード 中 のmainメソッドが 最 初 に 実 行 される アプレットはブラウザ 上 のJVMによって 実 行 され る 青 山 システムズ 11
3.データと 演 算 子 3.1リテラル Java では 数 値 や 文 字 列 などの 値 を リテラル と 呼 びます リテラルには 次 のようなものがあります リテラル 数 字 整 数 10 進 数 (123 など) 16 進 数 (0x89ab など) 8 進 数 (0177 など) 浮 動 小 数 点 (1.23 1.23e45 など) 文 字 文 字 列 文 字 ('a' 'あ' など) 文 字 列 ("Hello" など) 論 理 値 (true または false) 空 (null) 青 山 システムズ 12
3.データと 演 算 子 3.2 演 算 子 Java で 利 用 可 能 な 演 算 子 を 以 下 に 示 します 大 半 は C C++ JavaScript と 同 様 の 演 算 子 です カテゴリ 演 算 子 説 明 使 用 例 + 加 算 a = b + c; - 減 算 a = b - c; 四 則 演 算 * 乗 算 a = b * c; / 除 算 a = b / c; % 剰 余 a = b % c; 単 項 演 算 子 ++ -- インクリメント デクリメント a++; --a; a--; --a; 代 入 演 算 子 = 代 入 演 算 子 a = b; 青 山 システムズ 13
3.データと 演 算 子 3.2 演 算 子 カテゴリ 演 算 子 説 明 使 用 例 == 等 しい if (a == b)!= 異 なる if (a!= b) 比 較 演 算 子 < > より 小 さい おり 大 きい if (a < b) if (a > b) <= 等 しいかより 小 さい if (a <= b) >= 等 しいかおり 大 きい if (a >= b) && かつ if ((a == b) && (c == d)) 論 理 演 算 子 または if ((a == b) (c == d))! ではない if (!(a == b)) 青 山 システムズ 14
3.データと 演 算 子 3.2 演 算 子 カテゴリ 演 算 子 説 明 使 用 例 & 論 理 積 (AND) a = b & c; 論 理 和 (OR) a = b c;! 論 理 否 定 (NOT) a =! b; ビット 演 算 子 ^ ~ 排 他 的 論 理 和 (EOR) ビット 反 転 a = b ^ c; a = ~ b; << 算 術 左 シフト a = b << 2; >> 算 術 右 シフト a = b >> 2; >>> 論 理 右 シフト a = b >>> 2; 青 山 システムズ 15
3.データと 演 算 子 3.2 演 算 子 カテゴリ 算 術 代 入 演 算 子 三 項 演 算 子 演 算 子 += -= *= /= %= &= = ^= <<= >>= >>>=? : 説 明 使 用 例 加 算 代 入 a += b; 減 算 代 入 a -= b; 乗 算 代 入 a *= b; 除 算 代 入 a /= b; 余 り 代 入 a %= b; 乗 算 代 入 a &= b; 除 算 代 入 a = b; 剰 余 代 入 a ^= b; 算 術 左 シフト 代 入 a <<= b; 算 術 右 シフト 代 入 a >>= b; 論 理 右 シフト 代 入 a >>>= b; 三 項 演 算 子 a = (b == c)? d : e; 青 山 システムズ 16
3.データと 演 算 子 3.3 単 項 演 算 子 インクリメント(++) デクリメント(--) 演 算 子 a++ と ++a はどちらも a の 値 をひとつ 増 やしたものを a に 代 入 しますが 式 の 値 が 異 なります a++ はインクリメントする 前 の ++a はインクリメントした 後 の 値 を 返 します a = 5; b = a++; // b には 5 が 代 入 される a = 5; b = ++a; // b には 6 が 代 入 される 型 やクラスを 一 時 的 に 変 換 して 参 照 することを キャスト と 呼 びます 例 えば 下 記 の 例 で int 値 を long 値 に 代 入 することは 可 能 ですが int 値 を short 値 に 代 入 しようとするとコンパイルエラーになります これは int short の 代 入 では 値 のオーバーフローが 発 生 してしまう 可 能 性 があるためです int intvalue = 123; long longvalue = intvalue; short shortvalue = intvalue; コンパイルエラー この 問 題 を 解 決 するには int 値 を 明 示 的 に short 値 に 変 換 してから 代 入 します これを short にキャストする と 言 います short shortvalue = (short)intvalue; 青 山 システムズ 17
3.データと 演 算 子 3.4 算 術 演 算 子 3.2を 参 照 青 山 システムズ 18
3.データと 演 算 子 3.5 比 較 演 算 子 演 算 子 > >= < <= ==!= instanceof 記 入 例 x > y x >= y x < y x <= y x == y x!= y x instanceof y 説 明 xがyよりも 大 きい 場 合 にtrueを 返 す xがyよりも 大 きいか 等 しい 場 合 にtrueを 返 す xがyよりも 小 さい 場 合 にtrueを 返 す xがyよりも 小 さいか 等 しい 場 合 にtrueを 返 す xとyが 等 しい 場 合 にtrueを 返 す xとyが 等 しくない 場 合 にtrueを 返 す xが yと 同 じクラス か yのサブクラス である 場 合 にtrueを 返 す 青 山 システムズ 19
3.データと 演 算 子 3.5 比 較 演 算 子 参 照 元 が 同 じケース 値 は 同 じだが 参 照 元 が 異 なるケース 青 山 システムズ 20
3.データと 演 算 子 3.6 論 理 演 算 子 条 件 演 算 子 演 算 子 && & ^! 記 入 例 x && y x y x & y x y x ^ y!x xとyの 両 方 がtrueの 場 合 にtrueを 返 す xとyのいずれかがtrueの 場 合 にtrueを 返 す xとyの 両 方 がブール 型 且 つ 両 方 ともtrueの 場 合 にtrueを 返 す 両 方 の 変 数 が 整 数 型 の 場 合 はビットごとのAND 演 算 を 行 う xとyの 両 方 がブール 型 且 ついずれかがtrueの 場 合 にtrueを 返 す 両 方 の 変 数 が 整 数 型 の 場 合 はビットごとのOR 演 算 を 行 う xとyの 両 方 がブール 型 且 つxとyが 異 なった 値 の 場 合 にtrueを 返 す 両 方 の 変 数 が 整 数 型 の 場 合 はビットごとのXOR 演 算 を 行 う xがfalse 場 合 にtrueを 返 す 説 明 青 山 システムズ 21
3.データと 演 算 子 3.6 論 理 演 算 子 条 件 演 算 子 && と& において 演 算 子 が 意 味 するところは 同 じです が その 振 る 舞 いには 明 確 な 違 いがある &&と&は 左 オペランドと 右 オペランドのいずれもがtrue の 場 合 trueを 返 す と は 左 オペランドと 右 オペランドのいずれかがtrueの 場 合 trueを 返 す && 演 算 子 は 特 性 からショートサーキット( 短 絡 する) 演 算 子 とも 言 われる 青 山 システムズ 22
3.データと 演 算 子 3.7Stringの 等 価 不 等 価 String オブジェクト 名 = 文 字 列 ; String オブジェクト 名 = new String( 文 字 列 ); new 演 算 子 を 使 用 しない 場 合 new 演 算 子 を 使 用 する 場 合 青 山 システムズ 23
3.データと 演 算 子 3.8 代 入 演 算 子 演 算 文 の 簡 略 記 入 例 同 様 な 書 き 方 += x += y x = x + y -= x -= y x = x - y 算 術 演 算 子 *= x *= y x = x * y /= x /= y x = x / y %= x %= y x = x % y &= x &= y x = x & y ビット 演 算 子 = x = y x = x y ^= x ^= y x = x ^ y <<= x <<= y x = x << y シフト 演 算 子 >>= x >>= y x = x >> y >>>= x >>>= y x = x >>> y 青 山 システムズ 24
4.クラスとインタフェース 4.1クラスの 定 義 クラス(class) クラス(class)はオブジェクト 指 向 プログラミングの 基 本 的 な 仕 組 みを 提 供 するもので オブジェクト(インスタンス とも 言 います)が 持 つ 属 性 (アトリビュート プロパティ とも 呼 ばれます)や メソッ ド( 関 数 ファンクション と 呼 ばれることもあります)などを 定 義 し ます class クラス 名 { 型 属 性 ; : 型 メソッド() {... } : } クラスのインスタンス 化 (new) あるクラスのインスタンスを 作 成 するには new を 用 います 例 えば TestClass という 名 前 のクラスのインスタンスを 作 るには 次 のようにします TestClass o = new TestClass(); 青 山 システムズ 25
4.クラスとインタフェース 4.1クラスの 定 義 クラス 修 飾 子 (public,...) クラスの 修 飾 子 には public final abstract strictfp を 指 定 することが できます 修 飾 子 class クラス 名 { : } インナークラス(クラス 内 部 に 定 義 するクラス)には 加 えて protected private static を 指 定 することが 可 能 になります class クラス 名 { 修 飾 子 class クラス 名 { : } } 青 山 システムズ 26
4.クラスとインタフェース 4.1クラスの 定 義 青 山 システムズ 27
4.クラスとインタフェース 4.1クラスの 定 義 メンバ 変 数 オブジェクトが 持 っている 状 態 を 表 します この 他 変 数 としてはメ ソッド 内 だけで 有 効 なローカル 変 数 もあります メソッド オブジェクトが 持 っている 振 る 舞 いを 表 します コンストラクタ クラスからオブジェクトが 生 成 さ れる 時 に 実 行 される 初 期 化 処 理 を 担 います 青 山 システムズ 28
4.クラスとインタフェース 4.1クラスの 定 義 アクセスレベル クラス メンバ 変 数 メソッド コンストラクタ public protected 指 定 無 し(デフォルト) private 青 山 システムズ 29
4.クラスとインタフェース 4.1クラスの 定 義 アクセスレベル 同 一 クラス 同 一 パッケージ サブクラス すべて public protected 指 定 無 し (デフォルト) private 青 山 システムズ 30
4.クラスとインタフェース 4.2 継 承 あるクラスのメンバ 変 数 やメソッドを 継 承 した サブクラス( 子 クラス)を 定 義 するには extends を 用 います class クラス 名 extends 親 クラス 名 { : } 下 記 の 例 では 上 記 で 作 成 した Person クラスを 継 承 する Member クラスを 定 義 しています Member クラス は Person クラスを 継 承 しているので myname myage などの 属 性 や GetName() SetName() などのメソッドを 引 き 継 ぎ 加 えて mynumber や SetNumber() などの 属 性 やメソッドを 備 えています class Member extends Person { int mynumber; public void SetNumber(int number) { mynumber = number; } public int GetNumber() { return mynumber; } } 青 山 システムズ 31
4.クラスとインタフェース 4.2 継 承 親 クラスの 参 照 (super) super は クラスの 継 承 における 親 クラス(スーパークラス)を 示 します java では 親 クラ スのコンストラクタは 暗 黙 的 には 呼 ばれないため 下 記 のように 明 示 的 に 呼 び 出 してやる 必 要 があります class Member extends Person { Member() { super( tanaka ); // 親 クラスのコンストラクタを 呼 び 出 す super.setage(26); // 親 クラスのメソッドを 呼 び 出 す return super.myname; // 親 クラスの 属 性 を 参 照 する } } クラスに 属 しているか 調 べる(instanceof) instanceof 演 算 子 は オブジェクト(インスタンス)が 指 定 したクラスまたはその 上 位 のクラ スに 属 しているかどうかを 調 べます MyButton b = new MyButton(); if (b instanceof Button) { System.out.println(" 属 してる"); } else { System.out.println(" 属 していない"); } 青 山 システムズ 32
4.クラスとインタフェース 4.3final final は 上 書 きされないことを 意 味 します クラスに 用 いた 場 合 はサ ブクラスを 定 義 できないことを メソッドに 用 いた 場 合 はサブクラスで メソッドをオーバーロードできないことを 変 数 に 用 いた 場 合 は 誰 もそ の 変 数 を 変 更 できないことを 意 味 します final class クラス 名 { : } class クラス 名 { final 型 メソッド 名 ( 引 数 ) { : } public static final double PI = 3.14159265358979323846; } 青 山 システムズ 33
4.クラスとインタフェース 4.4フィールド アクセス 修 飾 子 public protected private static static 宣 言 されたフィールドはクラス 変 数 と 呼 ばれ オブジェクトを 生 成 せずに 使 用 できる 初 期 化 一 般 にクラス 変 数 同 士 インスタンス 変 数 同 士 では のちに 宣 言 されるフィール ド をそれより 以 前 に 使 えない final 値 が 変 更 できないことを 示 す transient volatile インスタンス 変 数 につけられるがクラス 変 数 にはつけられない transient:オブジェクトのシリアライズを 避 ける volatile:コンパイラの 最 適 化 を 止 める メソッド 内 の 変 数 メソッド 内 にフィールドと 同 名 のローカル 変 数 を 定 義 すると そのメソッド 内 では フィールドが 隠 され ローカルな 変 数 が 使 われる 青 山 システムズ 34
4.クラスとインタフェース 4.5コンストラクタ コンストラクタとデストラクタ コンストラクタ は クラス 名 と 同 じ 名 前 を 持 つ 特 別 なメソッドです インスタンスが 生 成 された 時 に 自 動 的 に 呼 ばれ インスタンスの 初 期 化 処 理 を 行 います class Person { String myname; Person(String name) { myname = name; } } コンストラクタには 上 記 のように 引 数 を 持 つことができます 下 記 の 例 では Person クラスのインスタンス tanaka を 生 成 する 際 に コンストラクタの 処 理 を 利 用 して 名 前 (myname)の 設 定 を 行 っています Person tanaka = new Person("tanaka"); デストラクタ は クラスが 消 滅 する 際 に 自 動 的 に 呼 ばれる 特 別 なメソッドで クラ スの 後 始 末 処 理 を 記 述 します C++ 言 語 などではサポートされていますが Java ではすべての 破 棄 作 業 は 自 動 的 に 行 われるという 思 想 の 元 デストラクタは 不 要 と 考 えられています 青 山 システムズ 35
4.クラスとインタフェース 4.5コンストラクタ メンバ 変 数 の 隠 蔽 を 行 う 場 合 インスタンスメソッド 内 コンストラクタ 内 で 隠 蔽 されたメンバ 変 数 を 参 照 する 際 に 使 用 します this.メンバ 変 数 ; 複 数 のコンストラクタを 宣 言 し あるコンストラクタから 別 のコンストラクタを 参 照 する 場 合 に 使 用 します この 例 の 詳 細 についてはコンストラクタを 参 照 してください this( 引 数 値, ); 青 山 システムズ 36
4.クラスとインタフェース 4.5コンストラクタ 親 クラスの 参 照 (super)super は クラスの 継 承 における 親 クラス(スーパークラス)を 示 します java では 親 クラ スのコンストラクタは 暗 黙 的 には 呼 ばれないため 下 記 のように 明 示 的 に 呼 び 出 してやる 必 要 があります class Member extends Person { Member() { super("tanaka"); // 親 クラスのコンストラクタを 呼 び 出 す super.setage(26); // 親 クラスのメソッドを 呼 び 出 す return super.myname; // 親 クラスの 属 性 を 参 照 する } } 青 山 システムズ 37
4.クラスとインタフェース 4.6メソッド 戻 り 型 メソッド 名 ( 引 数 型 引 数 名 ) { メソッド 本 体 }; 1. 戻 り 型 メソッドの 呼 び 出 し 元 に 値 を 返 す 場 合 その 値 の 型 を 記 載 します 何 の 値 も 返 さない 場 合 はvoid 型 を 記 載 します void show( ) { //1 値 を 返 さないため 戻 り 型 はvoid //2calculate(10)でメソッドcalculateの 呼 び 出 し System.out.println(calculate(10)); } int calculate(int x) { //3 呼 び 出 し 元 に 返 す 値 の 型 intを 宣 言 int answer = x * 10; return answer; //4return 文 で 値 を 返 す } 関 連 ページ:break continue return 青 山 システムズ 38
4.クラスとインタフェース 4.6メソッド 2.( 引 数 型 引 数 名 ) メソッド 呼 び 出 し 元 から 渡 された 値 をメソッド 内 で 実 行 させるために 記 載 します 引 数 型 は 渡 される 値 の 型 引 数 名 は 渡 される 値 をメソッド 内 で 使 用 する 際 の 変 数 名 を 表 します 渡 される 値 がない 場 合 は 単 に( )を 記 載 します void show( ) { //1 渡 される 値 がないため( )を 記 載 //2calculate(10)でcalculateメソッドに 値 10を 渡 します System.out.println(calculate(10)); } int calculate(int x) { //3 値 10をint 型 変 数 xで 受 け メソッド 内 で 使 用 します int answer = x * 10; return answer; } 青 山 システムズ 39
4.クラスとインタフェース 4.6メソッド static abstract final native 戻 り 型 修 飾 子 アクセスレベル synchronized メソッド 名 ( 引 数 型 引 数 名 ) throws 例 外 名 説 明 アクセスレベルを 指 定 することにより メソッドを 他 のクラスから 参 照 できないなどを 指 定 できるようになります メソッドがインスタンスメソッドではなく クラスメソッドであることを 表 します 処 理 を 実 装 しないメソッド( 抽 象 メソッド)を 生 成 したい 時 に 使 用 します finalを 使 用 した 場 合 そのメソッドはサブクラスでオーバーライドすることができませ ん C 言 語 など 他 の 言 語 で 記 述 されたプログラムをJavaプログラム 内 で 使 用 したい 時 に 使 います 使 用 したいプログラムにnativeを 付 け 宣 言 します スレッドを 複 数 同 時 に 走 らせる 際 に 同 じデータに 対 し 複 数 のメソッドが 呼 び 出 される 場 合 があります そのような 場 合 安 全 にメソッドが 実 行 されるためにsynchronized を 使 用 します メソッドを 実 行 した 結 果 をメソッド 呼 び 出 し 元 に 返 すことができます ここでは 返 す 値 のデータ 型 を 指 定 します 返 す 値 がない 場 合 はvoid 型 を 使 用 します 戻 り 型 は 宣 言 時 の 必 須 項 目 です メソッド 名 を 宣 言 します メソッド 名 は 慣 例 的 に 小 文 字 から 始 め 単 語 の 切 れ 目 は 大 文 字 を 使 用 します またメソッド 名 として 動 詞 がよく 使 われます メソッド 名 は 宣 言 時 の 必 須 項 目 です メソッドに 値 を 渡 したい 時 に 渡 したい 値 の 引 数 型 引 数 名 を 宣 言 します 渡 したい 値 がない 場 合 は( )のみを 記 載 します ( 引 数 型 引 数 名 )は 宣 言 時 の 必 須 項 目 です メソッドで 何 らかの 例 外 をスローする 青 山 システムズ 際 に 使 用 します 40
4.クラスとインタフェース 4.7オーバロードとオーバライド オーバーライドを 定 義 する 際 には 以 下 の 規 定 がありま す 1.オーバーライドする 側 はオーバーライドされる 側 と 戻 り 型 インスタンスメソッド 名 引 数 型 引 数 の 数 が 同 じ でなければなりません どれか 一 つでも 異 なる 場 合 はオ ーバーライドとは 見 なされません 2.オーバーライドされる 側 のインスタンスメソッドに 指 定 されるアクセスレベルより 広 い 範 囲 を 持 つアクセスレベ ルをオーバーライドする 側 のインスタンスメソッドに 付 与 することはできません 例 えばオーバーライドされる 側 のインスタンスメソッドにprotectedが 指 定 されている 場 合 オーバーライドする 側 のインスタンスメソッドにpublic を 指 定 することはできません 3.オーバーライドされる 側 のインスタンスメソッドに 指 定 されるthrows 節 以 外 の 例 外 をオーバーライドする 側 の インスタンスメソッドに 指 定 することはできません 但 し オーバーライドされる 側 に 指 定 された 例 外 をより 限 定 する 例 外 をオーバーライドする 側 に 指 定 することはできます 4.オーバーライドされる 側 のインスタンスメソッドにfinal 修 飾 子 が 付 与 されている 場 合 そのインスタンスメソッ ドをオーバーライドすることはできません 5.オーバーライドされる 側 のインスタンスメソッドにabstract 修 飾 子 が 付 与 されている 場 合 そのメソッドはサブ クラスで 必 ずオーバーライドしなければなりません オーバーライドしない 場 合 はそのサブクラス 全 体 が abstractクラスになります 青 山 システムズ 41
4.クラスとインタフェース 4.7オーバロードとオーバライド オーバーロードを 定 義 する 際 には 以 下 の 規 定 があります 1. 異 なるメソッドと 認 識 される 部 分 は メソッドの 次 の 個 所 です 引 数 の 型 引 数 の 数 引 数 の 並 び 順 2. 次 の 個 所 が 異 なっていても 異 なるメソッドとは 認 識 されません コンパイルエラーとなります 戻 り 型 アクセスレベル 引 数 名 throws 節 青 山 システムズ 42
4.クラスとインタフェース 4.8 抽 象 クラス 青 山 システムズ 43
4.クラスとインタフェース 4.8 抽 象 クラス 抽 象 メソッドは 以 下 の 枠 内 のフォーマットで 宣 言 されます 抽 象 メソッ ドは 実 装 を 持 たないため {}は 必 要 ありません abstract 戻 り 型 メソッド 名 ( 引 数 型 引 数 名 ); 抽 象 クラスは 以 下 の 枠 内 のフォーマットで 宣 言 されます abstract class クラス 名 { クラス 本 体 } 抽 象 クラスには 以 下 のルールがあります 1. 抽 象 クラスのオブジェクトを 生 成 することはできません 2. 抽 象 クラスには 抽 象 メソッドがあってもいいし 抽 象 メソッドでないメソッド があってもいいです しかし 抽 象 メソッドがあるクラスは 必 ず 抽 象 クラス として 宣 言 しなければいけません 3. 抽 象 メソッドがない 抽 象 クラスを 宣 言 することもできます かならず 継 承 が 行 われ なんらかのメソッドの 変 更 があることを 表 します 4. 抽 象 クラスを 継 承 したサブクラスで 抽 象 メソッドを 実 装 (オーバーライド) しない 場 合 そのサブクラスは 抽 象 クラスとして 宣 言 されます 青 山 システムズ 44
4.クラスとインタフェース 4.8 抽 象 クラス メソッドのヘッダーのみ 宣 言 し 実 装 を 継 承 したサブクラスに 任 せる (インタフェースの 場 合 はインプリメントしたクラスに 任 せる)といった ことを 考 えると 抽 象 クラスとインタフェースは 似 た 役 割 をはたす しかし 両 者 には 大 きな 違 いがあります その 違 いを 以 下 のとおり 1. 抽 象 クラスには 抽 象 メソッドと 抽 象 メソッドでないメソッドの 両 方 を 宣 言 す ることができますが インタフェースは 抽 象 メソッドのみしか 宣 言 することができません 2. サブクラスで 継 承 できる 抽 象 クラスはJavaは 多 重 継 承 をサポートしてい ないため 1つのみです インプリメントするインタフェースは 複 数 インプリメントすることができます 3. 抽 象 クラスの 機 能 を 利 用 するためには 抽 象 クラスを 継 承 する 必 要 があり ます そのため その 機 能 は 継 承 関 係 内 に 限 られます インタフェースはインプリメントにより 利 用 することができます そのため その 機 能 が 継 承 関 係 内 に 限 られることはありません 青 山 システムズ 45
4.クラスとインタフェース 4.9インタフェース 青 山 システムズ 46
4.クラスとインタフェース 4.9インタフェース Greeting.javaファイル //1インタフェースGreetingの 作 成 interface Greeting { void greet( ); //2インタフェース 内 ではヘッダー 定 義 のみ } ShowingDate.javaファイル //3インタフェースShowingDateの 作 成 interface ShowingDate { void showdate( ); //4インタフェース 内 ではヘッダー 定 義 のみ } 青 山 システムズ 47
4.クラスとインタフェース 4.9インタフェース インタフェース(interface)インタフェース は ある 機 能 を 実 現 するクラスが 必 ず 実 装 するべきメソッ ドの 名 前 や 型 といった 作 法 のみを 定 義 するものです interface を 用 いて 定 義 します インタフェー スで 定 義 されるメソッド( 抽 象 メソッド)の 実 体 は implements を 用 いた 側 のクラスで 実 装 しなくては なりません interface インタフェース 名 { : } 下 記 は ActionListener インタフェースの 実 際 の 定 義 例 です EventListener インタフェースを 継 承 しています インタフェース 内 で 定 義 されるメソッドには 暗 黙 的 に abstract 宣 言 と public 宣 言 がつけられます public interface ActionListener extends EventListener { public void actionperformed(actionevent e); } インタフェースの 実 装 (implements)インタフェースを 実 装 するには implements を 用 いて 下 記 のように 定 義 します インタフェース 名 は カンマ(,)で 区 切 って 複 数 指 定 することができます implements を 用 いた 場 合 インタフェース 名 で 指 定 された 抽 象 メソッドを 実 装 することが 義 務 付 け られます class クラス 名 implements インタフェース 名 { : 青 山 システムズ 48 }
4.クラスとインタフェース 4.9インタフェース インタフェース 修 飾 子 (public,...)インタフェースの 修 飾 子 には public abstract strictfp を 指 定 することができます 修 飾 子 interface インタフェース 名 { : } インタフェースをクラス 内 に 定 義 する 場 合 には 加 えて protected private static を 指 定 する ことが 可 能 になります class クラス 名 { 修 飾 子 interface インタフェース 名 { : } } インタフェースの 継 承 (extends) 親 インタフェースの 定 義 を 継 承 するには extends を 用 います interface インタフェース 名 extends 親 インタフェース 名 { : } 青 山 システムズ 49
4.クラスとインタフェース 4.10 可 変 長 引 数 リスト 可 変 個 の 引 数 を 持 つメソッドを 実 現 したい 場 合 が 考 えられます C 言 語 のprintf 関 数 のような 機 能 です そういった 場 合 これまでのJavaでは 配 列 を 用 いて 実 現 してきまし た public void printcities(string[] cities){... } printcities(new String[]{" 京 都 ", " 大 阪 ", " 神 戸 "}); printcities(new String[]{" 東 京 ", " 千 葉 "}); 非 常 に 面 倒 です そこでJDK5.0からは 可 変 長 引 数 を 持 つメソッドを 定 義 する 機 能 が 追 加 されました 可 変 長 引 数 の 定 義 は 可 変 長 にしたい 引 数 の 型 の 後 ろに... を 追 加 し ます 例 えば 先 ほどの 例 は 以 下 のようになります public void printcities(string... cities){... } 呼 び 出 す 側 も 簡 単 になっており 配 列 を 用 いずにすませることができます printcities(" 京 都 ", " 大 阪 ", " 神 戸 "); printcities(" 東 京 ", " 千 葉 "); 青 山 システムズ 50
4.クラスとインタフェース 4.10 可 変 長 引 数 リスト 引 数 を 指 定 せずに 呼 び 出 すことも 可 能 です printcities(); さて 可 変 長 にされた 引 数 の 取 り 扱 いですが メソッド 内 では 配 列 として 扱 います 引 数 が 指 定 されなかった 場 合 には 要 素 0の 配 列 として 扱 います これはコンパイラによっ て 可 変 長 引 数 は 配 列 に 変 換 されるからです public void printcities(string... cities){ for(int i=0; i < cities.length; i++){ System.out.println(cities[i]); } } 可 変 長 引 数 は コンパイラによって 配 列 に 変 換 されると 知 っておけば 難 しいことはあり ません しかし 配 列 と 異 なって 以 下 のような 制 約 があります 注 意 してください メソッドが 複 数 の 引 数 をとる 場 合 最 後 の 引 数 にしかできません また1つのメソッドで1つしか 可 変 長 引 数 を 定 義 できません メソッドがオーバーローディングされていて 引 数 が 固 定 のメソッドと 可 変 個 のメソッド がマッチした 場 合 前 者 が 優 先 される 青 山 システムズ 51
4.クラスとインタフェース 4.11 列 挙 型 まずはじめに 簡 単 な enum 型 の 定 義 を 示 します public enum Color { RED, BLUE, YELLOW, BLACK, WHITE } enumは 内 部 的 にはクラスであり enum 型 を 定 義 する 場 所 はクラスを 定 義 する 場 所 と 同 じです enum 型 もクラス 同 様 パッケージに 属 します 基 本 的 には 1 ファイルにひとつの enum 型 を 定 義 し 型 名 と 同 じファイル 名 (Color 型 であれば Color.java)のファイルに 記 述 しますが 内 部 クラスのよう に 他 のクラスの 内 部 にも 定 義 することができます(クラス 内 部 で 定 義 した 場 合 暗 黙 的 に static な 型 となります) アクセス 権 やアクセス 方 法 もクラスの 場 合 と 同 じです 上 記 の Color クラスを javap コマンドで 逆 コンパイルすると 以 下 のように 表 示 されます Compiled from "Color.java"public class Color extends java.lang.enum{ public static final Color RED; public static final Color BLUE; public static final Color YELLOW; public static final Color BLACK; public static final Color WHITE; static {}; public static final Color[] values(); public static final Color valueof(java.lang.string); } 青 山 システムズ 52
4.クラスとインタフェース 4.11 列 挙 型 これから 以 下 のようなことがわかります enum 宣 言 された 型 は java.lang.enum を 継 承 している 各 メンバはそれ 自 身 宣 言 した 型 (もしくはそのサブクラス)のインスタンスであり public static final な 定 数 である values メソッドは 宣 言 された 定 数 全 てを 含 む 配 列 ( 順 序 は 記 述 順 )を 返 すメソッドで valueof メソッドは 文 字 列 から 定 数 インスタンスを 取 得 するメソッドです Color white = Color.valueOf( WHITE ); // white は Color.WHITE を 保 持 する Enum クラスでは 他 に 以 下 のようなメソッドが 定 義 されています メソッド public final String name() 説 明 宣 言 で 定 義 された 定 数 名 を 返 します オーバーライドすることはで きません public String tostring() public final int ordinal() 定 数 名 を 返 します デフォルトでは name() と 同 じ 値 を 返 しますが オーバーライドすることもできます 定 数 の 宣 言 された 順 番 を 返 します ただし 通 常 は 順 番 に 依 存 した プログラムを 記 述 するべきではありません 青 山 システムズ 53
4.クラスとインタフェース 4.12オブジェクト 指 向 クラスは 情 報 を 隠 蔽 し データをカプセル 化 する 継 承 関 係 は is a 合 成 は has a などと 呼 ばれる オブジェクト 指 向 とは クラス 継 承 ポリモーフィズムを 有 効 に 利 用 すること 結 合 度 が 弱 く 凝 集 度 が 高 いクラスがよいと 考 えられる 青 山 システムズ 54
5. 参 照 型 変 数 とオブジェクト 5.1 参 照 型 変 数 変 換 元 の 基 本 型 型 変 換 が 可 能 な 変 更 先 の 基 本 型 boolean char byte short int long float double なし int, long, float, double short, int, long, float, double int, long, float, double long, float, double float, double double なし 青 山 システムズ 55
5. 参 照 型 変 数 とオブジェクト 5.1 参 照 型 変 数 代 入 時 の 型 変 換 int x = 10; double y; y = x; int x = 10; short y; y = x; メソッド 呼 び 出 し 時 の 型 変 換 short x = 10; System.out.println(Integer.toString(x)); double y = 20.25; System.out.println(Integer.toString(y)); 青 山 システムズ 56
5. 参 照 型 変 数 とオブジェクト 5.1 参 照 型 変 数 Javaの 変 数 には 大 きく 分 けて2つの 型 があります 基 本 型 (プリミティブ 型 )と 参 照 型 (オブジェクト 型 )です 参 照 型 にはクラス 型 インタフェース 型 配 列 型 がありま す オブジェクトを 生 成 する 際 String s = new( Hello ); と 言 う 形 でオブジェクトsを 生 成 します このオブジェクト 変 数 sが クラス 型 の 変 数 と 言 えます 参 照 型 はオブジェクトを 参 照 するので 同 じオブジェクトを 指 す 変 数 が 複 数 あるときは 注 意 が 必 要 Stringは 不 変 の 文 字 列 を 表 すクラス 青 山 システムズ 57
5. 参 照 型 変 数 とオブジェクト 5.2 配 列 配 列 青 山 システムズ 58
5. 参 照 型 変 数 とオブジェクト 5.2 配 列 配 列 の 宣 言 配 列 型 [ ] 配 列 名 ; int[ ] intarray; String[ ] stringarray; 配 列 の 生 成 配 列 名 = new 配 列 型 [サイズ]; intarray = new int[10]; //int 型 の 配 列 intarrayを 宣 言 //String 型 の 配 列 stringarrayを 宣 言 //10 個 のint 型 データを 持 つ 配 列 intarrayを 生 成 double[ ] doublearray = new double[10]; // 配 列 の 宣 言 と 生 成 を 同 時 に 行 う こともできます int size = 10; char[ ] chararray = new char[size]; //int 型 の 値 であれば 変 数 を 配 列 のサイズ 指 定 に 使 うこともできます int intarray[ ] = new int[10];system.out.println(int[0]); //0が 表 示 されます 青 山 システムズ 59
5. 参 照 型 変 数 とオブジェクト 5.3 配 列 とオブジェクト 配 列 型 byte short int long float double char boolean 参 照 型 (オブジェクト 型 ) 初 期 値 0 0 0 0L 0.0f 0.0d ' u0000' FALSE NULL 青 山 システムズ 60
5. 参 照 型 変 数 とオブジェクト 5.3 配 列 とオブジェクト 構 文 配 列 型 [ ] 配 列 名 = {データ,データ, }; double[ ] doublearray = {1.05d,1.06d,1.07d}; //double 型 の 配 列 doublearrayを 宣 言 生 成 String[ ] stringarray = {"Sunday","Monday","Tuesday"}; //String 型 の 配 列 stringarrayを 宣 言 生 成 String[ ] stringarray = new String[10]; System.out.println(stringArray[0].length( )); // 配 列 要 素 (stringarray[0])にstringオブジェクトの 生 成 を 行 っていないため // 例 外 NullPointerExceptinが 返 されます String[ ] stringarray = new String[10]; stringarray[0] = new String("Sunday"); //Stringオブジェクトの 生 成 System.out.println(stringArray[0].length( )); // 配 列 要 素 (stringarray[0])にstringオブジェクトの 生 成 を 行 っているため // 正 しく 実 行 されます String[ ] stringarray = {"Sunday","Monday","Tuesday"}; System.out.println(stringArray[0]); // 初 期 化 子 を 指 定 した 場 合 は 配 列 の 各 要 素 のオブジェクトの // 生 成 も 同 時 に 行 われます 青 山 システムズ 61
5. 参 照 型 変 数 とオブジェクト 5.4 メソッドとオブジェクト メソッドの 引 数 はコピーされてメソッドに 渡 される 引 数 として 渡 される 基 本 データ 型 変 数 の 値 は 変 化 しない 引 数 として 渡 される 参 照 型 変 数 の 型 は 変 化 しないが そ の 変 数 の 指 すオブジェクトを 変 更 することができる 青 山 システムズ 62
5. 参 照 型 変 数 とオブジェクト 5.5 ガーペッジコレクション 参 照 されるオブジェクトのメモリは ガーペッジコレクタに 回 収 される ガーペッジコレクションを 促 されるが そのタイミングは 調 整 することができない finalizeによって 後 始 末 処 理 (メモリ 以 外 のリソースの 回 収 など)ができる 青 山 システムズ 63
6. 型 変 換 6.1 基 本 データ 型 の 暗 黙 的 型 変 換 変 換 元 の 基 本 型 型 変 換 が 可 能 な 変 更 先 の 基 本 型 boolean char byte short int long float double なし int, long, float, double short, int, long, float, double int, long, float, double long, float, double float, double double なし 青 山 システムズ 64
6. 型 変 換 6.1 基 本 データ 型 の 暗 黙 的 型 変 換 算 術 演 算 子 単 項 演 算 子 (+, -, ~) 二 項 演 算 子 (+, -, *, /, %, >>, >>>, <<, &, ^, ) ルール char, byte, short 型 の 変 数 はint 型 に 型 変 換 されます 上 記 以 外 の 型 の 変 数 は 型 変 換 は 行 われません 一 方 の 変 数 がdouble 型 の 場 合 もう 一 方 の 変 数 もdouble 型 に 型 変 換 されます 両 方 の 変 数 にdouble 型 が 含 まれず 一 方 の 変 数 がfloat 型 の 場 合 もう 一 方 の 変 数 もfloat 型 に 型 変 換 されます 両 方 の 変 数 にdouble 型 float 型 が 含 まれず 一 方 の 変 数 が long 型 の 場 合 もう 一 方 の 変 数 もlong 型 に 型 変 換 されます 両 方 の 変 数 にdouble 型 float 型 long 型 が 含 まれない 場 合 は 両 方 の 型 がint 型 に 変 換 されます 青 山 システムズ 65
6. 型 変 換 6.2 参 照 型 の 暗 黙 的 型 変 換 変 換 元 の 参 照 型 クラス 型 インタフェース 型 配 列 型 変 換 先 の 参 照 型 クラス 型 インタフェース 型 配 列 型 クラス 型 インタフェース 型 配 列 型 クラス 型 インタフェース 型 配 列 型 変 換 先 のクラス 型 が 変 換 元 のクラス 型 のスーパークラスで あること 変 換 先 のインタフェース 型 のインタフェースを 変 換 元 のクラ ス 型 のクラスが 実 装 していること 型 変 換 不 可 変 換 先 のクラス 型 がObjectクラスであること 変 換 先 のインタフェース 型 が 変 換 元 のインタフェース 型 の スーパーインタフェースであること 型 変 換 不 可 型 変 換 のルール 変 換 先 のクラス 型 がObjectクラスであること 変 換 先 のインタフェース 型 がCloneableインタフェース Serializableインタフェースであること 変 換 元 の 配 列 要 素 のデータ 型 と 変 換 先 の 配 列 要 素 の データ 型 において 型 変 換 のルールに 合 致 していること 青 山 システムズ 66
6. 型 変 換 6.3 基 本 データ 型 のキャスト ( 変 換 したい 型 ) 変 換 元 の 変 数 ; int x = 10; byte y = (byte)x; キャストのルール boolean 型 以 外 の 基 本 型 の 変 数 を 他 のboolean 型 以 外 の 基 本 型 の 変 数 にキャストできます boolean 型 はどの 型 へもキャストできません 青 山 システムズ 67
6. 型 変 換 6.4 参 照 型 のキャスト 変 換 元 の 参 照 型 クラス 型 インタフェース 型 配 列 型 変 換 先 の 参 照 型 クラス 型 インタフェース 型 配 列 型 クラス 型 インタフェース 型 配 列 型 クラス 型 インタフェース 型 配 列 型 変 換 元 のクラスと 変 換 先 のクラスに 継 承 関 係 があること どちらが スーパークラスであって もかまわない すべてキャスト 可 能 参 照 型 の 配 列 であること すべてキャスト 可 能 すべてキャスト 可 能 キャスト 不 可 変 換 先 のクラス 型 がObjectクラスであること キャスト 不 可 型 変 換 のルール 変 換 元 の 配 列 要 素 のデータ 型 と 変 換 先 の 配 列 要 素 のデータ 型 において キャストのルール に 合 致 していること 青 山 システムズ 68
7.フロー 制 御 7.1 基 本 ループ 繰 り 返 し(for)for 文 は 処 理 を 繰 り 返 して 実 行 する 場 合 に 用 います 下 記 の 例 は println() を 10 回 繰 り 返 す 例 です 最 初 に i に 0 を 代 入 し i の 値 を ++ でインクリメントしながら i の 値 が 10 よりも 小 さい 間 System.out.println(i) の 実 行 を 繰 り 返 します int i; for (i = 0; i < 10; i++) { System.out.println(i); } 繰 り 返 し(while)while 文 は 条 件 が 真 である 間 処 理 を 繰 り 返 します 下 記 の 例 では i の 値 が 10 よりも 小 さい 間 println() の 実 行 を 繰 り 返 します int i = 0; while (i < 10) { System.out.println(i); i++; } 繰 り 返 し(do while)do while 文 は while 文 と 似 ていますが 条 件 が 偽 でも 最 低 1 回 は 処 理 を 実 行 する 点 がことな ります int i = 0; do { System.out.println(i); i++; } while (i < 10); 青 山 システムズ 69
7.フロー 制 御 7.2 多 重 ループとbreak/continue 処 理 を 抜 ける(break)break は 最 も 内 側 の for ループ while ループ do ループや case 文 の 残 りの 処 理 を 飛 ばし 処 理 を 抜 けます 下 記 の 例 では i の 値 が 5 の 時 に for ループを 抜 け 出 し finish!! を 書 き 出 します for (i = 0; i < 10; i++) { if (i == 5) { break; } System.out.println(i); } System.out.println("finish!!"); ラベルを 指 定 することにより 多 重 のループを 一 度 に 抜 け 出 すこともできます 下 記 の 例 では i == 1 j == 5 の 時 に loop1 のラベルで 指 定 した 外 側 の for ループを 抜 けます ラベルには 任 意 の 名 前 をつけることが できます loop1: for (i = 0; i < 10; i++) { for (j = 0; j < 10; j++) { if ((i == 1) && (j == 5)) { break loop1; } } } 青 山 システムズ 70
7.フロー 制 御 7.2 多 重 ループとbreak/continue 処 理 を 繰 り 返 す(continue)continue は 最 も 内 側 の for ループ while ループ do ループ 文 の 残 りの 処 理 を 飛 ばし 次 のループを 開 始 します Perl 言 語 の next 文 に 相 当 します 下 記 の 例 では i の 値 が 5 の 時 に println() の 実 行 をスキップし i が 6 のループに 移 ります for (i = 0; i < 10; i++) { if (i == 5) { continue; } System.out.println(i); } break と 同 様 に ラベルで 指 定 した 多 重 ループの 外 側 のループに 作 用 さ せることも 可 能 です 青 山 システムズ 71
7.フロー 制 御 7.3 ラベルつきループ 7.2を 参 照 青 山 システムズ 72
7.フロー 制 御 7.4 拡 張 forループ 拡 張 for 文 は for 文 を 拡 張 した 新 しい 構 文 です 配 列 および 全 てのコレクションクラスに 対 して 適 応 することができます 例 えば 以 下 のようなStringを 格 納 したArrayListを 考 えます List<String> list = new ArrayList<String>(); list.add(" 京 都 "); list.add(" 大 阪 "); list.add(" 神 戸 "); この 要 素 を1つずつ 取 り 出 して 標 準 出 力 に 出 力 する 場 合 これまでのfor 文 を 用 いれば 例 えば 以 下 のようになりました for(iterator<string> iterator=list.iterator(); iterator.hasnext(); ){ System.out.println(iterator.next()); } これを 拡 張 for 文 を 用 いて 記 述 すると 以 下 のようになります for(string city : list){ System.out.println(city); } 青 山 システムズ 73
7.フロー 制 御 7.4 拡 張 forループ 非 常 に 簡 単 に 記 述 することができます 拡 張 for 文 の 文 法 を 以 下 に 示 します for( 型 変 数 名 : 式 ){ 文 } 式 の 部 分 には 以 下 のいずれかを 返 す 式 を 記 述 します 配 列 次 の 節 で 説 明 する java.lang.iterable インタフェースを 実 装 したクラスのインスタンスjava.util.Setや java.util.listのインスタンスなど 他 の 点 ではこれまでのfor 文 と 同 じです 宣 言 した 変 数 はforループ 内 でのみ 使 用 することができま す またjava.util.Setやjava.util.ListはIterableインタフェースのサブクラスですので これらを 実 装 したコレクションクラスを 拡 張 for 文 で 使 用 することができます 非 常 に 便 利 な 拡 張 for 文 ですが これまでの 通 常 のfor 文 でできることを 全 て 実 現 できるわけではあ りません 配 列 やコレクションクラスの 要 素 を 1つずつ 先 頭 から 取 得 することができるだけです つまり 後 ろから 順 に 取 得 することや 1つ 飛 ばしに 取 得 することなどはできません そういった 場 合 には 通 常 のfor 文 を 使 用 してください 青 山 システムズ 74
7.フロー 制 御 7.5 条 件 分 岐 if 文 は もし なら という 制 御 を 実 現 します 次 の 例 では もし a の 値 が 3 であれば "a is 3." を 表 示 します int a = 3; if (a == 3) { System.out.println("a is 3."); } else は さもなくば を 意 味 します 次 の 例 では もし a の 値 が 3 であれば "a is 3." を さもなくば "a is not 3." を 表 示 します int a = 3; if (a == 3) { System.out.println("a is 3."); } else { System.out.println("a is not 3."); } else if を 繰 り 返 して 使 用 することもできます 次 の 例 では もし a が 3 であれば "a is 3." を a が 4 であれば "a is 4." を さもなくば "a is unknown." を 表 示 します int a = 3; if (a == 3) { System.out.println("a is 3."); } else if (a == 4) { System.out.println("a is 4."); } else { System.out.println("a is unknown."); } 青 山 システムズ 75
7.フロー 制 御 7.5 条 件 分 岐 分 岐 (switch)switch 文 は 条 件 で 指 定 した 値 に 応 じて 処 理 を 振 り 分 けます 条 件 には 数 値 のみを 指 定 することができます case 文 の 値 には 固 定 値 を 指 定 します 実 行 時 に 値 の 変 わる 変 数 を 指 定 することはできません default は 他 のどの 条 件 にもマッチしなかった 場 合 に 実 行 されます int n = 3; switch (n) { case 1: System.out.println("n is one."); break; case 2: System.out.println("n is two."); break; case 3: System.out.println("n is tree."); break; default: System.out.println("unknwon"); break; } 青 山 システムズ 76
7.フロー 制 御 7.6 switch 文 と 列 挙 子 ラッパクラス J2SE1.4 までは switch 文 で 使 用 できる 型 は 整 数 プリミティブ 型 (int/short/char/byte)のみでした が J2SE5.0 では enum 型 参 照 も 使 用 できるように 言 語 仕 様 が 拡 張 されました Color color;... switch (color) { case RED:... case BLUE:... case YELLOW:... case BLACK:... case WHITE:... } この 際 case 文 のラベルには 定 数 名 だけを 記 述 します 通 常 は 外 部 から enum 型 の 定 数 を 参 照 するときにはクラス 名 が 必 要 ですが(たとえば Color.RED というように) case 文 のラベルとして 使 用 するときは 特 別 に 定 数 名 だけで 良 い 事 になっています 青 山 システムズ 77
8. 例 外 8.1 例 外 例 外 とは プログラム 動 作 における 予 期 せぬ 事 象 (エラー)のこと Javaでは 例 外 が 発 生 した 時 あらかじめ 用 意 されているエラーメッセージ(Exception in thread main java.lang.arithmeticexception など)を 表 示 しプログラムを 終 了 これがJavaのデフォルトの 例 外 処 理 Javaではデフォルトの 例 外 処 理 以 外 に エラーメールの 送 信 エラーログの 生 成 強 制 終 了 処 理 の 実 行 と いった 任 意 の 例 外 処 理 を 付 け 加 えることができる 以 下 はJavaで 例 外 処 理 を 行 う 上 で 使 用 するキーワードです 例 外 をスローする 例 外 ハンドラ 例 外 をキャッチする 青 山 システムズ 78
8. 例 外 8.2 例 外 の 種 類 とその 扱 い 例 外 が 発 生 した 際 例 外 オブジェクトが 生 成 されることからもわかるように Javaでは 例 外 をクラスにより 管 理 しています すべての 例 外 クラスはThrowableクラスの 子 孫 クラスです 例 外 関 連 のクラスは 大 きく 分 けて3つに 分 かれます Errorクラス RuntimeExceptionクラス RuntimeExceptionクラス 以 外 のExceptionクラスです Errorクラスには 例 外 処 理 では 復 旧 できない 種 類 の 例 外 クラスが 継 承 されています OutOfMemory(メモリの 不 足 )などです RuntimeExceptionクラスには JavaVMの 内 部 で 発 生 する 例 外 クラスが 継 承 されています NullPointerException(Null 参 照 を 通 してオブ ジェクトのメンバにアクセス) ArithmeticException( 整 数 を0で 除 算 )などです Errorクラス RuntimeExceptionクラスを 継 承 する 例 外 クラスにおいては 任 意 の 例 外 処 理 を 記 述 することは あまり 推 奨 されていません それはこれらの 例 外 クラスが 単 に 典 型 的 なプログラムを 記 述 した 際 においても その 数 は 膨 大 なものとなり 任 意 の 例 外 処 理 を 記 述 するメリットを 例 外 処 理 を 記 述 する 煩 雑 さ プログラム の 見 苦 しさが 上 回 ってしまうためです これらのデメリットを 上 回 るメリットがあるときのみ 任 意 の 例 外 処 理 を 記 述 します 例 外 処 理 を 記 載 しなくてもいい 事 からこれらの 例 外 は 非 チェック 例 外 と 呼 ばれています 一 方 RuntimeException 以 外 のExceptionクラスにおいては 必 ず 任 意 の 例 外 処 理 を 記 述 しなければなりま せん 記 述 しない 場 合 (デフォルトの 例 外 処 理 の 場 合 )はコンパイルエラーとなります 例 外 処 理 を 必 ず 記 載 する 必 要 があることからこれらの 例 外 はチェック 例 外 と 呼 ばれています 例 外 クラスとしては FileNotFoundException(ファイルが 見 つからなかった 場 合 )などがあります Exceptionクラスの 子 孫 クラスはクラス 名 の 最 後 に 必 ずExceptionが 付 きます ErrorクラスとExceptionクラ スの 区 別 は 容 易 に 行 えます 青 山 システムズ 79
8. 例 外 8.2 例 外 の 種 類 とその 扱 い try { 例 外 をスローする 可 能 性 のある 処 理 } catch ( 例 外 クラス 型 引 数 名 ) { 例 外 処 理 ( 例 外 ハンドラ) } finally { 最 後 に 必 ず 実 行 される 処 理 } 青 山 システムズ 80
8. 例 外 8.2 例 外 の 種 類 とその 扱 い try { 例 外 をスローする 可 能 性 のある 処 理 } catch ( 例 外 クラス 型 引 数 名 ) { 例 外 処 理 ( 例 外 ハンドラ) } finally { 最 後 に 必 ず 実 行 される 処 理 } try 節 では 例 外 をスローする 可 能 性 のある 処 理 を { }で 囲 みます try 節 で 囲 まれた 処 理 の 中 で 例 外 が 発 生 した 場 合 Java 実 行 時 環 境 は 該 当 する 例 外 ハンドラが 書 かれていないか 捜 しにいきます catch 節 ではスローされた 例 外 に 対 する 処 理 を 行 う 例 外 ハンドラを 記 載 します スローされた 例 外 オブ ジェクトとcatch 節 に 記 載 された 例 外 クラス 型 が 合 致 した 場 合 Java 実 行 時 環 境 はそのcatch 節 の 例 外 ハ ンドラを 実 行 します catch 節 に 記 載 された 引 数 名 を 利 用 して 該 当 する 例 外 オブジェクトの 情 報 を 参 照 す ることもできます finally 節 は 例 外 が 発 生 するしないにかかわらず 必 ず 実 行 したい 処 理 を 記 載 する 時 に 使 用 します 例 え ばファイルオープン 処 理 を 行 う 場 合 オープン 処 理 が 成 功 する 成 功 しないにかかわらずファイルクロー ズ 処 理 を 行 わなければならないとします そのような 時 にfinally 節 にファイルクローズ 処 理 を 記 載 します finally 節 は 必 須 項 目 ではありません 青 山 システムズ 81
8. 例 外 8.2 例 外 の 種 類 とその 扱 い 青 山 システムズ 82
8. 例 外 8.3 例 外 とメソッド メソッドのオーバーライドを 行 う 際 throwsで 指 定 する 例 外 クラス 型 の 指 定 方 法 の 注 意 点 スーパークラスのメソッドで 指 定 される 例 外 クラス 型 以 外 のチェッ ク 例 外 の 例 外 クラス 型 をサブクラスのメソッドで 指 定 することはで きない 非 チェック 例 外 の 例 外 クラス 型 は 指 定 可 能 スーパークラスのメソッドで 指 定 される 例 外 クラス 型 より 範 囲 の 広 い 例 外 クラス 型 をサブクラスのメソッドで 指 定 することはできな い スーパークラスのメソッドで 例 外 クラス 型 FileNotFoundException が 指 定 されていた 場 合 そのスーパークラスである 例 外 クラス 型 IOExceptionをサブクラスのメソッドに 指 定 することはできない 青 山 システムズ 83
8. 例 外 8.4 独 自 の 例 外 メソッド 名 ( 引 数 型 引 数 名 ) throws 例 外 クラス 型, 青 山 システムズ 84
8. 例 外 8.4 独 自 の 例 外 throwを 使 用 することにより 任 意 の 場 所 で 例 外 を 発 生 さ せることができる 以 下 のフォーマットによりthrowを 使 用 枠 内 の 例 外 オブジェクトを 参 照 する 式 には new 例 外 ク ラス を 使 用 throw 例 外 オブジェクトを 参 照 する 式 ; 青 山 システムズ 85
9.アサーション 9.1 アサーション アサーションとは 何 か アサーションは プログラムの 仕 様 をソースコードに 明 記 するものです 具 体 的 には プログラムの 実 行 時 に は 発 生 し 得 ない 場 合 を false とする boolean 式 を 含 み 仮 に false になるようなら java.lang.assertionerror を 発 生 させます AssertionError が 発 生 する 場 合 は プログラムが 予 期 しない 動 作 を 実 行 していることを 示 し ています 当 該 行 に 制 御 が 渡 るまでに なんらかのバグが 作 り 込 まれているということです アサーションは 行 として 記 述 して チェックポイントの 役 割 を 果 たします 極 論 すれば チェックポイント 間 を 結 ぶのが 制 御 です 何 らかの 処 理 の 前 に 記 述 すれば 事 前 条 件 をチェックし 後 ならば 事 後 条 件 をチェックでき ます 処 理 に 依 存 しないクラス 固 有 の 不 変 条 件 も ありえない 変 数 値 到 達 するはずのない 制 御 としてチェッ ク 可 能 です アサーションのシンタックス Java の 言 語 仕 様 で 採 用 されたアサーション 機 能 は 極 めてシンプルです 新 しく 追 加 されたキーワード "assert" を 使 い シンタックスは 次 の 二 通 りが 使 えます assert Expression1 ; assert Expression1 : Expression2 ; いずれの 場 合 も Expression1 は boolean 値 (true/false) を 返 す 式 です Expression2 は 値 を 返 す 任 意 の 式 で 値 は AssertionError のコンストラクタ 引 数 になります この 値 の 文 字 列 表 現 が 詳 細 メッセージに 使 わ れ 通 常 は 変 数 の 値 などの デバッグに 役 立 つトレース 情 報 を 記 述 します // x が null だと AssertionError assert x!= null; // y が 負 だと AssertionError // 詳 細 メッセージは "y = " + y assert y >= 0: "y = " + y; 青 山 システムズ 86
9.アサーション 9.2 アサーションの 有 効 化 と 無 効 化 アサーションを 適 切 に 記 述 する 場 合 アサーションが 通 れば その 点 までの 制 御 は 意 図 どおりに 通 っていることを 確 認 できたことになります アサーショ ンは チェックポイントの 役 割 を 果 たします アサーション 条 件 は 適 切 に 動 作 していれば 成 功 する 条 件 を 記 述 するので デバッグ 済 みの 完 成 したコード は 有 効 / 無 効 に 関 わらず 動 作 に 変 化 がないようにします アサーションをコンパイル 時 に 有 効 にするには コマンド "javac" にフラグ "- source 1.4" を 指 定 します 実 行 時 に 有 効 にするには コマンド "java" にフ ラグ "-ea" などを 指 定 します アサーションのコンパイル アサーションは デフォルトでは 無 効 になっています コンパイル 時 に "assert" をキーワード にするかどうか 指 定 するフラグがあります javac コマンドのアサーションフラグ: >javac -source 1.4 MyClass // assert をキーワードとして 認 識 する >javac -source 1.3 MyClass // assert をキーワードとして 認 識 しない SDK 1.4 でのデフォルトは "-source 1.3" です デフォルトの 場 合 は そのソースコードの 中 でアサーション 機 能 が 無 効 と 考 えられ "assert" が 識 別 子 /ラベルとして 使 われていても 警 告 はされますがコンパイルされます 一 方 "-source 1.4" を 指 定 すると アサーション 機 能 が 有 効 と 考 えられ エラーとなってクラ スファイルも 生 成 されません 青 山 システムズ 87
9.アサーション 9.2 アサーションの 有 効 化 と 無 効 化 アサーションの 実 行 java コマンドによる 実 行 時 にも フラグで 有 効 にしないと アサーション 行 は 空 行 と 等 価 の 扱 いで 無 視 されます 開 発 時 にはデバッグのために 有 効 にして 本 番 稼 動 時 には 無 効 にするのが 基 本 的 な 使 い 方 です java コマンドのアサーションフラグ: -ea[:<packagename>... :<classname>] - enableassertions[:<packagename>... :<classname>] 指 定 したクラス/パッ ケージのアサーションを 有 効 にする -da[:<packagename>... :<classname>] - disableassertions[:<packagename>... :<classname>] 指 定 したクラス/パッ ケージのアサーションを 無 効 にする -esa -enablesystemassertions システムクラス/ライブラリのアサーションを 有 効 にする -dsa -disablesystemassertions システムクラス/ライブラリのアサーションを 無 効 にする ピリオド 三 つ(...)がクラス 名 に 対 するワイルドカードとして 機 能 します "-ea/-da" の 場 合 クラス/パッケージ 名 を 指 定 しないと 全 てのクラスローダー が 全 てのパッケージに 対 してアサーションを 有 効 にしてクラスをロードします こ のとき システムライブラリ(コアパッケージ"rt.jar")は 明 示 的 なクラスローダを 持 たないので 除 外 されます コアパッケージのアサーションも 有 効 にしたい 場 合 は "-esa/-dsa" を 追 加 して 指 定 します 青 山 システムズ 88
9.アサーション 9.3 アサーションの 不 適 切 な 使 用 publicメソッド 内 の 引 数 のチェックにはアサーションを 用 い ない アサーション 内 では 副 作 用 があるboolean 式 は 使 用 し ない エンドユーザの 入 力 処 理 のチェックにはアサーションを 用 いない 青 山 システムズ 89
9.アサーション 9.4 不 変 条 件 クラスのオブジェクトが 満 たしておくべき 条 件 メソッド 実 行 前 と メソッド 実 行 後 にこの 条 件 を 確 認 します メソッド 実 行 前 に この 条 件 がエラーになると メソッド 呼 び 出 し 前 のプログラムコードにバグが あることを 表 します メソッド 実 行 後 にこの 条 件 がエラーになると メソッド 内 のプログラムコードにバグがあることを 表 します 不 変 条 件 の 例 としては クラスのメンバ 変 数 に 正 しい 値 が 設 定 されているか メンバ 変 数 同 士 の 関 係 は 正 しいか などがあります publicなメソッドの 引 数 チェックは 行 わない publicなメソッドの 引 数 チェックは 通 常 のプログラムコードの 中 で 常 に 行 われる べきであり アサーションを 利 用 して 行 うべきでないとされています プログラムで 必 要 な 処 理 をアサーションで 行 わない プログラムで 必 要 な 処 理 をアサーションで 行 うべきではありません 変 数 xを10 倍 する 処 理 があった 場 合 assert x * 10 > 100; と 記 載 するとアサーションを 利 用 しない 場 合 10 倍 する 処 理 が 行 われません この 場 合 は x = x * 10; assert x > 100; と 記 載 します 青 山 システムズ 90
9.アサーション 9.5 事 前 条 件 事 後 条 件 事 前 条 件 メソッドの 引 数 が 満 たしておくべき 条 件 この 条 件 がエ ラーになると メソッド 呼 び 出 し 前 のプログラムコードにバ グがあることを 表 します 事 後 条 件 メソッドの 処 理 終 了 時 点 で 満 たしておくべき 条 件 この 条 件 がエラーになると メソッド 内 のプログラムコードにバグ があることを 表 します 青 山 システムズ 91
10.スレッド 10.1 スレッド スレッドとは プログラムを 実 行 している 主 体 ( 例 えて 言 うなら1 人 の 人 間 )です すべてのプログラ ムはスレッドによって 実 行 されています 1つのスレッドは ひとりの 人 間 がプログラムを1 行 ずつ 読 んでプログラムの 流 れを 追 いかけるように 命 令 を1つずつ 解 釈 し 処 理 を 実 行 していきます スレッド(Thread)とはもともと 糸 という 意 味 ですが プログラムの 実 行 は 糸 をたぐるように 順 番 に 命 令 が 実 行 されていくため そのような 名 前 がついています 1つのスレッドはあくまでも1 本 の 糸 で あり 2つの 処 理 を 同 時 に 行 うことはありません Threadクラスを 継 承 する 方 法 Threadクラスを 継 承 したクラスを 利 用 して 新 しいスレッドを 実 行 するには 次 のような 手 順 を 用 います Threadクラスを 継 承 するクラスを 作 成 する そのクラスでrunメソッドを 宣 言 する そのクラスのインスタンスを 作 成 する そのインスタンスのstartメソッドを 呼 び 出 す Runnableインタフェースを 実 装 する 方 法 Runnableインタフェースを 実 装 したクラスを 利 用 して 新 しいスレッドを 実 行 するには 次 の 手 順 に 従 います Runnableインタフェースを 実 装 したクラスを 作 成 する そのクラスでrunメソッドを 実 装 する そのクラスのインスタンスを 作 成 する そのインスタンスを 引 数 としたコンストラクタでThreadクラスのインスタンスを 作 成 する そのThreadクラスのインスタンスのstartメソッドを 呼 び 出 す 青 山 システムズ 92
10.スレッド 10.2 スレッドの 状 態 初 期 状 態 新 しいスレッドを 作 成 した 状 態 です この 状 態 ではまだスレッドは 動 作 していません 次 の 章 で 説 明 するstart メソッドにより 実 行 可 能 状 態 となります 実 行 可 能 状 態 スレッドが 動 作 している 状 態 です この 状 態 は さらに 実 行 中 と 実 行 準 備 完 了 の2つ の 状 態 に 分 けられます 実 行 中 は 時 分 割 処 理 によって 実 際 にCPUによって 処 理 が 実 行 されている 状 態 です 通 常 のCPUが1つしかないコンピュータでは 実 行 中 のスレッド は 同 時 には 最 大 で1つだけしか 存 在 しません その 他 のスレッドは 実 行 準 備 完 了 状 態 で CPU 時 間 が 割 り 当 てられるのを 待 機 しています ブロック 状 態 ディスクの 入 出 力 操 作 や スレッドの 排 他 制 御 や 同 期 処 理 などにより スレッドの 動 作 が 一 時 的 に 休 止 している 状 態 です ブロック 状 態 となっている 原 因 が 解 消 されれば 実 行 可 能 状 態 に 戻 ります スレッドは 動 作 中 に 何 度 も 実 行 可 能 状 態 と ブロック 状 態 を 行 き 来 することができます 終 了 状 態 スレッドの 処 理 が 終 了 した 状 態 です 青 一 山 度 システムズ 終 了 状 態 になったスレッドは 再 び 動 作 を 開 始 93 することはありません
10.スレッド 10.2 スレッドの 状 態 戻 り 型 static int static int static int 定 数 MAX_PRIORITY MIN_PRIORITY NORM_PRIORITY 説 明 スレッドに 設 定 できる 最 高 優 先 順 位 10を 表 しま す スレッドに 設 定 できる 最 低 優 先 順 位 1を 表 しま す スレッドに 設 定 できるデフォルト 優 先 順 位 5を 表 します int void 戻 り 型 メソッド getpriority setpriority 説 明 スレッドの 優 先 順 位 を 返 します スレッドの 優 先 順 位 を 変 更 します 青 山 システムズ 94
10.スレッド 10.2 スレッドの 状 態 生 成 1.new 演 算 子 によりスレッドオブジェクトが 生 成 されます 生 成 段 階 ではまだスレッドオブジェクトにシステム 資 源 は 割 り 当 てられていません 実 行 可 能 2.startメソッドの 実 行 によりスレッドは 実 行 可 能 状 態 になりま す この 状 態 になりスレッドオブジェクトにシステム 資 源 が 割 り 当 てられます 実 行 3.Javaを 実 行 するシステムのスケジュール 機 能 に 従 い 実 行 可 能 状 態 にあるスレッドのうち1つが 実 行 (CPUが1つの 場 合 )されます この 時 runメソッドが 実 行 されます 4-1.Javaを 実 行 するシステムのスケジュールに 従 い より 優 先 度 の 高 いスレッドが 実 行 されたり タイムスケジュールによ り 他 のスレッドが 実 行 された 場 合 現 在 実 行 されているスレッ ドは 実 行 可 能 状 態 となり 再 び 実 行 状 態 になるのを 待 ちます 4-2.yieldメソッドは 同 一 優 先 度 のメソッドが 実 行 可 能 状 態 に ある 場 合 実 行 状 態 であるyeildメソッドを 呼 び 出 したスレッド を 実 行 可 能 状 態 にし 他 の 実 行 可 能 状 態 にあるスレッドを 実 行 状 態 にするためのものです システムのスケジュール 機 能 にも 依 存 しますが より 低 い 優 先 度 のスレッドが 実 行 可 能 状 態 にある 場 合 は yieldメソッドは 無 視 されます 実 行 不 可 何 らかの 処 理 により 実 行 状 態 にあるスレッドが 実 行 状 態 でなく なります( 実 行 不 可 状 態 ) この 間 他 のスレッドが 実 行 状 態 になります 青 山 システムズ 95
10.スレッド 10.3 モニター クラスやインスタンスはそれぞれ ロック というものを 持 っています ロックと は 鍵 のことです スレッドは synchronizedブロックの 開 始 時 に synchronized 文 で 指 定 したオブジェクトのロックを 取 得 し 終 了 時 にそのロッ クを 開 放 します あるスレッドがロックを 取 得 している 状 態 では 他 のスレッド は 同 じロックを 取 得 することができません ロックが 返 却 されるまで 待 たされ ます つまり 同 じオブジェクトのロックを 獲 得 しようとするsynchronizedブロック 同 士 は 原 則 として 同 時 には 並 行 して 実 行 されないことになります オブジェク トに 鍵 をかけて 他 のスレッドに 邪 魔 されないようにして 作 業 をしていると 考 えるとよいでしょう ただし オブジェクトに 対 して 鍵 をかけると 考 えると synchronizedブロックの 実 行 は 絶 対 に 割 り 込 まれないと 思 うかもしれませんが それは 誤 りです ロックが 使 用 中 であるかどうかを 気 にするのは あくまでも スレッドが synchronizedブロックを 実 行 しようとしているときだけです あるスレッドが synchronizedブロックでオブジェクトを 独 占 しているつもりでも synchronizedを 利 用 していない 箇 所 からのアクセスを 防 ぐことはできません 青 山 システムズ 96
10.4 モニターによるスレッドの 制 御 10. スレッド 10.4 モニターによるスレッドの 制 御 課 税 後 価 格 は105.0 円 です 課 税 後 価 格 は210.0 円 です priceputで 新 しい 価 格 が 設 定 される 前 に 課 税 後 価 格 は210.0 円 です pricegetが 実 行 されたため 価 格 がダブ っている 課 税 後 価 格 は420.0 円 です 課 税 後 価 格 は525.0 円 です 青 山 システムズ 97
10.スレッド 10.4 モニターによるスレッドの 制 御 実 行 結 果 を 意 図 したように 導 き 出 すためには 以 下 の 点 を 考 慮 する 必 要 があります 1.pricePutメソッド もしくはpriceGetメソッドでオブジェクトの 値 (ここ では 変 数 workarea)を 操 作 している 間 他 の 処 理 からオブジェクトへ のアクセスを 防 ぐ 必 要 があります priceputメソッドで 値 を 設 定 してい ると 同 時 に pricegetメソッドでオブジェクトへアクセスがあった 場 合 そのオブジェクトが 破 壊 されてしまう 恐 れがあります これを 防 ぐため にはsynchronizedを 使 用 します synchronizedで 指 定 された 処 理 は 処 理 を 実 行 しているオブジェクトを 他 の 処 理 からアクセスされないよ うロックします 2.pricePutメソッドで 変 数 workareaに 値 を 代 入 した 後 にpriceGetメ ソッドでその 値 を 抜 出 す 必 要 があります このためにはpricePutメ ソッドを 動 作 させるスレッドとpriceGetメソッドを 動 作 させるスレッドの 間 で 何 らかの 同 期 を 行 う 必 要 があります スレッドを 同 期 させる 方 法 として waitメソッド notifyallメソッドを 使 用 します 青 山 システムズ 98
10.スレッド 10.5 synchronized メソッドに 指 定 する 場 合 synchronized 戻 り 型 メソッド 名 ( 引 数 型 引 数 名 ){ メソッド 本 体 } ; ブロックに 指 定 する 場 合 synchronized (ロックするオブジェク ト){ } ; クリティカルセクションコード 青 山 システムズ 99
10.スレッド 10.5 synchronized synchronizedはメソッド ブロックに 対 して 指 定 するもので す synchronizedが 指 定 されると 指 定 されたメソッド ブ ロックが 属 するオブジェクトはメソッド ブロックを 実 行 して いる 間 同 じオブジェクト 内 のsynchronizedが 指 定 された メソッド ブロックからアクセスされないようロックされます オブジェクトを 共 有 するメソッド ブロックをクリティカルセ クションと 言 います synchronizedはクリティカルセクショ ンに 指 定 します 今 回 の 例 題 では 変 数 workareaを 共 有 するpricePutメソッドと pricegetメソッドがクリティカルセ クションです 青 山 システムズ 100
10.スレッド 10.6 スレッド 関 連 の 重 要 なメソッド メソッド 名 start yield sleep join getpriority setpriority interrupt holdslock run wait notify notifyall スレッドの 優 先 度 を 返 します 動 作 スレッドを 実 行 可 能 状 態 にします 同 じスレッドで 二 回 以 上 このメソッドを 呼 び 出 すと 例 外 IllegalThreadStateExceptionをスローします 実 行 中 のスレッドの 実 行 を 休 止 させ 他 のスレッドに 実 行 のチャンスを 与 えます ただし 次 にどのスレッド を 実 行 するかは 分 かりません 実 行 中 のスレッドを 実 行 不 可 能 状 態 にします 引 数 で 与 えられた 時 間 だけスリープしますが ミリ 秒 単 位 で 指 定 するものと ミリ 秒 とナノ 秒 の 二 つを 指 定 できるものがあります オブジェクト 変 数 に 対 してこのメソッドを 実 行 すると そのスレッドの 終 了 を waitします 引 数 を 指 定 して 待 ち 時 間 の 上 限 を 指 定 することも 可 能 です スレッドの 優 先 度 を 引 数 で 与 えられた 値 にします 優 先 度 は MIN_PRIORITY(1)~MAX_PRIORITY(10) まであり デフォルトはNORM_PRIORITY(5)です スレッドに 割 り 込 みを 行 います waitで 待 機 していたスレッドでは waitが 例 外 InterruptedExceptionをス ローします スレッドが 引 数 に 指 定 されたオブジェクトのロックを 待 っている 場 合 に 真 を 返 します 継 承 または 実 装 したクラスにてオーバーライドしてスレッドの 処 理 内 容 を 記 述 します 他 のスレッドがこのオブジェクトの notify() メソッドまたは notifyall() メソッドを 呼 び 出 すまで 現 在 のス レッドを 待 機 させます このメソッドは 検 査 例 外 InterruptedExceptionをスローします ロックの 開 放 を 待 機 しているスレッドに 通 知 して 1 つを 再 開 します このオブジェクトで 複 数 のスレッドが 待 機 中 の 場 合 は そのうちの 1 つを 再 開 します スレッドがオブジェクトのモニターを 取 得 していない 場 合 例 外 IllegalMonitorStateExceptionをスローします ロックの 開 放 を 待 機 している 全 てのスレッドに 通 知 をして 全 てのスレッドを 再 開 します スレッドがオブジェ クトのモニターを 取 得 していない 場 合 例 外 IllegalMonitorStateExceptionをスローします 青 山 システムズ 101
11.ネストクラス インナークラス 11.1 ネストクラス インナークラス クラス 内 で 定 義 するクラスをネストクラス(インナークラス 内 部 クラス)という メソッドなどの 中 でなければ staticなものと 非 staticなも のがある 非 staticクラスのオブジェクトは 外 側 のクラスのオブジェク トを 生 成 してから 生 成 する 青 山 システムズ 102
11.ネストクラス インナークラス 11.2 メソッド 内 のインナークラス メソッド 内 で 定 義 するクラスをロ 一 カルインナークラス( 局 所 内 部 クラス)という ローカルインナークラスからは タト 側 のメソッドのfinalな 引 数 finalな 変 数 またそのメソッドを 持 つクラスのフィー ルドにアクセスできる 青 山 システムズ 103
11.ネストクラス インナークラス 11.3 無 名 クラス( 匿 名 クラス) メソッド 内 で 無 名 クラスを 定 義 し そのオブジェクトを 生 成 し 使 うことができる 無 名 クラスは 既 存 のクラスのサブクラスか インタフェー スを 実 装 するクラスとして 定 義 できる 無 名 クラスのオブジェクトを 生 成 し 他 のメソッドに 引 数 と して 渡 せる 青 山 システムズ 104
11.ネストクラス インナークラス 11.4 無 名 クラスの 使 用 例 無 名 クラスは イベントドリブン 型 プログラムによく 使 われ る 青 山 システムズ 105
12. 入 出 力 とシリアライズ デシリアライズ 12.1 Scanner 正 規 表 現 を 使 用 してプリミティブ 型 および 文 字 列 の 構 文 解 析 が 可 能 な 単 純 なテキストスキャナで す Scanner は 区 切 り 文 字 のパターンを 使 用 して 入 力 をトークンに 分 割 します デフォルトでは 区 切 り 文 字 は 空 白 文 字 です 作 成 されたトークンは さまざまな next メソッドを 使 用 して 異 なる 型 の 値 に 変 換 できます たとえば 次 のコードを 使 用 して System.in からの 数 値 の 読 み 込 みをユーザに 許 可 できます Scanner sc = new Scanner(System.in); int i = sc.nextint(); 別 の 例 として 次 のコードを 使 用 して mynumbers ファイル 内 のエントリから long 型 を 割 り 当 て ることができます Scanner sc = new Scanner(new File("myNumbers")); while (sc.hasnextlong()) { long along = sc.nextlong(); } 青 山 システムズ 106
12. 入 出 力 とシリアライズ デシリアライズ 12.1 Scanner スキャナは 空 白 文 字 以 外 の 区 切 り 文 字 も 使 用 できます 次 の 例 では 文 字 列 から 複 数 の 項 目 を 読 み 取 ります String input = "1 fish 2 fish red fish blue fish"; Scanner s = new Scanner(input).useDelimiter(" s*fish s*"); System.out.println(s.nextInt()); System.out.println(s.nextInt()); System.out.println(s.next()); System.out.println(s.next()); s.close(); 画 面 には 次 のように 表 示 されます 1 2 red blue 次 のコードでも 同 じ 出 力 を 生 成 できます このコードでは 4 つのトークンを 一 度 に 構 文 解 析 する 正 規 表 現 を 使 用 します String input = "1 fish 2 fish red fish blue fish"; Scanner s = new Scanner(input); s.findinline("( d+) fish ( d+) fish ( w+) fish ( w+)"); MatchResult result = s.match(); for (int i=1; i<=result.groupcount(); i++) System.out.println(result.group(i); s.close(); 青 山 システムズ 107
12. 入 出 力 とシリアライズ デシリアライズ 12.1 Scanner コンストラクタの 概 要 Scanner(File source) 指 定 されたファイルからスキャンされた 値 を 生 成 する Scanner を 新 しく 作 成 します Scanner(InputStream source) 指 定 された 入 力 ストリームからスキャンされた 値 を 生 成 する Scanner を 新 しく 作 成 します Scanner(String source) 指 定 された 文 字 列 からスキャンされた 値 を 生 成 する Scanner を 新 しく 作 成 します 青 山 システムズ 108
12. 入 出 力 とシリアライズ デシリアライズ 12.1 Scanner メソッドの 概 要 String String boolean String findinline(pattern pattern) 区 切 り 文 字 を 無 視 して 次 に 現 れる 指 定 されたパターンの 検 索 を 試 みます findinline(string pattern) 区 切 り 文 字 を 無 視 して 次 に 現 れる 指 定 された 文 字 列 から 構 築 されたパターンの 検 索 を 試 みます hasnext(pattern pattern) 次 の 完 全 なトークンが 指 定 されたパターンに 一 致 する 場 合 は true を 返 します next(pattern pattern) 指 定 されたパターンに 一 致 する 次 のトークンを 返 します 青 山 システムズ 109
12. 入 出 力 とシリアライズ デシリアライズ 12.2 パターン PatternオブジェクトとMatcherオブジェクトの 生 成 Javaで 正 規 表 現 を 用 いるためには2つのオブジェクトが 必 要 です 正 規 表 現 を 表 すオブジェクト(java.util.regex.Pattern オブジェクト) 入 力 シーケンス(マッチの 対 象 となる 文 字 列 )を 持 ち マッチを 行 うオ ブジェクト(java.util.regex.Matcher オブジェクト) String 型 で 表 した 正 規 表 現 を 引 数 に 取 るPatternのクラスメソッド compileによってpatternオブジェクトが 生 成 されます 正 規 表 現 の 文 字 面 をString 型 で 表 す 際 文 字 クラスなどに 用 いるバックク オートはバッククオートによってエスケープしなければなりません Matcher オブジェクトはPatternオブジェクトのmatcherメソッドに よって 生 成 されます このMatcherオブジェクトから 正 規 表 現 の マッチ 検 索 置 換 などの 各 種 メソッドを 呼 び 出 すことができます 青 山 システムズ 110
12. 入 出 力 とシリアライズ デシリアライズ 12.2 パターン x 0n 0nn 0mnn xhh uhhhh t n r f a e cx 構 文 マッチ 対 象 文 字 文 字 x バックスラッシュ 文 字 8 進 値 0n を 持 つ 文 字 (0 <= n <= 7) 8 進 値 0nn を 持 つ 文 字 (0 <= n <= 7) 8 進 値 0mnn を 持 つ 文 字 (0 <= m <= 3 0 <= n <= 7) 16 進 値 0xhh を 持 つ 文 字 16 進 値 0xhhhh を 持 つ 文 字 タブ 文 字 (' u0009') 改 行 文 字 (' u000a') キャリッジリターン 文 字 (' u000d') 用 紙 送 り 文 字 (' u000c') 警 告 (ベル) 文 字 (' u0007') エスケープ 文 字 (' u001b') x に 対 応 する 制 御 文 字 青 山 システムズ 111
12. 入 出 力 とシリアライズ デシリアライズ 12.2 パターン 構 文 [abc] [^abc] [a-za-z] [a-d[m-p]] [a-z&&[def]] [a-z&&[^bc]] [a-z&&[^m-p]]. d D s S w W マッチ 対 象 文 字 クラス a b または c ( 単 純 クラス) a b c 以 外 の 文 字 ( 否 定 ) a ~ z または A ~ Z ( 範 囲 ) a ~ d または m ~ p: [a-dm-p] ( 結 合 ) d e f ( 交 差 ) b と c を 除 く a ~ z: [ad-z] ( 減 算 ) m ~ p を 除 く a ~ z: [a-lq-z] ( 減 算 ) 定 義 済 みの 文 字 クラス 任 意 の 文 字 ( 行 末 記 号 とマッチする 場 合 もある) 数 字 : [0-9] 数 字 以 外 : [^0-9] 空 白 文 字 : [ t n x0b f r] 非 空 白 文 字 : [^ s] 単 語 構 成 文 字 : [a-za-z_0-9] 非 単 語 文 字 : [^ w] 青 山 システムズ 112
12. 入 出 力 とシリアライズ デシリアライズ 12.2 パターン 構 文 p{lower} p{upper} p{ascii} p{alpha} p{digit} p{alnum} p{punct} p{graph} p{print} p{blank} p{cntrl} p{xdigit} p{space} マッチ 対 象 POSIX 文 字 クラス (US-ASCII のみ) 小 文 字 の 英 字 : [a-z] 大 文 字 の 英 字 : [A-Z] すべての ASCII 文 字 : [ x00- x7f] 英 字 : [ p{lower} p{upper}] 10 進 数 字 : [0-9] 英 数 字 : [ p{alpha} p{digit}] 句 読 文 字 :!"#$%&'()*+,-./:;<=>?@[ ]^_`{ }~ のいずれか 表 示 できる 文 字 : [ p{alnum} p{punct}] プリント 可 能 文 字 : [ p{graph}] 空 白 またはタブ: [ t] 制 御 文 字 : [ x00- x1f x7f] 16 進 数 字 : [0-9a-fA-F] 空 白 文 字 : [ t n x0b f r] 青 山 システムズ 113
12. 入 出 力 とシリアライズ デシリアライズ 12.2 パターン 構 文 p{ingreek} p{lu} p{sc} P{InGreek} [ p{l}&&[^ p{lu}]] ^ $ b B A G Z z マッチ 対 象 Unicode ブロックとカテゴリのクラス ギリシャ 語 ブロックの 文 字 ( 単 純 ブロック) 大 文 字 ( 単 純 カテゴリ) 通 貨 記 号 ギリシャ 語 ブロック 以 外 の 文 字 ( 否 定 ) 大 文 字 以 外 の 文 字 ( 減 算 ) 境 界 正 規 表 現 エンジン 行 の 先 頭 行 の 末 尾 単 語 境 界 非 単 語 境 界 入 力 の 先 頭 前 回 のマッチの 末 尾 最 後 の 行 末 記 号 がある 場 合 は それを 除 く 入 力 の 末 尾 入 力 の 末 尾 青 山 システムズ 114
12. 入 出 力 とシリアライズ デシリアライズ 12.2 パターン X? X * X + X { n } X ( n,} X { n, m } X?? X *? X +? X { n }? X ( n,}? X { n, m }? 構 文 マッチ 対 象 最 長 一 致 数 量 子 X 1 回 または 0 回 X 0 回 以 上 X 1 回 以 上 X n 回 X n 回 以 上 X n 回 以 上 m 回 以 下 最 短 一 致 数 量 子 X 1 回 または 0 回 X 0 回 以 上 X 1 回 以 上 X n 回 X n 回 以 上 X n 回 以 上 m 回 以 下 青 山 システムズ 115
12. 入 出 力 とシリアライズ デシリアライズ 12.2 パターン X?+ X *+ X ++ X { n }+ X ( n,}+ X { n, m }+ XY X Y X または Y (X ) X 前 方 参 照 を 行 う 正 規 表 現 グループ n Q E 構 文 X 1 または 0 回 X 0 回 以 上 X 1 回 以 上 X n 回 X n 回 以 上 X n 回 以 上 m 回 以 下 X の 直 後 に Y 強 欲 な 数 量 子 論 理 演 算 子 前 方 参 照 マッチした n 番 目 の 前 方 参 照 を 行 う 正 規 表 現 グループ 引 用 マッチ 対 象 正 規 表 現 ではないが 次 の 文 字 をエスケープする 正 規 表 現 ではないが E までのすべての 文 字 をエスケープする 青 山 システムズ 116 正 規 表 現 ではないが Q で 開 始 された 引 用 をエスケープする
12. 入 出 力 とシリアライズ デシリアライズ 12.3 文 字 列 の 検 索 と 分 割 Scannerで 文 字 列 や 入 力 の 検 索 ができる Stringのsplitで 文 字 列 を 分 割 できる 青 山 システムズ 117
12. 入 出 力 とシリアライズ デシリアライズ 12.4 printfとformat printfとformatによって いろいろなデータを 文 字 列 に 埋 め 込 んで 出 力 できる その 際 書 式 などを 指 定 することができる 青 山 システムズ 118
12. 入 出 力 とシリアライズ デシリアライズ 12.5 File java.ioパッケージの 中 で ファイル 操 作 に 関 するクラス が java.io.fileクラスになります Fileクラスには ファイ ルやディレクトリが 存 在 するか 否 かを 確 認 したり 読 み 書 きが 可 能 かどうか また 種 類 やファイルサイズを 確 認 す るメソッドが 提 供 されています 1. 2. 3. 4. コンストラクタ File(String pathname) File(String parent, String child) File(File parent, String child) File(URI uri) 青 山 システムズ 119
12. 入 出 力 とシリアライズ デシリアライズ 12.5 File メソッド 名 概 要 boolean exists() boolean canread() boolean canwrite() boolean isfile() boolean isdirectory() String getname() String getpath() boolean renameto(file dest) boolean delete() boolean createnewfile() throws IOException boolean mkdir() ファイルやディレクトリが 存 在 するか 否 かを 確 認 する 指 定 されたファイルがアプリケーションから 読 み 取 り 可 能 かを 確 認 する 指 定 されたファイルがアプリケーションから 書 き 込 み 可 能 かを 確 認 する この 抽 象 パス 名 が 示 すファイルがファイルであるかどうかを 判 定 する この 抽 象 パス 名 が 示 すファイルがディレクトリであるかどうかを 判 定 する ファイルやディレクトリ 名 称 を 文 字 列 として 取 得 する 抽 象 パス 名 をパス 名 の 文 字 列 に 変 換 する ファイル 名 を 変 更 する ファイルやディレクトリを 削 除 する この 抽 象 パス 名 が 示 す 空 のファイルを 生 成 します この 抽 青 象 パス 山 システムズ 名 が 示 すディレクトリを 生 成 します 120
12. 入 出 力 とシリアライズ デシリアライズ 12.6 ReaderとWriter java.io.filereader テキストファイルの 読 み 込 み 1. 2. 3. コンストラクタ FileReader(String filename) FileReader(File file) FileReader(FileDescriptor fd) 青 山 システムズ 121
12. 入 出 力 とシリアライズ デシリアライズ 12.6 ReaderとWriter int read() メソッド 名 int read(char[] cbuf) abstract int read (char[] cbuf, int off, int len) 概 要 単 一 文 字 を 読 み 込 んで0 ~ 65535 (0x00-0xffff) の 範 囲 の 整 数 としての 読 み 込 まれた 文 字 を 返 します ストリームの 終 わりに 達 した 場 合 は -1 を 返 します 文 字 列 を 読 み 込 んで 引 数 で 指 定 した 配 列 に 格 納 します ストリームの 終 わりに 達 し た 場 合 は -1を 返 します offとlenまでの 一 部 の 文 字 を 読 み 込 んで 配 列 へ 格 納 します ストリームの 終 わりに 達 した 場 合 は -1 を 返 します 青 山 システムズ 122
12. 入 出 力 とシリアライズ デシリアライズ 12.6 ReaderとWriter java.io.filewriterクラスのインスタンスを 生 成 するには 以 下 のコン ストラクタを 使 用 します 1. 2. 3. 4. 5. コンストラクタ FileWriter(File file) FileWriter(File file, boolean append) FileWriter(String filename) FileWriter(String filename, boolean append) FileWriter(FileDescriptor fd) 青 山 システムズ 123
12. 入 出 力 とシリアライズ デシリアライズ 12.6 ReaderとWriter メソッド 名 void write(int c) void write(string str) void write (String str, int off, int len) void write(char[] cbuf) void write (char[] cbuf, int off, int len) 概 要 単 一 の 文 字 を 出 力 ストリームへ 書 き 込 みます 文 字 列 を 出 力 ストリームへ 書 き 込 みます オフセット offから 始 まる 文 字 数 lenを 出 力 ストリームへ 書 き 込 みま す 文 字 の 配 列 を 出 力 ストリームへ 書 き 込 みます 配 列 要 素 offから 始 まる 要 素 数 lenを 出 力 ストリームへ 書 き 込 みま す 青 山 システムズ 124
12. 入 出 力 とシリアライズ デシリアライズ 12.7 シリアライズ デシリアライズ 省 略 青 山 システムズ 125
12. 入 出 力 とシリアライズ デシリアライズ 12.8 継 承 とシリアライズ デシリアライズ 省 略 青 山 システムズ 126
13. 基 本 パッケージ 13.1 java.langとobject java.langクラス クラスの 概 要 Math Object Runtime String StringBuffer StringBuilder System Math クラスは 指 数 関 数 対 数 関 数 平 方 根 および 三 角 関 数 といっ た 基 本 的 な 数 値 処 理 を 実 行 するためのメソッドを 含 んでいます Object クラスは クラス 階 層 のルートです Java アプリケーションはすべて Runtime クラスの 単 一 のインスタンスを 持 ちます String クラスは 文 字 列 を 表 します スレッドセーフな 可 変 の 文 字 列 文 字 の 可 変 シーケンスです System クラスには 有 用 なクラスフィールドおよびメソッドがありま す 青 山 システムズ 127
13. 基 本 パッケージ 13.1 java.langとobject java.lang.object の 主 なメソッド メソッドの 概 要 boolean equals(object obj) このオブジェクトとほかのオブジェクトが 等 しいかどうかを 示 します int hashcode() オブジェクトのハッシュコード 値 を 返 します void notify() このオブジェクトのモニターで 待 機 中 のスレッドを 1 つ 再 開 します void notifyall() このオブジェクトのモニターで 待 機 中 のすべてのスレッドを 再 開 します tostring() String オブジェクトの 文 字 列 表 現 を 返 します void wait() ほかのスレッドがこのオブジェクトの notify() メソッドまたは notifyall() メソッド を 呼 び 出 すまで 現 在 青 のスレッドを 山 システムズ 待 機 させます 128
13. 基 本 パッケージ 13.2 String == equals 同 じオブジェクトかどうかの 比 較 同 じ 文 字 列 を 保 持 しているかどうかの 比 較 青 山 システムズ 129
13. 基 本 パッケージ 13.2 String int char int int 戻 り 型 String boolean boolean String String String String String length( ) charat(int) compareto(string) compareto(object) equals(object) concat(string) replace(char, char) trim( ) メソッド substring(int) substring(int, int) indexof(string) lastindexof(string) endswith(string) startswith(string) startswith(string, int) tolowercase( ) touppercase( ) 説 明 オブジェクトの 保 有 する 文 字 数 を 返 します 指 定 されたインデックス 番 号 の 位 置 にある 文 字 を 返 します 指 定 されたインデックス 番 号 の 位 置 から 終 端 までの 文 字 列 を 返 します 第 2 引 数 が 指 定 されている 場 合 は 第 1 引 数 から 第 2 引 数 までの 文 字 列 を 返 しま す indexofでは 指 定 された 文 字 列 の 最 初 の 出 現 のインデックス 番 号 を 返 します lastindexofでは 指 定 された 文 字 列 の 最 後 の 出 現 のインデックス 番 号 を 返 し ます 呼 び 出 したStringオブジェクトの 文 字 列 が 引 数 で 指 定 した 文 字 列 で 終 わって ( 始 まって)いればtrueをかえします 第 2 引 数 がある 場 合 は それはStringオ ブジェクトの 文 字 列 の 探 索 を 開 始 する 開 始 点 (オフセット)を 意 味 します 呼 び 出 すStringオブジェクトの 文 字 列 と 引 数 の 値 を 比 較 し 等 しい 場 合 は0を Stringオブジェクトの 方 が 大 きい 場 合 は 正 の 整 数 を 小 さい 場 合 は 負 の 整 数 を 返 します 引 数 がオブジェクト 型 の 場 合 はString 型 に 変 換 され 比 較 されま す 呼 び 出 すStringオブジェクトと 引 数 の 値 を 比 較 し 等 しい 場 合 はtrueを 返 しま す 呼 び 出 すStringオブジェクトの 末 尾 に 引 数 の 文 字 列 を 付 け 加 えます 第 1 引 数 で 指 定 された 文 字 を 第 2 引 数 で 指 定 された 文 字 に 置 き 換 えます 呼 び 出 すStringオブジェクトの 両 端 の 空 白 文 字 を 削 除 します 呼 び 出 すStringオブジェクトを 小 文 字 ( 大 文 字 )に 変 換 します 青 山 システムズ 130
13. 基 本 パッケージ 13.3 StringBuilderとStringBuffer StringBuilderについて 文 字 の 可 変 シーケンスです このクラスは StringBuffer と 互 換 性 がある API を 提 供 します が 同 期 化 は 保 証 されません このクラスは 文 字 列 バッファが 単 一 のスレッド ( 一 般 的 な ケース) により 使 用 されていた 場 合 の StringBuffer の 簡 単 な 代 替 として 使 用 されるよう 設 計 されています このクラスは ほとんどの 実 装 で 高 速 に 実 行 されるので 可 能 な 場 合 は StringBuffer よりも 優 先 して 使 用 することをお 勧 めします StringBuilder の 基 本 的 なオペレーションには append メソッドおよび insert メソッドがあり これらのメソッドはどんな 種 類 のデータも 受 け 取 ることができるようにオーバーロードされてい ます メソッドはそれぞれ 与 えられたデータを 効 率 的 に 文 字 列 に 変 換 し 文 字 列 中 の 文 字 を 文 字 列 ビルダに 追 加 または 挿 入 します append メソッドは 常 に ビルダの 末 尾 に 与 えられた 文 字 を 追 加 し insert メソッドは 指 定 された 位 置 に 文 字 を 追 加 します たとえば z を 現 在 start を 含 む 文 字 列 ビルダオブジェクトと 見 なす 場 合 z.append("le") メソッド 呼 び 出 しは 文 字 列 ビルダの 内 容 が startle になるように 変 更 するのに 対 して z.insert(4, "le") というメソッド 呼 び 出 しは 文 字 列 ビルダの 内 容 が starlet になるように 作 用 します 一 般 に sb が StringBuilder のインスタンスを 参 照 している 場 合 sb.append(x) は sb.insert(sb.length(), x) と 同 じ 結 果 になります 各 文 字 列 ビルダには 容 量 があります 文 字 列 ビルダに 含 まれる 文 字 列 の 長 さが 容 量 を 超 過 しないかぎり 新 しい 内 部 バッファを 割 り 当 てる 必 要 はありません 内 部 バッファがオーバーフローする 場 合 自 動 的 に 容 量 が 増 加 しま す StringBuilder のインスタンスは 複 数 のスレッドで 使 用 するには 安 全 ではありません このよ うな 同 期 が 必 要 な 場 合 は StringBuffer を 使 用 することをお 勧 めします 青 山 システムズ 131
13. 基 本 パッケージ 13.3 StringBuilderとStringBuffer StringBufferについて スレッドセーフな 可 変 の 文 字 列 文 字 列 バッファは String と 似 ていますが 変 更 できる 点 が 異 なります 文 字 列 バッファには 常 に 文 字 列 が 格 納 されていますが 文 字 列 の 長 さと 内 容 は 特 定 のメソッドの 呼 び 出 しにより 変 更 できます 文 字 列 バッファは 複 数 のスレッドによって 安 全 に 使 用 することができます メソッドは 必 要 に 応 じて 同 期 化 され 特 定 のインスタンスでのすべてのオペレーションが 関 連 のある 個 々のス レッドによって 行 われるメソッドの 呼 び 出 しの 順 序 と 一 致 する 連 続 した 順 序 で 発 生 するように 動 作 します StringBuffer の 基 本 的 なオペレーションには append メソッドおよび insert メソッドがあり これらのメソッドはどんな 種 類 のデータも 受 け 取 ることができるようにオーバーロードされてい ます メソッドはそれぞれ 与 えられたデータを 効 率 的 に 文 字 列 に 変 換 し 文 字 列 中 の 文 字 を 文 字 列 バッファに 追 加 または 挿 入 します append メソッドは 常 に バッファの 末 尾 に 与 えられ た 文 字 を 追 加 し insert メソッドは 指 定 された 位 置 に 文 字 を 追 加 します たとえば z を 現 在 start を 含 む 文 字 列 バッファオブジェクトと 見 なす 場 合 z.append("le") は 文 字 列 バッファの 内 容 が startle になるように 変 更 するのに 対 して z.insert(4, "le") とい うメソッド 呼 び 出 しは 文 字 列 バッファの 内 容 が starlet になるように 作 用 します 一 般 に sb が StringBuffer のインスタンスを 参 照 している 場 合 sb.append(x) は sb.insert(sb.length(), x) と 同 じ 結 果 になります 処 理 にソースシーケンスが 関 連 する 場 合 (ソースシーケンスからの 追 加 や 挿 入 など) このク ラスは その 処 理 を 実 行 している 文 字 列 バッファとだけ 同 期 化 し ソースとは 同 期 化 しません 各 文 字 列 バッファには 容 量 があります 文 字 列 バッファに 含 まれる 文 字 列 の 長 さが 容 量 を 超 過 しないかぎり 新 しい 内 部 バッファ 配 列 を 割 り 当 てる 必 要 はありません 内 部 バッファが オーバーフローする 場 合 自 動 的 に 容 量 が 増 加 します JDK 5 以 降 このクラスは 単 一 のス レッド StringBuilder により 使 用 されるよう 設 計 された 等 価 のクラスで 補 足 されています StringBuilder クラスは このクラスと 同 じ 処 理 をすべてサポートしながらも 高 速 であり 同 期 を 実 行 しないので 通 常 はこのクラスに 青 山 優 システムズ 先 して 使 用 される 必 要 があります 132
13. 基 本 パッケージ 13.3 StringBuilderとStringBuffer メソッドの 概 要 StringBuilder StringBuilder StringBuilder StringBuilder StringBuilder StringBuilder StringBuilder StringBuilder append(char c) char 引 数 の 文 字 列 表 現 をこのシーケンスに 追 加 します append(char[] str) char 配 列 引 数 の 文 字 列 表 現 をこのシーケンスに 追 加 します append(char[] str, int offset, int len) char 配 列 引 数 の 部 分 配 列 の 文 字 列 表 現 をこのシーケンスに 追 加 します appendcodepoint(int codepoint) codepoint 引 数 の 文 字 列 表 現 をこのシーケンスに 追 加 します delete(int start, int end) このシーケンスの 部 分 文 字 列 内 の 文 字 をすべて 削 除 します insert(int offset, boolean b) boolean 引 数 の 文 字 列 表 現 をこのシーケンスに 挿 入 します insert(int offset, char c) char 引 数 の 文 字 列 表 現 をこのシーケンスに 挿 入 します insert(int offset, char[] str) char 配 列 引 数 の 文 字 列 表 現 をこのシーケンスに 挿 入 します 青 山 システムズ 133
13. 基 本 パッケージ 13.3 StringBuilderとStringBuffer メソッドの 概 要 StringBuilder StringBuilder StringBuilder StringBuilder StringBuilder int int StringBuilder insert(int index, char[] str, int offset, int len) insert(int offset, int i) insert(int offset, long l) length() offsetbycodepoints(int index, int codepointoffset) codepointoffset コードポイントによって 指 定 された index からのオフセットである このシーケンス 内 のインデックスを 返 します reverse() str 配 列 引 数 の 部 分 配 列 の 文 字 列 表 現 をこのシーケンスに 挿 入 します insert(int offset, double d) double 引 数 の 文 字 列 表 現 をこのシーケンスに 挿 入 します insert(int offset, float f) float 引 数 の 文 字 列 表 現 をこのシーケンスに 挿 入 します 2 番 目 の int 引 数 の 文 字 列 表 現 をこのシーケンスに 挿 入 します long 引 数 の 文 字 列 表 現 をこのシーケンスに 挿 入 します この 文 字 列 の 長 さを 返 します 青 山 システムズ 134 この 文 字 シーケンスが 逆 の 並 び 順 のシーケンスに 置 換 されます
13. 基 本 パッケージ 13.3 StringBuilderとStringBuffer メソッドの 概 要 void void setcharat(int index, char ch) 指 定 されたインデックス 位 置 の 文 字 が ch になるように 設 定 します setlength(int newlength) この 文 字 シーケンスの 長 さを 設 定 します 青 山 システムズ 135
13. 基 本 パッケージ 13.4 ラッパクラス 基 本 データ 型 byte short int long char float double boolean クラス Byte Short Integer Long Character Float Double Boolean API 仕 様 による 概 要 Byte クラスは byte 値 の 標 準 ラッパーです Short クラスは short 値 の 標 準 ラッパーです Integer クラスは プリミティブ 型 int の 値 をオブジェクト 内 にラップします Integer 型 のオブジェ クトには 型 が int の 単 一 のフィールドが 入 ります Long クラスは プリミティブ 型 long の 値 をオブジェクト 内 にラップします Long 型 のオブジェクト には 型 が long の 単 一 フィールドが 入 ります Character クラスは プリミティブ 型 char の 値 をオブジェクトにラップします Character 型 のオ ブジェクトには 型 が char の 単 一 フィールドが 入 ります Float クラスは プリミティブ 型 float の 値 をオブジェクト 内 にラップします Float 型 のオブジェクト には float 型 の 単 一 のフィールドがあります Double クラスは プリミティブ 型 double の 値 をオブジェクトにラップします 型 double のオブ ジェクトには 型 が double の 単 一 フィールドが 入 ります Boolean クラスは プリミティブ 型 boolean の 値 をオブジェクトにラップします Boolean 型 のオ ブジェクトには 型 が boolean の 単 一 フィールドが 入 ります 青 山 システムズ 136
13. 基 本 パッケージ 13.5 ボクシング アンボクシング ボクシング アンボクシングは プリミティブ 型 と 対 応 する ラッパクラス 参 照 (たとえば int と Integer)を 自 動 的 に 相 互 変 換 するものです J2SE1.4までは プリミティブ 型 とラッパクラス 参 照 を 相 互 変 換 するためには 明 示 的 にデータ 変 換 しなければいけ ませんでした コレクションにはオブジェクトしか 登 録 できないため プリ ミティブ 型 データをコレクションに 登 録 したりコレクションか ら 取 得 する 際 など 毎 回 データ 変 換 が 必 要 でした J2SE5.0では そのような 変 換 が 自 動 的 に 行 われるように なりました 青 山 システムズ 137
13. 基 本 パッケージ 13.5 ボクシング アンボクシング ボクシング 変 換 により 以 下 のようなプログラムを 記 述 することが 出 来 ます Integer i = 100; Character c = 'c';これまでプリミティブ 型 で 実 現 されていた 整 数 リテラル 代 入 時 のナ ローイング 変 換 (int short, int byteなど)は 同 時 に 行 うことができますが 数 値 のワ イドニング 変 換 (short int 等 )はコンパイルエラーとなります Byte b = 100; // 100 は int 型 リテラルであるが byte に 代 入 可 能 である short s = 10; int i = s; // OK( 暗 黙 のワイドニング 変 換 ) Integer j = s; // コンパイルエラー もちろん プリミティブ 型 で 暗 黙 的 に 変 換 できないようなケースではボクシング 変 換 で も 同 様 にコンパイルエラーとなります int i = 100; byte b = i; // byte 型 は int 型 より 表 せる 値 の 範 囲 が 狭 いため コンパイルエラー Byte bb = i; // 同 様 にコンパイルエラー 青 山 システムズ 138
13. 基 本 パッケージ 13.5 ボクシング アンボクシング アンボクシングは ラッパクラスからプリミティブ 型 への 変 換 です int i = new Integer(100); char c = new Character('c') 暗 黙 の 型 変 換 についてもボクシングの 場 合 と 同 じことが 言 えますが 暗 黙 の 型 変 換 はプリミティブ 型 のみで 起 こるという 点 には 注 意 してください int i = new Short(10); // Short short int と 変 換 される オートアンボクシングにより これまでプリミティブ 型 しか 記 述 できなかった 箇 所 にオブジェクトを 記 述 できるようになりました if 文 や for 文 while 文 などの 条 件 式 のところに Boolean 型 の 参 照 を 記 述 できますし switch...case 文 の 値 としても Integer/Short/Character/Byte 型 の 参 照 が 記 述 で きます アンボクシングを 実 行 したときに ラッパクラス 参 照 が null であれば NullPointerException が 発 生 します Inteter a = null; int b = a; // NullPointerException 発 生 青 山 システムズ 139
13. 基 本 パッケージ 13.5 ボクシング アンボクシング ボクシングとアンボクシングおよびジェネリクスを 組 み 合 わせることにより プリミティブ 型 値 を 扱 うコレクションを 操 作 するプログラムが 大 幅 に 簡 略 化 されます たとえばこれ までは 以 下 のようなプログラムを 書 いていました List list = new ArrayList(); list.add(new Integer(100)); list.add(new Integer(200)); int a = ((Integer) list.get(0)).intvalue(); int b = ((Integer) list.get(1)).intvalue(); これが J2SE5.0 では 次 のように 書 くことができます List<Ingeter> list = new ArrayList<Integer>(); list.add(100); // ボクシング list.add(200); int a = list.get(0); // アンボクシング int b = list.get(1); 青 山 システムズ 140
13. 基 本 パッケージ 13.6 ロケールと 数 値 通 貨 のフォーマット コンストラクタの 概 要 Locale(String language) 言 語 コードからロケールを 構 築 します Locale(String language, String country) 言 語 国 からロケールを 構 築 します Locale(String language, String country, String variant) 言 語 国 バリアントからロケールを 構 築 します メソッドの 概 要 static Locale String String getdefault() Java 仮 想 マシンのこのインスタンスに 対 して デフォルトロケールの 現 在 の 値 を 取 得 します getdisplaycountry() ユーザへの 表 示 に 適 した ロケールの 国 の 名 前 を 返 します getdisplaylanguage() ユーザへの 表 示 に 適 した ロケールの 言 語 の 名 前 を 返 します 青 山 システムズ 141
13. 基 本 パッケージ 13.6 ロケールと 数 値 通 貨 のフォーマット メソッドの 概 要 String String Currency static NumberFormat int int int format(double number) フォーマットの 特 殊 化 です format(long number) フォーマットの 特 殊 化 です getcurrency() 通 貨 値 のフォーマット 時 に この 数 値 フォーマットが 使 用 する 通 貨 を 取 得 します getcurrencyinstance() 現 在 のデフォルトロケールに 対 する 通 貨 フォーマットを 返 しま す getmaximumfractiondigits() 数 値 の 小 数 部 分 として 可 能 な 最 大 桁 数 を 返 します getmaximumintegerdigits() 数 値 の 整 数 部 分 として 可 能 な 最 大 桁 数 を 返 します getminimumfractiondigits() 青 山 システムズ 142 数 値 の 小 数 部 分 として 可 能 な 最 小 桁 数 を 返 します
13. 基 本 パッケージ 13.6 ロケールと 数 値 通 貨 のフォーマット メソッドの 概 要 int Number void getminimumintegerdigits() 数 値 の 整 数 部 分 として 可 能 な 最 小 桁 数 を 返 します parse(string source) 指 定 された 文 字 列 の 先 頭 からテキストを 解 析 して 数 値 を 生 成 します setcurrency(currency currency) 通 貨 値 のフォーマット 時 に この 数 値 フォーマットが 使 用 する 通 貨 を 設 定 します 青 山 システムズ 143
13. 基 本 パッケージ 13.6 ロケールと 数 値 通 貨 のフォーマット メソッドの 概 要 static Currency static Currency String getinstance(locale locale) 指 定 されたロケールの 国 の Currency インスタンスを 返 します getinstance(string currencycode) 指 定 した 通 貨 コードの Currency インスタンスを 返 します tostring() その 通 貨 の ISO 4217 通 貨 コードを 返 します 青 山 システムズ 144
13. 基 本 パッケージ 13.7 日 付 を 扱 うクラス java.util.date java.util.calendar java.text.dataformat 日 付 を 表 すクラス 日 付 を 表 すabstractクラス 日 付 のフォーマットを 表 すabstract クラス 青 山 システムズ 145
13. 基 本 パッケージ 13.7 日 付 を 扱 うクラス Dateの 主 なコンストラクタとメソッド Date() Date(long date) boolean equals(object obj) long gettime() void settime(long time) String tostring() Date オブジェクトを 割 り 当 て 初 期 化 します Date オブジェクトを 割 り 当 て 初 期 化 します 2 つの 日 付 が 等 しいかどうかを 比 較 します Date オブジェクトで 表 される 1970 年 1 月 1 日 00:00:00 GMT か らのミリ 秒 数 を 返 します Date オブジェクトを 1970 年 1 月 1 日 00:00:00 GMT から time ミリ 秒 の 時 点 を 表 すように 設 定 します Date オブジェクトを 次 の 形 式 の String に 変 換 します 青 山 システムズ 146
13. 基 本 パッケージ 13.7 日 付 を 扱 うクラス Calendarの 主 なメソッド メソッドの 概 要 boolean int Date void void equals(object obj) gettime() この Calendar を 指 定 された Object と 比 較 します getfirstdayofweek() 週 の 最 初 の 日 が 何 であるかを 取 得 します この Calendar の 時 刻 値 ( エポック からのミリ 秒 単 位 のオフセット) を 表 す Date オブ ジェクトを 返 します set(int year, int month, int date, int hourofday, int minute) カレンダフィールド YEAR MONTH DAY_OF_MONTH HOUR_OF_DAY および MINUTE の 値 を 設 定 します settime(date date) この Calendar の 時 間 を 指 定 された Date に 設 定 します String tostring() カレンダの 文 字 列 表 現 を 返 します 青 山 システムズ 147
13. 基 本 パッケージ 13.7 日 付 を 扱 うクラス DataFormatの 主 なメソッド メソッドの 概 要 String static DateFormat static DateFormat static DateFormat Date format(date date) Date を 日 付 / 時 刻 文 字 列 にフォーマットします getdateinstance() デフォルトのロケールに 対 し デフォルトのフォーマットスタイル を 持 つ 日 付 フォーマッタを 取 得 します getdateinstance(int style) デフォルトのロケールに 対 し 指 定 されたフォーマットスタイルを 持 つ 日 付 フォーマッタを 取 得 します getdateinstance(int style, Locale alocale) 指 定 されたロケールに 対 し 指 定 されたフォーマットスタイルを 持 つ 日 付 フォーマッタを 取 得 します parse(string source) 指 定 された 文 字 列 の 先 頭 からテキストを 解 析 して 日 付 を 生 成 し ます 青 山 システムズ 148
13. 基 本 パッケージ 13.8 Math Math クラスは 指 数 関 数 対 数 関 数 平 方 根 および 三 角 関 数 といった 基 本 的 な 数 値 処 理 を 実 行 するためのメソッドを 含 んで います 青 山 システムズ 149
13. 基 本 パッケージ 13.8 Math 省 略 青 山 システムズ 150
14.コレクションとジェネリックス 14.1 コレクション コレクションとは 複 数 の 要 素 の 集 まりを 言 います コレクション フ レームワークとはその 要 素 の 集 まりを 操 作 管 理 するための 方 法 を 定 義 したアーキテクチャです Javaでは コレクション フレームワー クはインタフェースをベースに 設 計 されています 青 山 システムズ 151