1.プログラミング 周 辺 の 話 題 ハードウェアとソフトウェア プログラミングとそのための 言 語 プログラミング 言 語 と 皆 さんが 通 常 考 えている 算 数 との 違 い 例 1: 以 下 の 手 順 で aの 値 は 最 終 的 に 幾 つになる? a=5* 2 7 b b= a=



Similar documents
SXF 仕 様 実 装 規 約 版 ( 幾 何 検 定 編 ) 新 旧 対 照 表 2013/3/26 文 言 変 更 p.12(1. 基 本 事 項 ) (5)SXF 入 出 力 バージョン Ver.2 形 式 と Ver.3.0 形 式 および Ver.3.1 形 式 の 入 出 力 機 能 を

Microsoft Word - 第3章.doc

計算式の取り扱い

KINGSOFT Office 2016 動 作 環 境 対 応 日 本 語 版 版 共 通 利 用 上 記 動 作 以 上 以 上 空 容 量 以 上 他 接 続 環 境 推 奨 必 要 2

プログラミング基礎I(再)

(1)1オールゼロ 記 録 ケース 厚 生 年 金 期 間 A B 及 びCに 係 る 旧 厚 生 年 金 保 険 法 の 老 齢 年 金 ( 以 下 旧 厚 老 という )の 受 給 者 に 時 効 特 例 法 施 行 後 厚 生 年 金 期 間 Dが 判 明 した Bは 事 業 所 記 号 が

( 別 紙 ) 以 下 法 とあるのは 改 正 法 第 5 条 の 規 定 による 改 正 後 の 健 康 保 険 法 を 指 す ( 施 行 期 日 は 平 成 28 年 4 月 1 日 ) 1. 標 準 報 酬 月 額 の 等 級 区 分 の 追 加 について 問 1 法 改 正 により 追 加

(Microsoft Word - Excel\211\236\227p2\217\315.docx)

東近江行政組合職員の育児休業等に関する条例

第1章 財務諸表

Ⅰ 調 査 の 概 要 1 目 的 義 務 教 育 の 機 会 均 等 その 水 準 の 維 持 向 上 の 観 点 から 的 な 児 童 生 徒 の 学 力 や 学 習 状 況 を 把 握 分 析 し 教 育 施 策 の 成 果 課 題 を 検 証 し その 改 善 を 図 るもに 学 校 におけ

の と す る (1) 防 犯 カ メ ラ を 購 入 し 設 置 ( 新 設 又 は 増 設 に 限 る ) す る こ と (2) 設 置 す る 防 犯 カ メ ラ は 新 設 又 は 既 設 の 録 画 機 と 接 続 す る こ と た だ し 録 画 機 能 付 防 犯 カ メ ラ は


事 業 税 の 外 形 標 準 課 税 事 業 税 は 都 道 府 県 が 所 得 ( 利 益 )に 対 して 課 税 します 1. 個 人 事 業 税 業 種 区 分 税 率 ( 標 準 税 率 ) 第 1 種 事 業 ( 物 品 販 売 業 製 造 業 金 銭 貸 付 業 飲 食 店 業 不 動

H28記入説明書(納付金・調整金)8

1


Microsoft Word - 【溶け込み】【修正】第2章~第4章

<4D F736F F D2091E F18CB48D C481698E7B90DD8F9590AC89DB816A2E646F63>

目 次 1. 論 理 関 数 IF IF の 概 要 論 理 式 の 種 類 等 号 不 等 号 具 体 的 な 使 い 方 ネスト 複 数 の 条 件 を 記 述...

[2] 控 除 限 度 額 繰 越 欠 損 金 を 有 する 法 人 において 欠 損 金 発 生 事 業 年 度 の 翌 事 業 年 度 以 後 の 欠 損 金 の 繰 越 控 除 にあ たっては 平 成 27 年 度 税 制 改 正 により 次 ページ 以 降 で 解 説 する の 特 例 (

2016 年 度 情 報 リテラシー 三 科 目 合 計 の 算 出 関 数 を 用 いて 各 教 科 の 平 均 点 と 最 高 点 を 求 めることにする この2つの 計 算 は [ホーム]タブのコマ ンドにも 用 意 されているが 今 回 は 関 数 として 作 成 する まず 表 に 三 科

は 固 定 流 動 及 び 繰 延 に 区 分 することとし 減 価 償 却 を 行 うべき 固 定 の 取 得 又 は 改 良 に 充 てるための 補 助 金 等 の 交 付 を 受 けた 場 合 にお いては その 交 付 を 受 けた 金 額 に 相 当 する 額 を 長 期 前 受 金 とし

スライド 1

損 益 計 算 書 自. 平 成 26 年 4 月 1 日 至. 平 成 27 年 3 月 31 日 科 目 内 訳 金 額 千 円 千 円 営 業 収 益 6,167,402 委 託 者 報 酬 4,328,295 運 用 受 託 報 酬 1,839,106 営 業 費 用 3,911,389 一

PowerPoint プレゼンテーション

注 雇 促 進 税 制 と 本 制 度 のどちらかを 利 する 可 能 性 があるが あらかじめどちらの 制 度 を 利 するか 判 断 できない という 場 合 雇 促 進 税 制 の 事 前 届 出 ( 雇 促 進 計 画 の 提 出 )をした 上 で 申 告 の 際 にどちらを 利 するかご

4 応 募 者 向 けメニュー 画 面 が 表 示 されます 応 募 者 向 けメニュー 画 面 で [ 交 付 内 定 時 の 手 続 を 行 う] [ 交 付 決 定 後 の 手 続 を 行 う]をクリックします 10

養 老 保 険 の 減 額 払 済 保 険 への 変 更 1. 設 例 会 社 が 役 員 を 被 保 険 者 とし 死 亡 保 険 金 及 び 満 期 保 険 金 のいずれも 会 社 を 受 取 人 とする 養 老 保 険 に 加 入 してい る 場 合 を 解 説 します 資 金 繰 りの 都

1. 決 算 の 概 要 法 人 全 体 として 2,459 億 円 の 当 期 総 利 益 を 計 上 し 末 をもって 繰 越 欠 損 金 を 解 消 しています ( : 当 期 総 利 益 2,092 億 円 ) 中 期 計 画 における 収 支 改 善 項 目 に 関 して ( : 繰 越

取 り 消 された 後 当 該 産 前 の 休 業 又 は 出 産 に 係 る 子 若 しくは 同 号 に 規 定 する 承 認 に 係 る 子 が 死 亡 し 又 は 養 子 縁 組 等 により 職 員 と 別 居 することとなったこと (2) 育 児 休 業 をしている 職 員 が 休 職 又

3. 選 任 固 定 資 産 評 価 員 は 固 定 資 産 の 評 価 に 関 する 知 識 及 び 経 験 を 有 する 者 のうちから 市 町 村 長 が 当 該 市 町 村 の 議 会 の 同 意 を 得 て 選 任 する 二 以 上 の 市 町 村 の 長 は 当 該 市 町 村 の 議

している 5. これに 対 して 親 会 社 の 持 分 変 動 による 差 額 を 資 本 剰 余 金 として 処 理 した 結 果 資 本 剰 余 金 残 高 が 負 の 値 となるような 場 合 の 取 扱 いの 明 確 化 を 求 めるコメントが 複 数 寄 せられた 6. コメントでは 親


続 に 基 づく 一 般 競 争 ( 指 名 競 争 ) 参 加 資 格 の 再 認 定 を 受 けていること ) c) 会 社 更 生 法 に 基 づき 更 生 手 続 開 始 の 申 立 てがなされている 者 又 は 民 事 再 生 法 に 基 づき 再 生 手 続 開 始 の 申 立 てがなさ

MetaMoJi ClassRoom/ゼミナール 授業実施ガイド

若 しくは 利 益 の 配 当 又 はいわゆる 中 間 配 当 ( 資 本 剰 余 金 の 額 の 減 少 に 伴 うものを 除 きます 以 下 同 じです )を した 場 合 には その 積 立 金 の 取 崩 額 を 減 2 に 記 載 す るとともに 繰 越 損 益 金 26 の 増 3 の

<4D F736F F D2095BD90AC E937890C590A789FC90B382CC8EE582C893E09765>

Microsoft Word 役員選挙規程.doc

POWER EGG V2.01 ユーザーズマニュアル ファイル管理編


01_07_01 データのインポート_エクスポート_1

企業結合ステップ2に関連するJICPA実務指針等の改正について③・資本連結実務指針(その2)

税金読本(8-5)特定口座と確定申告

4. その 他 (1) 期 中 における 重 要 な 子 会 社 の 異 動 ( 連 結 範 囲 の 変 更 を 伴 う 特 定 子 会 社 の 異 動 ) 無 (2) 簡 便 な 会 計 処 理 及 び 四 半 期 連 結 財 務 諸 表 の 作 成 に 特 有 の 会 計 処 理 の 適 用 有

< F31322D325F81798ED0984A8E6D817A944E8BE08D8E959E814593BE>

の 基 礎 の 欄 にも 記 載 します ア 法 人 税 の 中 間 申 告 書 に 係 る 申 告 の 場 合 は 中 間 イ 法 人 税 の 確 定 申 告 書 ( 退 職 年 金 等 積 立 金 に 係 るものを 除 きます ) 又 は 連 結 確 定 申 告 書 に 係 る 申 告 の 場

Taro-2220(修正).jtd

2. ど の 様 な 経 緯 で 発 覚 し た の か ま た 遡 っ た の を 昨 年 4 月 ま で と し た の は 何 故 か 明 ら か に す る こ と 回 答 3 月 17 日 に 実 施 し た ダ イ ヤ 改 正 で 静 岡 車 両 区 の 構 内 運 転 が 静 岡 運

R4財務対応障害一覧

kyoukai.indd

第1章 簿記の一巡

4-3-4共立蒲原総合病院組合職員の育児休業等に関する条例

Taro-1-14A記載例.jtd

縦 計 横 計 をSUM 関 数 で 一 度 に 計 算 する 縦 横 の 合 計 を 表 示 するセルが 計 算 対 象 となる セルと 隣 接 している 場 合 は 一 度 に 合 計 を 求 め ることができます 1 計 算 対 象 となるセル 範 囲 と 合 計 を 表 示 する セル 範

第 9 条 の 前 の 見 出 しを 削 り 同 条 に 見 出 しとして ( 部 分 休 業 の 承 認 ) を 付 し 同 条 中 1 日 を 通 じて2 時 間 ( 規 則 で 定 める 育 児 休 暇 を 承 認 されている 職 員 については 2 時 間 から 当 該 育 児 休 暇 の

Taro-H19退職金(修正版).jtd

Q IFRSの特徴について教えてください

入 札 参 加 資 格 申 請 システム 操 作 マニュアル 入 札 参 加 資 格 の 資 格 有 効 ( 変 更 ) 日 を 迎 えると 追 加 届 の 登 録 ができるようになります ( 入 札 参 加 資 格 申 請 の 定 時 受 付 では いずれかの 申 請 先 団 体 から 入 札 参

Microsoft Word - tb01.doc

2 役 員 の 報 酬 等 の 支 給 状 況 役 名 法 人 の 長 理 事 理 事 ( 非 常 勤 ) 平 成 25 年 度 年 間 報 酬 等 の 総 額 就 任 退 任 の 状 況 報 酬 ( 給 与 ) 賞 与 その 他 ( 内 容 ) 就 任 退 任 16,936 10,654 4,36

10 期 末 現 在 の 資 本 金 等 の 額 次 に 掲 げる 法 人 の 区 分 ごとに それぞれに 定 める 金 額 を 記 載 します 連 結 申 告 法 人 以 外 の 法 人 ( に 掲 げる 法 人 を 除 きます ) 法 第 292 条 第 1 項 第 4 号 の5イに 定 める

<4D F736F F D F4390B3816A91E6398D A948EE58E91967B939995CF93AE8C768E5A8F9182C98AD682B782E989EF8C768AEE8F8082CC934B97708E77906A81762E646F63>

スライド 1

スライド 1

< 目 次 > 8. 雇 用 保 険 高 年 齢 雇 用 継 続 給 付 27 ( 育 児 休 業 給 付 介 護 休 業 給 付 ) 8.1 高 年 齢 雇 用 継 続 給 付 画 面 のマイナンバー 設 定 高 年 齢 雇 用 継 続 給 付 の 電 子 申 請 高

4 承 認 コミュニティ 組 織 は 市 長 若 しくはその 委 任 を 受 けた 者 又 は 監 査 委 員 の 監 査 に 応 じなければ ならない ( 状 況 報 告 ) 第 7 条 承 認 コミュニティ 組 織 は 市 長 が 必 要 と 認 めるときは 交 付 金 事 業 の 遂 行 の

2 科 学 研 究 費 助 成 事 業 のトップページ 画 面 が 表 示 されます [ 研 究 者 ログイン]をクリック します 掲 載 している 画 面 は 例 示 です 随 時 変 更 されます 3 科 研 費 電 子 申 請 システムの 応 募 者 ログイン 画 面 が 表 示 されます e

<4D F736F F D203193FA8AD45F95CA8E86325F89898F4B315F94F093EF8AA98D AD97DF914F82CC8FEE95F182CC8EFB8F C28E8B89BB2E646F63>

積 載 せず かつ 燃 料 冷 却 水 及 び 潤 滑 油 の 全 量 を 搭 載 し 自 動 車 製 作 者 が 定 める 工 具 及 び 付 属 品 (スペアタイヤを 含 む )を 全 て 装 備 した 状 態 をいう この 場 合 に おいて 燃 料 の 全 量 を 搭 載 するとは 燃 料

注 記 事 項 (1) 当 四 半 期 連 結 累 計 期 間 における 重 要 な 子 会 社 の 異 動 : 無 (2) 四 半 期 連 結 財 務 諸 表 の 作 成 に 特 有 の 会 計 処 理 の 適 用 : 有 ( 注 ) 詳 細 は 添 付 資 料 4ページ 2.サマリー 情 報 (


2 役 員 の 報 酬 等 の 支 給 状 況 平 成 27 年 度 年 間 報 酬 等 の 総 額 就 任 退 任 の 状 況 役 名 報 酬 ( 給 与 ) 賞 与 その 他 ( 内 容 ) 就 任 退 任 2,142 ( 地 域 手 当 ) 17,205 11,580 3,311 4 月 1

目 次 1. 積 算 内 訳 書 に 関 する 留 意 事 項 1 ページ 2. 積 算 内 訳 書 のダウンロード 3 ページ 3. 積 算 内 訳 書 の 作 成 (Excel 2003の 場 合 ) 6 ページ 4. 積 算 内 訳 書 の 作 成 (Excel 2007の 場 合 ) 13

Microsoft Word - 佐野市生活排水処理構想(案).doc

<4D F736F F D208ED089EF95DB8CAF89C193FC8FF38BB CC8EC091D492B28DB88C8B89CA82C982C282A282C42E646F63>

(5) 人 権 侵 害, 差 別 又 は 名 誉 毀 損 となるもの, 又 はおそれがあるもの (6) 他 人 を 誹 謗 し, 中 傷 し, 又 は 排 斥 するもの (7) 投 機 心, 射 幸 心 をあおるもの, 又 はそのおそれがあるもの (8) 内 容 が 虚 偽 誇 大 であるなど 過

< 現 在 の 我 が 国 D&O 保 険 の 基 本 的 な 設 計 (イメージ)> < 一 般 的 な 補 償 の 範 囲 の 概 要 > 請 求 の 形 態 会 社 の 役 員 会 社 による 請 求 に 対 する 損 免 責 事 由 の 場 合 に 害 賠 償 請 求 は 補 償 されず(

1 書 誌 作 成 機 能 (NACSIS-CAT)の 軽 量 化 合 理 化 電 子 情 報 資 源 への 適 切 な 対 応 のための 資 源 ( 人 的 資 源,システム 資 源, 経 費 を 含 む) の 確 保 のために, 書 誌 作 成 と 書 誌 管 理 作 業 の 軽 量 化 を 図

6-1 第 6 章 ストック オプション 会 計 設 例 1 基 本 的 処 理 Check! 1. 費 用 の 計 上 ( 1 年 度 ) 2. 費 用 の 計 上 ( 2 年 度 )- 権 利 不 確 定 による 失 効 見 積 数 の 変 動 - 3. 費 用 の 計 上 ( 3 年 度 )-

2 県 公 立 高 校 の 合 格 者 は このように 決 まる (1) 選 抜 の 仕 組 み 選 抜 の 資 料 選 抜 の 資 料 は 主 に 下 記 の3つがあり 全 高 校 で 使 用 する 共 通 の ものと 高 校 ごとに 決 めるものとがあります 1 学 力 検 査 ( 国 語 数

積 み 立 てた 剰 余 金 の 配 当 に 係 る 利 益 準 備 金 の 額 は 利 益 準 備 金 1 の 増 3 に 記 載 します ⑸ 平 成 22 年 10 月 1 日 以 後 に 適 格 合 併 に 該 当 しない 合 併 により 完 全 支 配 関 係 がある 被 合 併 法 人 か

Microsoft PowerPoint - Econometrics pptx

WEB版「新・相続対策マスター」(ご利用の手引き)

為 が 行 われるおそれがある 場 合 に 都 道 府 県 公 安 委 員 会 がその 指 定 暴 力 団 等 を 特 定 抗 争 指 定 暴 力 団 等 として 指 定 し その 所 属 する 指 定 暴 力 団 員 が 警 戒 区 域 内 において 暴 力 団 の 事 務 所 を 新 たに 設

全設健発第     号

1_2013BS(0414)

一 覧 表 ( 専 従 者 用 ) YES NOチャート( 専 従 月 額 単 価 用 ) (P.4)を 参 考 にしてください < 直 接 雇 用 者 > 一 覧 表 ( 専 従 者 用 )の 単 価 は 委 託 期 間 中 に 継 続 して 半 年 以 上 当 該 AMED 事 業

年 支 給 開 始 年 齢 図 特 別 支 給 の 老 齢 厚 生 年 ( 給 料 比 例 部 分 ) 昭 和 29 年 10 月 1 日 生 まれ 以 前 ~ 特 別 支 給 の 退 職 共 済 年 老 齢 厚 生 年 昭 和 25 年 10 月 1 日 生 まれ 以 前 ~ 退 職 共 済 年

平成21年9月29日

<6D313588EF8FE991E58A778D9191E5834B C8EAE DC58F4992F18F6F816A F990B32E786C73>

Microsoft PowerPoint  22日修正最終確定.ppt

住宅改修の手引き(初版)

<4D F736F F F696E74202D E36816A984A93AD8C5F96F CC837C A815B C E707074>

2016 年 度 情 報 リテラシー 変 更 された 状 態 同 様 に 価 格 のセルを 書 式 設 定 する 場 合 は 金 額 のセルをすべて 選 択 し [ 書 式 ]のプルダウンメニューか ら[ 会 計 ]を 選 択 する すると が 追 加 され 金 額 としての 書 式 が 設 定 さ

PowerPoint プレゼンテーション

(2) 非 破 綻 清 算 参 加 者 の 特 別 清 算 料 による 負 担 に 係 る 上 限 設 定 期 間 の 導 入 特 別 清 算 料 による 補 填 は 上 限 設 定 期 間 に 発 生 した 破 綻 について 最 初 の 破 綻 発 生 時 における 各 非 破 綻 清 算 参 加

< E8BE08F6D2082C682B DD2E786C7378>

目 次 1 報 酬 給 与 額 事 例 1 報 酬 給 与 額 に 含 める 賞 与 の 金 額 が 誤 っていた 事 例 1 事 例 2 役 員 退 職 金 ( 役 員 退 職 慰 労 金 )を 報 酬 給 与 額 として 申 告 して いなかった 事 例 1 事 例 3 持 株 奨 励 金 を

No.7 アメリカ 合 衆 国 小 規 模 事 例 (そ4) 助 金 も 財 源 になっている しかし 小 規 模 事 業 体 では 連 邦 政 府 から 基 金 はもちろん 市 から 補 助 金 もまったくない が 実 状 である すなわち 給 人 口 が25 人 から100 人 規 模 小 規

Transcription:

2006.7.6( 木 ) 改 定 6.1 版 Java 入 門 目 次 基 本 編 1.プログラミング 周 辺 の 話 題 2 2.Javaによる 初 めてのプログラミング 3 3.Javaアプリケーションの 構 造 4 4. Hello d アプレット Worl 8 5.Javaアプレットの 構 造 10 資 料 1 ASCI Iコード 一 覧 表 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のアサーション 機 能 12 生 産 情 報 システム 技 術 科 福 良 博 史 1

1.プログラミング 周 辺 の 話 題 ハードウェアとソフトウェア プログラミングとそのための 言 語 プログラミング 言 語 と 皆 さんが 通 常 考 えている 算 数 との 違 い 例 1: 以 下 の 手 順 で aの 値 は 最 終 的 に 幾 つになる? a=5* 2 7 b b= a=a+ ソフトウェアの 設 計 / 構 造 化 プログラミング(Dijkstr a)/オブジェクト 指 向 (UML) 課 題 :1から10までの 和 を 求 めなさい 注 ) 10まで の 条 件 を nまで としたらどうする 用 語 集 Progra m Interprete r Compile r Assemble r Machine e Languag Machin e Jav 関 連 の 用 語 Java Virtual e Machin Java Java Compile r Interprete r Javaの 言 語 仕 様 を 読 むために 形 式 言 語 BNF 記 法 とその 拡 張 終 端 記 号 (termina l)と 非 終 端 記 号 (non termina l) 例 :if intなど 例 : 文 フィールド など 2

2.Jav aによる 初 めてのプログラミング Hello d アプリケーション Worl 以 下 の 手 順 に 従 うと スタンドアロンの ことができる Java アプリケーションを 作 成 して 使 用 する 手 順 1:Javaソースファイルの 作 成 ここで 示 す Java コードで HelloWorldApp.java と 指 定 されたファイルを 作 成 する 注 :Javaは 大 文 字 と 小 文 字 を 区 別 するので 注 意 してコードを 書 くこと /** HelloWorldApp クラスは 標 準 出 力 に Hello */ * するアプリケーションを 実 装 する class HelloWorldApp {! を World 表 示 public static void { main(string[] args) System.out.println("Hello / 文 字 列 を 表 示 する World!"); / 手 順 2:ソースファイルのコンパイル Javaコンパイラを 使 用 してソースファイルをコンパイルする DOSプロンプト( Windows XX ): javac HelloWorldApp.java コンパイルが 成 功 した 場 合 コンパイラは HelloWorldApp.class と 指 定 されたファイルを 作 成 する コンパイルが 失 敗 した 場 合 は 上 記 で 示 したように 正 確 にプログラムを 入 力 し て 指 定 しているかどうか 確 認 する 手 順 3:アプリケーションの 実 行 Javaインタプリタを 使 用 してプログラムを 実 行 する DOSプロンプト( Windows XX ): java HelloWorldApp 注 :Java インタープリタへの 引 数 は ファイル 名 ではなく 実 行 するクラス 名 になる Hello Worl d! が 標 準 出 力 で 表 示 されるの が 見 られる 3

3.Javaアプリケーションの 構 造 1)Javaコードのコメント Java 言 語 は3つの 種 類 のコメントをサポートする /*テキスト */ コンパイラは /*から */までのすべてを 無 視 する /** 文 書 */ これはドキュメント 生 成 のためのコメントを 示 す コンパイラは /*と */を 使 用 する コメントを 無 視 するのと 同 じように この 種 類 のコメントを 無 視 する JDK javadoc ツー ルは 自 動 的 に 作 成 される 文 書 を 準 備 する 時 に 文 書 コメントを 使 用 する javadoc の 詳 細 については Javaツールマニュアルを 参 照 すること //テキスト コンパイラは //から 行 の 最 後 までを 無 視 する /* */ * HelloWorldApp クラスは 標 準 出 力 に Hello d! を Worl * 表 示 するアプリケーションを 実 装 する // 文 字 列 を 表 示 する 2)クラスを 定 義 する Java 言 語 では すべてのメソッド( 関 数 )と 変 数 がクラスあるいはオブジェクト(クラ スのインスタンス) 内 に 存 在 する /** HelloWorldApp クラスは 標 準 出 力 に Hello */ * するアプリケーションを 実 装 する class elloworldapp H {! を World 表 示 public static void { main(string[] args) System.out.println("Hello / 文 字 列 を 表 示 する World!"); / 現 実 の 世 界 でのクラスの 例 としては 料 理 法 が 考 えられる たとえば 雑 煮 の 料 理 法 があるとする あなたが 料 理 した 雑 煮 は 雑 煮 の 料 理 法 における1つのインスタンスで あり 私 が 料 理 したものは 全 く 別 のインスタンスである ( 両 方 の 雑 煮 は 同 じ ルックアン ドフィール かもしれない 匂 いと 味 も 似 ているかもしれない しかし 別 の 物 である ) 4

3)main() メソッド すべての Java アプリケーションの 中 枢 部 は その main( )メソッドである Java イン タプリタでアプリケーションを 実 行 する 時 は 実 行 したいクラス 名 を 指 定 する インタプ リタは そのクラス 内 で 定 義 した main( )メソッドを 起 動 する main( )メソッドは プログ ラムの 流 れを 制 御 し 必 要 とされる 資 源 を 割 り 当 て アプリケーションのために 機 能 性 を 提 供 する 他 のメソッドを 実 行 する /**HelloWorldApp クラスは 標 準 出 力 に Hello */ * するアプリケーションを 実 装 する class HelloWorldApp {! を World 表 示 public static void String[] main( { args) System.out.println("Hello / 文 字 列 を 表 示 する World!"); / すべての なくてはならない 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.noclassdeffo p 5

main() メソッドの 引 数 次 のコードの 太 字 下 線 部 のように つの 引 数 を 受 け 取 る この main( )メソッドは public static (String void [] args) main Strings の 配 列 というひと String の 配 列 は 実 行 時 システムがアプリケーションに 情 報 を 渡 すメカニズムであ る 配 列 でのそれぞれの String は コマンド 行 引 数 と 呼 ばれる コマンド 行 引 数 によ ってユーザは 再 コンパイルせずに アプリケーションの 操 作 に 影 響 を 与 えることができる 注 ) Java 実 行 環 境 で 関 数 に 渡 す 引 数 の 数 と 型 とは 異 なる main() メソッドに 渡 す 引 数 の 数 と 型 は C 言 語 や C++の main() 4)クラスとオブジェクトの 使 用 Javaアプリケーションの 他 のコンポーネントは アプリケーションを 実 装 するために 作 成 した 支 援 のオブジェクト クラス メソッド および Java 言 語 文 である Hello Worl d アプリケーションは 何 かを 行 うために 作 成 する Javaプログラムとして は ほぼ 最 も 単 純 なものである 大 変 単 純 なプログラムなので HelloWorldApp 以 外 のク ラスは 定 義 する 必 要 がない しかし 作 成 されるたいていのプログラムはもっと 複 雑 であ り 他 のクラスや 補 助 の Java コードを 作 成 する 必 要 がある Hello Worl d アプリケーションは Java 環 境 で 提 供 される 別 のクラス-System -を 使 用 する System クラスは システムに 依 存 する 機 能 性 に 対 し システムに 依 存 しな いアクセスを 提 供 する System クラスの 情 報 については システム 資 源 の 使 用 を 参 照 する こと 次 のリストの 太 字 下 線 部 のコードは System クラスのクラス 変 数 の 使 用 方 法 とインスタ ンスメソッドの 使 用 方 法 を 示 す /** HelloWorldApp クラスは 標 準 出 力 に Hello */ * するアプリケーションを 実 装 する class HelloWorldApp {! を World 表 示 public static void main(string[] { args) System. out.println("hell o World!") ; / 文 字 列 を 表 示 する 6

5)クラスメソッドまたは 変 数 の 使 用 System. out.println("hello ; World!") 構 成 要 素 ションは 決 して System.out は System クラス 内 の out 変 数 のフルネームになる アプリケー System クラスをインスタンス 化 せず outはクラス 名 から 直 接 参 照 され ることに 注 意 する これは outがクラス 変 数 であり クラスのインスタンスよりも む しろクラスと 関 連 づけられた 変 数 であるためである 同 様 にメソッドをクラスと 関 連 づけ ることができる これはクラスメソッドである クラス 変 数 とメソッドを 参 照 するためには ピリオド( ド 名 あるいはクラス 変 数 名 を 結 合 する ".")でクラス 名 とクラスメソッ 6)インスタンスメソッドまたは 変 数 の 使 用 クラスメソッドあるいはクラス 変 数 でないメソッドと 変 数 は インスタンスメソッドとイ ンスタンス 変 数 として 知 られている インスタンスメソッドと 変 数 を 参 照 するためには オブジェクトからメソッドと 変 数 を 参 照 しなくてはならない System の out 変 数 は クラス 変 数 である 一 方 標 準 出 力 を 実 装 する PrintStream クラス (Java 開 発 環 境 で 提 供 されたクラス)のインスタンスを 参 照 する System クラスがアプリケーションにロードされると PrintStream をインスタンス 化 して 新 規 の PrintStream オブジェクトを outクラス 変 数 に 割 り 当 てる これでクラスのイン スタンスを 持 つことになるので そのインスタンスメソッドを 呼 び 出 すことができる System.out.pri ntln("hello World!") ; 見 てわかるように クラスメソッドや 変 数 を 参 照 する 方 法 と 同 様 にして インスタンスメ ソッドや 変 数 を 参 照 する ピリオド( スメソッド 名 あるいは 変 数 (printl n)を 結 合 する ".")でオブジェクト 参 照 (out)と インスタン Javaコンパイラにより クラス インスタンスメソッド 変 数 への 参 照 を 一 緒 に 階 層 化 す ることができるので 結 果 としてプログラム 例 に 現 れるような 構 成 要 素 になる System. out.printl n("hello World!") ; 7

4. Hell o World アプレット 以 下 の 手 順 にしたがうと アプレットを 作 成 して 使 用 することができる 手 順 1:Javaソースファイルの 作 成 次 に 示 す Java コードを 使 用 して HelloWorld.java と 指 定 したファイルを 作 成 する import import java.applet.applet ; java.awt.graphics ; public class HelloWorld { extends Applet public int(graphics void pa{ g) g.drawstring("hello /メッセージ world!", 50, 25); g.drawline(0, 100); 0, 50, // 直 線 g.drawrect(70, 70, 30, // 四 角 形 10); g.drawoval(100, 100, // 楕 60, 円 10); 手 順 2:ソースファイルのコンパイル Javaコンパイラを 使 用 してソースファイルをコンパイルする コンパイルが 成 功 する 場 合 コンパイラは HelloWorld.class と 指 定 されたファイルを 作 成 する コンパイルが 失 敗 した 場 合 は 上 記 で 示 したように 正 確 にプログラムを 入 力 して 名 前 を 指 定 したかを 確 認 する 手 順 3:アプレットを 含 む HTML ファイルの 作 成 HelloWorld.class. を 含 む 同 じディレクトリで 作 成 する この HTML ファイルは 次 のテキストを 含 む Hello.htm lと 指 定 されたファイルを <HTML > <HEAD><TITLE> A Simple LE></HEAD > Program </TIT <BODY > これは 私 が 造 った 初 めての Javaのアプレットです <APPLET CODE="HelloWorld.class" > WIDTH=400 HEIG </BODY > </HTML > 8

手 順 4:HTMLファイルのロード Javaアプレットを 実 行 することができるアプリケーションに する このアプリケーションには Java 互 換 のブラウザ あるいは Applet ビューワーのような HTM Lファイルをロード JDKで 提 供 した Java アプレット 参 照 プログラムがある HTML ファイルをロ ードするためには 一 般 的 にアプリケーションとして 作 成 した える 必 要 がある 例 えば ブラウザの なことを 入 力 する file:c:/user/j/hello.html HTML ファイルの URLを 伝 URLあるいはロケーションフィールドに 次 のよう うまくこれらの 手 順 を 完 了 すると ブラウザウィンドウで 見 ることができる ブラウザの 替 わりに Apple tビューワーを 用 いる 場 合 は コマンドラインから 以 下 のよう なことをする DOSコマンドプロンプト( appletviewer Hello.html Window s 等 ): 実 行 結 果 の 例 9

5.Javaアプレットの 構 造 クラスとパッケージのインポート 最 初 の2つの 行 を 無 効 にした 場 合 は 次 のようにコードの 残 りの 部 分 を 変 更 ( 太 字 下 線 部 )した 場 合 に 限 り アプレッ トをコンパイルして 実 行 することができる import import Applet サブクラスの 定 義 多 くの 機 能 を 継 承 する java.applet.applet ; java.awt.graphics ; publicclasshelloworld extendsjava.applet.aplet{ public voidpaint(java.awt.grap hics g){ g.drawstring("helloworld!",50, 25); public class ld HelloWor extends { Applet public void paint(graphics { g) アプレットメソッドの 実 装 HelloWorld アプレットは paint()メソッドを 実 装 する すべてのアプレットが 少 なくと も init() start() paint()メソッ ドのうちの 一 つを 実 装 しなくては g.drawstring("hello ; world!", 50, 25) ならない Java アプリケーション と 異 なり アプレットは main()メ ソッドを 実 装 する 必 要 がない paint()メソッドに 渡 す Graphics オブジェクトは アプレットのスクリー ン 上 の 描 画 コンテキストを 表 す Graphics drawstring() メソッドの 最 初 の 引 数 は スクリーン 上 に 描 かれる 文 字 列 である 2 番 目 と3 番 目 の 引 数 は スクリーンの 左 下 隅 を 表 す( x,y) 座 標 である このアプレットは(50,25) の 位 置 において 文 字 列 Hello world! を 描 く アプレットの 座 標 系 は(0,0) で 始 まり これはアプレットの 表 示 領 域 の 左 上 隅 である アプレットの 実 行 アプレットは HTMLページに 組 み 込 まれなければならない <APPLET >タグを 使 用 して ( 少 なくとも)Appletサブクラスの 位 置 とアプレットスクリーン 上 に 表 示 するエリアの 大 きさを 指 定 する Java ブラウザが <APPLET >タグと 出 くわすと アプレットのためにスク リーン 上 のスペースを 予 約 し ブラウザが 実 行 しているコンピュータ 上 に ラスをロードし レットの Applet サブク Applet サブクラスのインスタンスを 作 成 する 次 に ブラウザはアプ init( )と start( )メソッド を 呼 び 出 し アプレットが 実 行 する <APPLET CODE="HelloWorld.class" > WIDTH=150 H </APPLET > 10

資 料 1 ASCIコード 一 覧 表 上 位 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 制 御 符 号 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 削 除 注 : OS 毎 の 改 行 コードの 違 い (1)Windows は CR+LF (2)UNIX は LF (3)Mac は CR 11

資 料 2 Javaのインストール j2sdk-1_4_2_04-windows-i586-p.exe または jdk-1_5_0_06-windows-i586-p.exe をダブルクリックし あとは NEXT Yes などと 答 えていく すべて 選 択 する 確 認 1C ドライブに j2sdk1.4.2_04 というフォルダができている 2Dos のコマンドプロンプトから 以 下 のコマンドを 入 力 し 結 果 を 確 認 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: > 環 境 変 数 の 設 定 スタート 設 定 コントロール パネル システム 詳 細 タグ 環 境 変 数 ボタン システム 環 境 変 数 の 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コマンドで 環 境 変 数 の 設 定 内 容 を 確 認 C: >set 注 意! 既 存 の 定 義 をツブサナイで! ; 既 存 の 定 義 というように 最 初 に 既 存 の 定 義 の 前 に ; (セミコロン)を 追 加 してから この Java 用 の PATH を 記 述 するほうが 安 全 です ( 今 度 は java version として 上 記 の 確 認 が 可 能 です) JAVA_HOME=c: j2sdk1.4.2_04 Path=.;c: j2sdk1.4.2_04 bin;c: WINNT system32;c: WINNT;C: WINNT System32 W bem; 12

1:データの 型 と 代 入 プリミティブ 型 及 び 値 プリミティブ 型 (primitive )は,Java type 言 語 によってあらかじめ 決 められており,そ れに 対 して 予 約 されたキーワードで 名 前 付 けする PrimitiveType : NumericTyp e boolea n NumericType : IntegralTyp e FloatingPointTyp e 5.フィールドとローカル 変 数 の 初 期 化 IntegralType :oneof byte short int r long 7.コンパイル エラーに cha 表 示 される 行 と FloatingPointType :oneof float doubl e プリミティブ 値 は, 他 のプリミティブ 値 と 状 態 を 共 有 しない 型 をプリミティブ 型 とする 変 数 は, 常 にそれと 同 じ 型 のプリミティブ 値 を 保 持 する プリミティブ 型 の 変 数 の 値 は, その 変 数 に 対 する 代 入 演 算 によってだけ 変 更 できる 数 値 型 (numeric)は, types 整 数 的 な 型 及 び 浮 動 小 数 点 型 とする 整 数 的 な 型 (integral types )は,byte,shor t,int 及 び long(それぞれ,8ビット,16 ビット,32ビット 及 び 64ビットの 2の 補 数 符 号 付 き 整 数 ), 並 びに char(unicode 文 字 を 表 す 16ビット 符 号 無 し 整 数 )に 分 ける 浮 動 小 数 点 型 (floatin g-point )は,floa typest(32ビット IEEE 4 浮 75 動 小 数 点 数 ) 及 び doubl e(64ビット IEEE 4 浮 75 動 小 数 点 数 )とする 1.ブロック 構 造 2. 文 と 行 の 違 い 3. 文 の 改 行 位 置 の 自 由 度 4.クラスに 所 属 する 変 数 とメソッド 6. 変 数 のスコープ 実 行 時 の 例 外 処 理 で 表 示 される 行 の 違 い 型 boolea nは 二 つの 値,true( 真 ) 及 び fals e( 偽 ),だけをとる 整 数 的 な 型 及 び 値 整 数 的 な 型 の 値 は, 次 の 範 囲 の 整 数 とする byte-128 以 上,127 以 下 shor t-3276 8 以 上,3276 以 下 int-214748364 8 以 上,214748364 7 以 下 long-922337203685477580 8 以 上,922337203685477580 7 以 下 char' u0000 ' 以 上,' uffff ' 以 下,すなわち,0 以 上,65535 以 下 13

整 数 演 算 Javaは, 整 数 的 な 値 に 作 用 する 多 くの 演 算 子 を 提 供 する 比 較 演 算 子 結 果 は, 型 boolea nの 値 になる o 数 値 比 較 演 算 子 <,<=,> 及 び >= o 数 値 等 価 演 算 子 == 及 び!= 数 値 演 算 子 結 果 は, 型 int 又 は 型 longになる o 単 項 符 号 演 算 子 + 及 び - o 乗 除 演 算 子 *,/ 及 び % o 加 法 演 算 子 + 及 び - o 増 分 演 算 子 ++, 接 頭 語 及 び 接 尾 語 の 両 方 o 減 分 演 算 子 --, 接 頭 語 及 び 接 尾 語 の 両 方 o 符 号 付 き 及 び 符 号 無 しシフト 演 算 子 <<,>> 及 び >> o ビット 単 位 補 数 演 算 子 ~ o 条 件 演 算 子? : 整 数 ビット 単 位 演 算 子 &, 及 び ^ キャスト 演 算 子 ある 整 数 値 を, 任 意 の 指 定 した 数 値 型 の 値 へ 変 換 することができ る 文 字 列 連 結 演 算 子 + Strin gオペランド 及 び 整 数 的 オペランドを 与 えたとき, 整 数 的 オペランドをその 値 を 表 す 10 進 数 表 記 の Strin gに 変 換 し, 次 にその 二 つの Strin gを 連 結 した 新 しい 文 字 列 を 生 成 する 浮 動 小 数 点 型 及 び 値 浮 動 小 数 点 型 は,floa t 及 び doubl eとし,2 進 数 浮 動 小 数 点 計 算 のための IEE 規 格 (IEE Standard for Binary g-point Floatin Arithmetic ),ANSI/IEE E 規 格 754-1985(IEEE, w York )で 規 定 する, 単 精 度 32ビット 及 び 倍 精 度 64ビット 形 式 の IEEE 54の 7値 及 び 演 算 を 表 現 する IEEE 754 規 格 は, 正 負 の 符 号 及 び 大 きさからなる 数 だけではなく, 正 及 び 負 のゼロ, 正 及 び 負 の 無 限 大 (infinities ), 並 びに 特 別 な Not-a-Number ( 以 降 NaNと 略 す)を 含 む NaN 値 は,ゼロをゼロで 割 るなどの 特 別 な 演 算 の 結 果 を 表 すために 使 用 する floa t 及 び doubl e 型 の NaN 定 数 は,Float.N an 及 び Double.Na Nとして, 定 義 する 型 floa tの 有 限 非 ゼロ 値 の 形 式 は, とする ここで sは, +1 又 は -1,mは, 未 満 の 正 整 数 とし,eは, -149 以 上 104 以 下 の 整 数 とする mが 正 であるが 未 満 で あって,eが -149に 等 しい 形 式 の 値 を, 非 正 規 化 (denormalized )されているという Ne 14

型 doubl eの 有 限 非 ゼロ 値 の 形 式 は, とする,ここで sは, +1 又 は -1,mは, 未 満 の 正 整 数 であり,eは, -1075 以 上 970 以 下 の 整 数 とする mが 正 であって 未 満 及 び eが -1075に 等 しい 形 式 の 値 を, 非 正 規 化 (denormalized )されているという NaNを 除 いて, 浮 動 小 数 点 値 は 最 小 値 から 最 大 値 に 向 かって, 負 の 無 限 大, 負 の 有 限 非 ゼ ロ 値, 負 のゼロ, 正 のゼロ, 正 の 有 限 非 ゼロ 値, 及 び 正 の 無 限 大 の 順 に 順 序 付 ける(ordered ) 正 のゼロと 負 のゼロの 比 較 結 果 は, 等 しいとする したがって, 式 0.0= =-0.0の 結 果 は trueに,0.0>-0.0の 結 果 は fals eになる しかし,その 他 の 演 算 は, 正 及 び 負 のゼロを 区 別 する 例 えば,1.0/0. 0は 正 の 無 限 大 の 値 をもつ 一 方,1.0/-0.0の 値 は 負 の 無 限 大 とする Math.mi n 及 び Math.ma x 演 算 も, 正 のゼロ 及 び 負 のゼロを 区 別 する NaNは, 順 序 付 けしない(unordered ) したがって, 数 値 比 較 演 算 子 <,<=,> 及 び >=は, オペランドのいずれか 又 は 両 方 が NaNのとき fals eを 返 す どちらかのオペランドが NaN ならば, 等 価 演 算 子 ==は fals eを 返 し,どちらかのオペランドが NaNならば, 非 等 価 演 算 子!=は trueを 返 す 特 に, xが NaNのときに 限 って,x!=xは trueを, x 又 は y が NaNならば,(x<y) ==!(x>=y )は fals eを 返 す 浮 動 小 数 点 型 の 任 意 の 値 は, 任 意 の 数 値 型 へキャストしてよい 又 は 任 意 の 数 値 型 からキ ャストされてもよい 浮 動 小 数 点 型 と 型 boolea nとの 間 では,キャストできない 浮 動 小 数 点 演 算 Javaは, 浮 動 小 数 点 値 に 作 用 する 演 算 子 を 多 数 提 供 する 比 較 演 算 子 結 果 は, 型 boolea nの 値 になる o 数 値 比 較 演 算 子 <,<=,> 及 び >= o 数 値 等 価 演 算 子 == 及 び!= 数 値 演 算 子 結 果 は, 型 floa t 又 は 型 doubl eになる o 単 項 符 号 演 算 子 + 及 び - o 乗 除 演 算 子 *,/ 及 び % o 加 法 演 算 子 + 及 び - o 増 分 演 算 子 ++, 接 頭 語 及 び 接 尾 語 の 両 方 o 減 分 演 算 子 --, 接 頭 語 及 び 接 尾 語 の 両 方 条 件 演 算 子? : キャスト 演 算 子 ある 浮 動 小 数 点 値 を, 任 意 の 指 定 した 数 値 型 の 値 へ 変 換 する 文 字 列 連 結 演 算 子 + Strin gオペランド 及 び 浮 動 小 数 点 オペランドを 与 えたとき, 浮 動 小 数 点 オペランドを,その 値 を 表 す 10 進 表 現 の 文 字 列 に 情 報 の 損 失 無 しに 変 換 し, 次 にそれら 二 つの 文 字 列 を 連 結 した 新 しい Strin gを 生 成 する 15

boolea n 型 及 び bool ean 値 型 boolea nは,リテラル true 及 び fals eで 示 す 二 つの 可 能 な 値 をもつ 論 理 的 な 量 を 表 す 論 理 演 算 子 には, 次 の 種 類 がある 関 係 演 算 子 == 及 び!= 論 理 補 数 演 算 子! 論 理 演 算 子 &,^ 及 び 条 件 付 き AND 及 び 条 件 付 き OR 演 算 子 && 及 び 条 件 演 算 子? : 文 字 列 連 結 演 算 子 + Strin gオペランド 及 び 論 理 オペランドを 与 えたとき, 論 理 オペランドを Strin g("true " 又 は "false ")に 変 換 し,それから, 二 つの 文 字 列 を 連 結 した 新 しい Strin gを 生 成 する 論 理 式 は,いくつかの 種 類 の 文 において 制 御 フローを 決 定 する if 文 whil e 文 do 文 for 文 boolea n 式 はまた, 条 件 演 算 子?:において,どの 副 文 を 評 価 するかを 決 定 する boolea n 式 だけが, 条 件 演 算 子?:の 最 初 のオペランド, 及 び 制 御 フロー 文 内 で 使 用 でき る 任 意 の 非 ゼロ 値 が trueとなる C 言 語 の 慣 習 に 従 い, 整 数 xは, 式 x!=0によって boolea nに 変 換 できる nullでない 任 意 の 参 照 が trueとなる C 言 語 の 慣 習 に 従 い,オブ ジェクト 参 照 objは, 式 obj!=nul lによって boolea nに 変 換 できる boolea n 値 の 型 boolea nへのキャストは 許 される 型 boolea nに 関 する 他 のキャストは 許 されない boolea n 値 は, 文 字 列 変 換 によって 文 字 列 に 変 換 できる 16

変 数 の 初 期 の 値 Javaプログラムのすべての 変 数 は,その 値 が 使 用 される 前 に, 値 をもっていなければなら ない 個 々のクラス 変 数,インスタンス 変 数 又 は 配 列 構 成 要 素 は,それを 生 成 するときに デフォルト 値 (default)に 初 value 期 化 する o o o o o o o o o 型 byteについては,デフォルト 値 はゼロ,すなわち (byte) 0とする 型 shor tについては,デフォルト 値 はゼロ,すなわち (short) 0とする 型 intについては,デフォルト 値 はゼロ,すなわち 0とする 型 longについては,デフォルト 値 はゼロ,すなわち 0Lとする 型 floa tについては,デフォルト 値 は 正 のゼロ,すなわち 0.0fとする 型 doubl eについては,デフォルト 値 は 正 のゼロ,すなわち 0.0dとする 型 charについては,デフォルト 値 は 空 文 字,すなわち ' u0000 'とする 型 boolea nについては,デフォルト 値 は fals eとする すべての 参 照 型 については,デフォルト 値 は nullとする 個 々のメソッド 仮 引 数 は,そのメソッドの 呼 出 し 元 が 提 供 する 対 応 する 実 引 数 値 に 初 期 化 される 個 々のコンストラクタ 仮 引 数 は,クラスインスタンス 生 成 式 又 は 明 示 的 なコンスト ラクタ 呼 出 しが 提 供 する, 対 応 する 実 引 数 値 に 初 期 化 される 例 外 ハンドラ 仮 引 数 は,その 例 外 を 表 している 投 げられたオブジェクトを 初 期 値 と してもつ 局 所 変 数 には, 使 用 前 に, 初 期 化 又 は 代 入 によって, 明 確 な 代 入 の 規 則 を 使 ってコ ンパイラが 検 証 できる 方 法 で, 値 を 明 示 的 に 与 えなければならない プリミティブ 型 の 拡 大 変 換 プリミティブ 型 における 次 の 19 個 の 変 換 をプリミティブ 型 の 拡 大 変 換 (widenin g primitive n) conversio と 呼 ぶ byteから shor t,int,long,floa 又 は doubl eへの 変 換 shor tから int,long,floa 又 は doubl eへの 変 換 charから int,long,floa 又 は doubl eへの 変 換 intから long,floa t, 又 は doubl eへの 変 換 longから floa t 又 は doubl eへの 変 換 floa tから doubl eへの 変 換 17

プリミティブ 型 の 拡 大 変 換 は, 数 値 の 全 体 としての 大 きさについての 情 報 を 失 わない 実 際, 整 数 の 型 から 他 の 整 数 の 型 への 拡 大 変 換 及 び 型 floa tから 型 doubl eへの 拡 大 変 換 は, いかなる 情 報 も 失 うことはない つまり, 数 値 を 正 確 に 保 存 する int 若 しくは longの 値 から floa tへの 変 換, 又 は longの 値 から doubl eへの 変 換 は, 精 度 の 損 失 (loss precisio n),すなわち 値 の 最 小 位 の 数 ビットを 失 なうことがある この 場 合, 浮 動 小 数 点 の 結 果 値 は,IEEE 直 754 近 へのまるめモードを 利 用 して, 正 しく 丸 めた 整 数 値 とする of プリミティブ 型 の 縮 小 変 換 プリミティブに 関 する 次 の 23 個 の 変 換 をプリミティブ 型 の 縮 小 変 換 (narrowing primitive conversio n) と 呼 ぶ byteから charへの 変 換 shor tから byte 又 は charへの 変 換 charから byte 又 は shor tへの 変 換 intから byte,shor t 又 は charへの 変 換 longから byte,shor t,char 又 は intへの 変 換 floa tから byte,shor t,char,int 又 は longへの 変 換 doubl eから byte,shor t,char,int,long 又 は floa tへの 変 換 縮 小 変 換 は, 数 値 全 体 の 大 きさの 情 報 を 失 うことがあり,さらに 精 度 を 失 うこともある 符 号 付 き 整 数 の 整 数 型 Tへの 縮 小 変 換 は, 単 に n 個, 最 小 位 ビット 以 外 のすべての 情 報 を 捨 てる ここで,nは, 型 Tを 表 現 するのに 使 用 するビット 数 とする 数 値 の 大 きさに 関 する 情 報 の 損 失 の 可 能 性 に 加 えて, 結 果 値 の 符 号 が, 入 力 値 の 符 号 と 異 なってしまうこ とがある 同 様 にして, 文 字 型 から 整 数 型 Tへの 縮 小 変 換 は, 単 に n 個, 最 小 位 ビット 以 外 のすべ ての 情 報 を 捨 てる ここで nは, 型 Tを 表 現 するのに 使 用 するビット 数 とする 数 値 の 大 きさに 関 する 情 報 の 損 失 の 可 能 性 に 加 えて, 文 字 が 16ビットの 符 号 なし 整 数 値 を 表 わす にもかかわらず, 結 果 値 が, 負 の 数 になることがある 浮 動 小 数 点 数 から 整 数 型 Tへの 縮 小 変 換 は, 二 つの 段 階 を 踏 む 1. 第 一 段 階 では, 浮 動 小 数 点 数 を,Tが longならば longに 変 換 し,Tが byte, shor t,char 又 は intならば intに 変 換 する o 浮 動 小 数 点 数 が NaNならば, 変 換 の 第 一 段 階 の 結 果 は,int 又 は longの 0 とする o そうでないときには, 浮 動 小 数 点 数 が 無 限 大 でなければ, 浮 動 小 数 点 数 は, IEEE 4のゼロへ 75 向 かう 丸 めモードを 使 ってゼロの 方 向 の 整 数 値 Vに 丸 める このとき 次 の 二 つの 場 合 が 存 在 する 18

o Tが longであって,この 整 数 値 が longで 表 現 できれば, 第 一 段 階 の 結 果 は, longの 値 Vとする そうでないときには,この 整 数 値 が intとして 表 現 できれば, 第 一 段 階 の 結 果 は,intの 値 Vとする そうでないときには, 次 の 二 つのいずれかが 真 でなければならない 値 が 小 さすぎる( 膨 大 な 負 の 値 又 は 負 の 無 限 大 ) 第 一 段 階 の 結 果 は, 型 int 又 は 型 longの 最 小 表 現 可 能 値 とする 値 が 大 きすぎる( 膨 大 な 正 の 値 又 は 正 の 無 限 大 ) 第 一 段 階 の 結 果 は, 2. 第 二 段 階 は, 次 のとおりとする o o 型 int 又 は 型 longの 最 大 表 現 可 能 値 とする Tが int 又 は longならば, 変 換 の 結 果 は, 第 一 段 階 の 結 果 とする Tが byte,char 又 は shor tならば, 変 換 の 結 果 は, 第 一 段 階 の 結 果 の 型 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)=1 0-(-4)*(-3)=1 0-12 19

練 習 1 class L0101 { // 出 力 時 の 改 行 はどこで 行 われるか? System.out.print("こんにちは!"); System.out.println(" 皆 さん"); System.out.println("お 茶 を 飲 みましょう"); C: user java>javac L0101.java C: user java>java L0101 こんにちは! 皆 さん お 茶 を 飲 みましょう C: user java> 練 習 2 class L0102 { //このプログラムを 正 しく 動 かすには? String s1; String s2=" 私 は 誰?"; System.out.println(s1); C: user java>javac L0102.java L0102.java:5: 変 数 s1 は 初 期 化 されていない 可 能 性 があります System.out.println(s1); ^ エラー 1 個 C: user java> class L0102 { String s1; String s2=" 私 は 誰?"; System.out.println(s2); 修 正 結 果 の 出 力 C: user java>java L0102 私 は 誰? 練 習 3 class L0103 { float weight; weight = 89.5f; System.out.print(" 体 重 は "); System.out.print(weight); System.out.println("Kgです"); C: user java>java L0103 体 重 は 89.5Kg です C: user java> 20

練 習 4 public class L0104 { // 何 処 かでエラーが 出 る どうしましょう? char ch = 'AB'; System.out.println("char -> " + ch); ヒント: 文 字 と 文 字 列 の 違 いは 何 ですか? C: user java>javac L0104.java L0104.java:4: 文 字 リテラルが 閉 じられていません char ch = 'AB'; ^ L0104.java:4: 文 字 リテラルが 閉 じられていません char ch = 'AB'; ^ エラー 2 個 練 習 5 public class L0105 { // 何 処 かでエラーが 出 る どうしましょう? short s = 987654321; System.out.println("short -> " + s); ヒント:short は 精 度 何 バイト? 表 現 できる 値 は? 練 習 6 public class L0106 { // double d1,d2の 値 を 見 比 べてみましょう double d1 = 987654321.789; double d2 = 987654321123456789.789; System.out.println("double d1 -> " + d1); System.out.println("double d2 -> " + d2); 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 練 習 7 class L0107 { String s = " 猫 が 言 った" + " " 我 輩 は 猫 である ""; // の 意 味? System.out.println(s); C: user java>java L0107 猫 が 言 った" 我 輩 は 猫 である" 練 習 8 class L0108 { // 文 字 列 のコンカチネイト( 連 結 ) System.out.println(" 私 は " + " 松 本 清 張 の" + " 砂 の 器 " + "を 読 みました "); C: user java>java L0108 私 は 松 本 清 張 の 砂 の 器 を 読 みました 21

練 習 9 public class L0109 { 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); C: user java>java L0109 9/5=>1 9%5=>4 9/3=>3 9%3=>0 練 習 10 public class L0110 { 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); 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 練 習 11 class L0111 { // 単 項 演 算 子 int i = 10; i = -i; System.out.println("i= " + i); C: user java>java L0111 i= -10 練 習 12 class L0112 { // 型 の 違 う 精 度 が 異 なるもの 同 士 の 演 算 int i; float f; i = 10; f = 23.25f; System.out.println(i * f); C: user java>java L0112 232.5 課 題 :System.out.println(2+3+ ABC +4+5); ビックリするはず として 結 果 を 見 てみよう! 22

練 習 13 class L0113 { // 型 精 度 の 大 きい 方 への 変 換 byte b = 127; int i; i = b; System.out.println(i); 練 習 14 class L0114 { //この 間 違 いは 難 しいでしょう byte b; int i = 127; b = i; System.out.println(b); C: user java>java L0113 127 C: user java>javac L0114.java L0114.java:5: 精 度 が 落 ちている 可 能 性 検 出 値 : int 期 待 値 : byte b = i; ^ エラー 1 個 ヒント: 型 相 違 の 対 応 キャストとは 何 か? 練 習 15 class L0115 { // 練 習 14の 回 答 です byte b; int i = 127; b = (byte)i; System.out.println(b); C: user java>java L0115 127 練 習 16 class L0116 { // 型 精 度 の 小 さいほうへの 変 換 byte b; C: user java>java L0116 int i = 259; 3 b = (byte)i; System.out.println(b); // いくつの 値 が 表 示 されるか?なぜこの 値 が 表 示 されるか? 練 習 17 class L0117 { // 切 り 捨 て float f = 23.9999f; int i = (int)f; System.out.println(i); C: user java>java L0117 23 23

練 習 18 class L0118 { // 文 字 の 割 り 当 て char ch = 'A'; int i = ch; System.out.println(i); C: user java>java L0118 65 課 題 :'A'を'a'や'1'にすると どんな 値 が 返 ってくるか 確 かめましょう 練 習 19 class L0119 { byte b1 = 3; //おかしい エラーが 出 てしまった!どうしよう? byte b2 = 2; byte b3 = b1 * b2; System.out.println(b3); ヒント:キャスト 演 算 子 の 優 先 順 位 練 習 20 class L0120 { C: user java>javac L0119.java L0119.java:5: 精 度 が 落 ちている 可 能 性 検 出 値 : int 期 待 値 : byte byte b3 = b1 * b2; ^ エラー 1 個 // 配 列 を 宣 言 して 領 域 を 割 り 当 てる 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 L0120 myarray.length = 5 10 20-30 -40 50 24

練 習 21 class L0121 { // 配 列 の 初 期 化 // 配 列 を 宣 言 し, 領 域 を 割 り 当 て, 初 期 化 する int myarray[] = { 11, 22, -33, -44, 50 ; // 要 素 数 を 表 示 する System.out.println("myarray.length = " + myarray.length); // 要 素 を 表 示 する C: user java>java L0121 System.out.println(myarray[0]); myarray.length = 5 System.out.println(myarray[1]); 11 System.out.println(myarray[2]); 22 System.out.println(myarray[3]); -33 System.out.println(myarray[4]); -44 50 練 習 22 class L0122 { // 配 列 の 参 照 // 配 列 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 L0122 array2: -1.23 4.5 67.89 array1: -1.23 100.0 67.89 array2: -1.23 100.0 67.89 25

練 習 23 class L0123 { // 二 次 元 配 列 // 配 列 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 { // 二 次 元 配 列 の 初 期 化 // 配 列 を 宣 言 し, 領 域 を 割 り 当 て, 初 期 化 する 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 26

練 習 25 class L0125 { // 可 変 の 二 次 元 配 列 // 可 変 の 配 列 を 宣 言 し, 領 域 を 割 り 当 て, 初 期 化 する 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 27

2.クラス&メソッド SUNが 提 供 している Javaの 部 品 群 (API)の 使 い 方 を 知 る 注 : static は クラスに 所 属 していて インスタンスには 所 属 していない! この 意 味 はすぐには 判 らないかも 知 れませんが 徐 々に 慣 れてくるでしょう 日 本 語 訳 が 以 下 にある http:/ /java.sun.com/j2se /1.4/ja/docs/ja/ap i/index.htm l Java TM 2 Platform, Standard Edition, 1.4.0 API 仕 様 クラス:Mathの 例 28

クラス:Stringの 例 1.API の 見 方 2.コンストラクタ デストラクタ ファイナライザ 3.ガーベジコレクション main()メソッド 内 での メモリー リークの 防 止 策 4.NaN などの 特 殊 な 値 コンストラクタ メソッド 一 覧 ( 部 分 ) 1メソッドの 詳 細 29

練 習 1 class L0201 { //Math クラスの 静 的 メソッド 例 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 クラスの 静 的 変 数 System.out.println("Exp = " + Math.E); System.out.println("PI(π) = " + Math.PI); 練 習 3 class L0203 { // 円 の 公 式 を 使 った 計 算 例 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); 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 課 題 : 縦 10m 横 20mの 長 方 形 の 面 積 と 周 囲 の 長 さを 計 算 するプログラム を 作 成 しなさい 30

練 習 4 class L0204 { //String クラスのインスタンス メソッド(substring) 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) 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) String s = "128"; Integer obj = Integer.valueOf(s); int i = obj.intvalue(); i += 11; System.out.println(i); 練 習 7 class L0207 { //Integer クラスの 静 的 メソッド&インスタンス メソッド(valueOf) //( 書 き 方 のバリエーション) 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 31

練 習 8 class L0208 { // Binary(2 進 ) Hex(16 進 ) Octal(8 進 ) 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つのコンストラクタ 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 ではどうか? C: user java>java L0208 Binary => 1011 Hex => b Octal => 13 C: user java>java L0209 i1 = 5 i2 = 6 sum = i1 + i2 = 11 練 習 10 class L0210 { // 複 数 の 変 数 から 同 じオブジェクトを 参 照 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 L0210 5 5 5 obj3.intvalue * 3 = 15 32

練 習 11 class L0211 { // 同 じ 変 数 が 別 のオブジェクトの 参 照 に 乗 り 換 える 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); C: user java>java L0211 5 6 7 練 習 12 class L0212 { // 資 源 (メモリ)のゴミ 集 め:Garbage Collection Integer i = new Integer(5); System.out.println(i); i = new Integer(6); System.out.println ("この 時 点 で Integer(5)として 生 成 したオブジェクトは 再 利 用 可 能 となる"); System.out.println(i); C: user java>java L0212 5 この 時 点 で Integer(5)として 生 成 したオブジェクトは 再 利 用 可 能 となる 6 練 習 13 class L0213 { //Double // 変 数 を 宣 言 して 初 期 化 する 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 L0213 0/0=>NaN false true 1.7976931348623157E308 4.9E-324 Infinity -Infinity 11/0=>Infinity 33

練 習 14 class L0214 { //StringBuffer クラスのコンストラクタ //StringBuffer クラスのインスタンス メソッド(capacity, length) 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) 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 34

練 習 16 class L0216 { //String オブジェクトの 配 列 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]); C: user java>java L0216 5 String 0 String 1 String 2 null String 4 練 習 17 class L0217 { //String オブジェクトの 配 列 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); C: user java>java L0217 文 字 列 の 長 さの 平 均 = 21 練 習 18 class L0218 { // 混 合 オブジェクトの 配 列 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 L0218 4 Hello true a 45.67 35

練 習 19 class L0219 { //コマンドラインの 引 数 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]); C: user java>java L0219 abc 納 豆 豆 腐 args.length = 3 args[0] = abc args[1] = 納 豆 args[2] = 豆 腐 練 習 20 class L0220 { //コマンドラインの 引 数 : 整 数 を 入 力 // 最 初 の 整 数 を 取 得 する int i = Integer.parseInt(args[0]); // 次 の 整 数 を 取 得 する int j = Integer.parseInt(args[1]); // 合 計 を 表 示 する int sum = i + j; System.out.println(" 合 計 :" + sum); C: user java>java L0220 123 456 合 計 :579 練 習 21 class L0221 { //コマンドラインの 引 数 :double // 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); C: user java>java L0221 1.2 1.1 Product is 1.32 課 題 :コマンドラインから 半 径 を double 型 で 受 け 取 り 円 の 面 積 を 求 める プログラムを 作 成 しなさい 36

練 習 22 class L0222 { //System クラス: 配 列 一 部 分 コピー(arraycopy) 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]); C: user java>java L0222 array2: 0 0 0 2 3 4 5 6 0 0 練 習 23 class L0223 { //1970.1.1 0 時 (グリニッジ 標 準 時 )からの // 経 過 ミリ 秒 (currenttimemillis) 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 L0223 (1)1089969468905 (2)1089969468915 (3)1089969468915 (4)1089969468925 (5)1089969468925 (6)1089969468935 (7)1089969468935 (8)1089969468945 (9)1089969468945 (10)1089969468955 37

3. 制 御 文 & 加 減 算 関 係 論 理 演 算 子 if 文 for 文 加 算 :+ += 減 算 :- -= インクリメント:++ デクリメント:-- 大 小 比 較 :< > <= >= 等 しい:== 等 しくない:!= 論 理 積 :& && 論 理 和 : 排 他 論 理 和 :^ 否 定 :! 真 :true 偽 :fals e 38

練 習 1 class L0301 { // 平 方 根 を 求 める(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 { // 平 方 根 を 求 める(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 { // 分 母 が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 { //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 個 入 れてください"); 39 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

練 習 5 public class L0305 { //for( 初 期 値, ループ 継 続 判 定, 増 分 演 算 ) for(int num = 1; num < 11; num = num + 1) System.out.print(num + " "); System.out.println("terminating"); C: user java>java L0305 12345678910 terminating 練 習 6 public class L0306 { // 先 程 のプログラムと 実 行 結 果 が 違 う! for(int num = 11; num < 11; num = num + 1) System.out.print(num + " "); System.out.println("terminating"); C: user java>java L0306 terminating 練 習 7 public class L0307 { //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); C: user java>java L0307 積 =120, 和 =15 練 習 8 public class L0308 { // 増 分 が1とは 限 らない for(int i = 0; i < 101; i = i + 5) System.out.print(i + " "); System.out.println(""); 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 40

練 習 9 class L0309 { // 文 字 と 数 字 の 件 数 カウント 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 { // 素 数 の 判 定 // コマンドライン 引 数 を 変 換 する 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; C: user java>java L0309 abc 今 日 は 123!#$%'()=+-/ 数 字 は 3 個 文 字 は 6 個 他 の 文 字 は 12 個 // 結 果 を 表 示 する if(prime == true) System.out.println("The number is prime."); else System.out.println("The number is not prime."); C: user java>java L0310 17 The number is prime. C: user java>java L0310 121 The number is not prime. 課 題 : 与 えられた 正 の 整 数 の 因 数 ( 整 数 を 割 り 切 ることが 出 来 る 値 )を 全 て 表 示 するプロ グラムを 作 成 しなさい たとえば12の 場 合 2,3,4,6を 表 示 する 課 題 : 与 えられた 整 数 が 奇 数 か 偶 数 か 判 定 するプログラムを 作 成 しなさい 41

練 習 11 class L0311 { //インクリメント 演 算 子 : 演 算 子 が 後 int i, j; i = 10; j = i++; /* iとjとの 値 はどうなる? */ System.out.println("i= " + i + ", j= " + j); C: user java>java L0311 i= 11, j= 10 練 習 12 class L0312 { //インクリメント 演 算 子 : 演 算 子 が 前 int i, j; i = 10; j = ++i; /* iとjとの 値 はどうなる? */ System.out.println("i= " + i + ", j= " + j); C: user java>java L0312 i= 11, j= 11 練 習 13 class L0313 { // 文 字 数 カウント プログラムの 改 訂 版 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 L0313 deジャヴァ 456/ 数 字 は 3 個 です 文 字 は 6 個 です その 他 の 文 字 は 1 個 です 42

練 習 14 class L0314 { //インクリメント&デクリメントの 実 験 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 を 表 示 C: user java>java L0314 i=>0 ++i=>1 i++=>1 i=>2 --i=>1 i--=>1 i=>0 練 習 15 class L0315 { //バックスラッシュ:エスケープシーケンス 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 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 n( 改 行 )と b(バックスペース) の 働 きを 確 認 && 論 理 演 算 子 の 優 先 順 位 による 判 定 順 序 の 動 作 確 認 This is line threeexception in thread "main" java.lang.arrayindexoutofboundsexce ption: 1 at L0315.main(L0315.java:6) 43

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

練 習 18 class L0318 { // 論 理 演 算 子 の 実 験 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 45

4. 制 御 文 2&ビット 演 算 if 文 for 文 while 文 switc h 文 brea k 文 continu e 文 ビットの 論 理 積 :& ビットの 論 理 和 : ビットの 排 他 論 理 和 :^ ビットの 補 数 :~ n<<sの 値 は nのビット 位 置 を sビット 左 にシフトしたものとする n>>sの 値 は, nのビット 位 置 を 符 号 拡 張 を 伴 って sビット 右 にシフトしたものとする n>>> sの 値 は nのビット 位 置 をゼロ 拡 張 を 伴 って sビット 右 にシフトしたものとする 1. 手 続 き 型 言 語 の3 要 素 : 順 次 分 岐 繰 返 し 参 考 :HTML SQL LISP ML PROLOG など 2.ラベル 付 ブロックとケース 3.フローチャートと NS チャート 4.UML 46

練 習 1 class L0401 { //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); 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 練 習 2 class L0402 { //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"); 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 練 習 3 class L0403 { //for 初 期 値 を 別 から 与 える&decrement int i = Integer.parseInt(args[0]); for( ; i > 0; i--) System.out.print(i + " "); C: user java>java L0403 5 System.out.println(""); 54321 課 題 :argsが 無 い 場 合 に 例 外 処 理 が 発 生 する これを 回 避 するように 改 造 しなさい 47

練 習 4 class L0404 { //for 増 分 をブロック 内 部 で 処 理 int i; for(i = 0; i < 10; ) { System.out.print(i+" "); i++; System.out.print(" n"); C: user java>java L0404 0 1 2 3 4 5 6 7 8 9 練 習 5 class L0405 { //while int i = Integer.parseInt(args[0]); while (i > 0) { System.out.print(i + " "); i--; System.out.println(""); 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> 練 習 6 class L0406 { // 母 音 (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 L0406 Hello,ladies,and,gentlemen! 母 音 の 数 = 9 48

練 習 7 class L0407 { // 素 数 の 洗 い 出 し //(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(""); C: user java>java L0407 2 3 5 7 11 13 17 19 23 29 31 37 41 43 課 題 :count の 上 限 を 14 ではなく args から 入 力 させるように 改 造 しなさい args から 入 力 する 値 を 変 えて 実 行 し その 時 間 を 計 測 してみなさい 練 習 8 class L0408 { //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)); C: user java>java L0408 AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZAABBCCDDEEFFGGHHIIJJKKLLM MNNOOPPQQRRSSTTUUVVWWXXYYZZAABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXX YYZZ 課 題 : 出 力 を 以 下 のように A~Z 毎 に 改 行 するように このプログラムを 改 造 しなさい C: user java>java L0408 AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ 49

練 習 9 class L0409 { //break によるループ 脱 出 1 int i; for (i = 1; i < 50; i++) { System.out.println(i); if (i == 5) break; C: user java>java L0409 1 2 3 4 5 練 習 10 class L0410 { //break によるループ 脱 出 2 for (int i = 0; i < args.length; i++) { if (args[i].startswith("$")) { System.out.println(args[i]); break; C: user java>java L0410 a$ 1$ $3 $4 b$ $3 練 習 11 class L0411 { //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); 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 練 習 12 class L0412 { //continue によるブロック 先 頭 への 戻 り for (int x = 0; x < 7; x++) { if (x < 3) continue; System.out.println(x); C: user java>java L0412 3 4 5 6 50

練 習 13 class L0413 { // 乱 数 利 用 による break&continue の 実 験 int i = 0; while (true) { C: user java>java L0413 double d = Math.random(); d=0.7585014127118366,i=0 if (d <.2 d >.8) d=0.570464848440942,i=1 continue; d=0.35131334509029166,i=2 System.out.println("d=" + d + ",i=" + i); d=0.6684128798602036,i=3 if (++i == 10) d=0.5484472418258748,i=4 break; 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 課 題 : if (d <.2 d >.8) continue; の 二 行 をコメントにして 実 行 して 結 果 を 比 べなさい 練 習 14 class SwitchDemo { //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 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 一 から 四 以 外 の 数 字 51

練 習 15 class L0415 { //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 { //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 { //コンパイル エラーの 文 言 を 確 認 しなさい int i = 1; switch (i) { case i: System.out.println("1"); 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>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>javac L0417.java L0417.java:5: 定 数 式 が 必 要 です case i: ^ エラー 1 個 52

練 習 18 class L0418 { //ビット 演 算 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)); 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 練 習 19 class L0419 { //ビット 演 算 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 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 L0419 53

練 習 20 class L0420 { // 整 数 の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() (i==0) if sb.append("00000000"); //ゼロの 場 合 16 進 全 桁 ゼロ 表 示 の 文 字 列 を 返 す else / 頭 ゼロを { / 空 白 にしない すべて 同 じ 桁 にあわせる if (i == 0xffffff ) sb.append( Integer.toHexString(i)) ; if((i else&0xf0000000 )!=0)sb.append( Integer.to ; if((i else 0xff000000) &!=0)sb.append("0" Integer.toHexString(i + ; if((i else 0xfff00000) &!=0)sb.append("00" Integer.toHexString(i + ; if((i else 0xffff0000) &!=0)sb.append("000" Integer.toHexString(i + ; if((i else 0xfffff000) &!=0)sb.append("0000" Integer.toHexString(i + ; if((i else 0xffffff00) &!=0)sb.ap pend("00000" Integer.toHexString(i + ; if((i else 0xfffffff0) &!=0)sb.append("000000" Integer.toHexString(i + ; else +Integer.toHexString(i sb.append("000 ; return sb.tostring() ; C: user java>java L0420 s s -->00000000 -->ffffffff s s -->0000010f -->271 練 習 21 class L0421 { //アルゴリズムの 工 夫 練 習 20 と 同 一 機 能 // 整 数 の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 L0421 s -->00000000 s -->ffffffff s -->0000010f s -->271 54

練 習 22 class L0422 { //ビット 演 算 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)); C: user java>java L0422 255 System.out.println("s 1 ->"+(s 1)); s -->000000ff 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)); 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 55

5.クラスの 作 成 クラス 宣 言 クラス 宣 言 (class declaratio n) ClassDeclaration : ClassModifier class Identifie rsupe r opt Interface s opt ClassBod y s opt クラス 修 飾 子 クラス 宣 言 は,クラス 修 飾 子 (class ClassModifiers : ClassModifie r modifiers )を 含 んでよい ClassModifier sclassmodifi ClassModifier: f one o publi cabstract l fina メソッドのシグネチャ メソッドの シグネチャ(signature )は,メソッドの 名 前 並 びにメソッドに 対 する 形 式 仮 引 数 の 個 数 及 び 型 で 構 成 する クラスは, 同 じシグネチャをもつ 二 つのメソッドを 宣 言 して はならない そうでなければ,コンパイル 時 エラーが 発 生 する メソッド 修 飾 子 MethodModifiers : r MethodModifie MethodModifier smethodmodifie r MethodModifier: f one o public protected e privat abstract static final e synchronized nativ 56

練 習 1 class Point3D { //このクラスは 独 立 したクラスでしょうか? double x; double y; double z; Object の 子 供 です class L0501 { 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); C: user java>java L0501 p.x = 1.1 p.y = 3.4 p.z = -2.8 練 習 2 class Point3D { double x; double y; double z; class L0502 { //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 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 57

練 習 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 { //コンストラクタの 働 きを 確 認 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 58

練 習 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 { //コンストラクタのオーバーロード //シグニチャの 概 念 を 確 認 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 59

練 習 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 { 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 { //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 60

練 習 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 { 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 61

練 習 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 { 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); 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 練 習 9 class Thing { static int count; String name; // 静 的 変 数 の 参 照 実 験 Thing(String name) { this.name = name; ++count; class L0509 { 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 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 62

練 習 10 class X { static int array[]; static { // 静 的 初 期 化 ブロックの 例 array = new int[6]; for (int i = 0; i < 6; i++) array[i] = i; class L0510 { 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 { System.out.println(" 代 金 は "+(int)taxcalc.solve(2000)+" 円 です"); 練 習 12 class MyObject { // 変 数 のスコープ & 隠 蔽 static short s = 400; // 静 的 変 数 C: user java>java L0510 0 1 2 3 4 5 C: user java>java L0511 代 金 は 2100 円 です 課 題 : 浮 動 小 数 点 数 値 を 金 銭 の 勘 定 に 用 いてよいか? 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); C: user java>java L0512 s = 400 i = 200 class L0512 { MyObject.s = 400 s = 30 MyObject myobject = new MyObject(); i = 10 myobject.f(); d = 1.0E100 課 題 :// System.out.println("MyObject.i = " + MyObject.i); 上 記 コメント 行 を 生 かすとどうなるか 確 認 しなさい 63

練 習 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 { ClassX classz = new ClassX(); classz.f(); C: user java>java L0513 100 1000 練 習 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 { ClassY classzz = new ClassY(); classzz.f(); C: user java>java L0514 1000 0 1 2 3 4 1000 64

練 習 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 { 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 65

練 習 16 class L0516 { //call-by-value( 副 作 用 なし):int 変 数 //call-by-reference( 副 作 用 ): 配 列 とオブジェクト // 変 数 を 初 期 化 する 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 66

練 習 17 class L0517 { //call-by-value( 副 作 用 なし): 配 列 // 変 数 を 初 期 化 する 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(""); C: user java>java L0517 11 12 13 14 15 21 22 23 24 25 11 12 13 14 15 練 習 18 class L0518 { //call-by-value( 副 作 用 なし)2 // 変 数 を 初 期 化 する StringBuffer sb = new StringBuffer("abcde"); // 変 数 を 表 示 する System.out.println(sb); // メソッドを 呼 び 出 す a(sb); // もう 一 度 変 数 を 表 示 する System.out.println(sb); C: user java>java L0518 abcde abcde public static void a(stringbuffer sb) { sb = new StringBuffer("wxyz"); 67

練 習 19 class L0519 { //call-by-value( 副 作 用 なし) //call-by-reference( 副 作 用 ) 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); C: user java>java L0519 sba = aaaaa sbb = bbbbb sba = aaaaa sbb = bbbbbddddd 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 { 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 L0520 i = 5; s = Hello; d = 3.4E100 i = 5; s = Hello; d = 3.4E100 i = 3; s = New string; d = 6.02E23 課 題 : 財 布 クラスを 作 成 しなさい 持 ち 主 残 高 入 出 金 などが 出 来 るように 考 える 68

参 考 外 部 入 力 部 品 の 例 import java.io.*; public class Typein { public static void displayprompt(string prom pt) { 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 { onecha r = System.in.read(); if (onechar < 0 (c har)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()).i ntvalue(); 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(prom pt); try { return Double.valueOf(i nstring().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 69

6. 継 承 クラス java.lang.object がルートクラス 親 子 関 係 のクラス(スーパクラス サブクラス)の 例 class Point { int x, y; final class ColoredPoint extends Point { int colo class olored3dpoint C extends ColoredPoint r { int z; この 例 は, 次 の 関 係 をもつ クラス Poin tは,java.lang.objec tの 直 接 的 サブクラスとする クラス java.lang.objec tは,クラス Poin tの 直 接 的 スーパクラスとする クラス ColoredPoin tは,クラス Poin tの 直 接 的 サブクラスとする クラス Poin tは,クラス ColoredPoin tの 直 接 的 スーパクラスとする クラス Colored3dPoin tの 宣 言 は,fina lクラス ColoredPoin tを 拡 張 しようとしているの で,コンパイル 時 エラーが 発 生 する サブクラス(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 { この 例 での 関 係 は, 次 のとおり クラス Poin tは,クラス ColoredPoin tのスーパクラスとする クラス Poin tは,クラス Colored3dPoin tのスーパクラスとする クラス ColoredPoin tは,クラス Poin tのサブクラスとする クラス ColoredPoin tは,クラス Colored3dPoin tのスーパクラスとする クラス Colored3dPoin tは,クラス ColoredPoin tのサブクラスとする クラス Colored3dPoin tは,クラス Poin tのサブクラスとする 70

クラスは,その 直 接 的 スーパクラスから,クラス 内 でコードにアクセス 可 能 であり,クラ ス 内 の 宣 言 によって 上 書 き 又 は 隠 ぺいされていないスーパクラスのすべてのメソッドを (abstrac tであってもなくても) 継 承 (inherits )する クラスがインスタンスメソッドを 宣 言 している 場 合,そのメソッド 宣 言 は,そのクラスの スーパクラス 内 で 同 じシグネチャをもつ 任 意 及 びすべてのメソッドを 上 書 き(override )す ると 呼 ぶ 上 書 きされなければ,そのスーパクラスのメソッドは,クラス 内 のコードから アクセス 可 能 とする また,クラスで 宣 言 されたメソッドが abstrac tでなければ,そのメ ソッドの 宣 言 は,クラスのスーパクラスで 同 じシグネチャをもつ 任 意 及 びすべての abstrac t 宣 言 のメソッドを 実 装 (implement )すると 呼 ぶ 実 装 されなければ,そのスー パクラスのメソッドは,クラス 内 のコードからアクセス 可 能 とする クラスの 二 つのメソッド( 両 方 とも 同 じクラスで 宣 言 されているか, 両 方 とも 一 つのクラス から 継 承 されているか, 又 は 一 方 は, 宣 言 され 他 方 は 継 承 されているか,にかかわらず)が 同 じ 名 前 をもつが 異 なるシグネチャをもてば,メソッド 名 は,オーバロード(overloaded ) されたと 呼 ぶ 71

練 習 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 { 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); C: user java>java L0601 hi.f = 4.567 hi.sb = abcde hi.s = 今 日 は 暑 い hi.i = 41 練 習 2 class E { int x; // 継 承 の 打 消 し 先 祖 の 変 数 を 隠 す class F extends E { String x; class L0602 { 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 L0602 f.x = ここはどこ? e.x = 45 72

練 習 3 class P { // 静 的 変 数 も 継 承 の 打 消 し 先 祖 の 変 数 を 隠 す static int x; class Q extends P { static String x; class L0603 { 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); C: user java>java L0603 p.x = 55 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 { M200 m200 = new M200(); m200.display(); C: user java>java L0604 i = 200 super.i = 100 73

練 習 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 { C1 obj = new C1(); obj.hello(); C: user java>java L0605 私 は C1 練 習 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 { A2 obj = new C2(); obj.hello(); C: user java>java L0606 私 は C2 74

練 習 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 { 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: 今 晩 は 75

練 習 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 { 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 76

練 習 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 { 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 77

練 習 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 { 形 形 のオブジェ = new 円 (); System.out.println("オブジェクト->"+ 形 のオブジェ); 形 のオブジェ. 表 示 (); 形 のオブジェ = new 四 角 (); System.out.println("オブジェクト->"+ 形 のオブジェ); 形 のオブジェ. 表 示 (); 形 のオブジェ = new 三 角 (); System.out.println("オブジェクト->"+ 形 のオブジェ); 形 のオブジェ. 表 示 (); C: user java>java L0610 オブジェクト-> 円 @11a698a 円 形 オブジェクト-> 四 角 @107077e 四 角 形 オブジェクト-> 三 角 @7ced01 三 角 形 練 習 11 final class V1 { //キーワード final は サブクラスを 持 てない( 拡 張 できない) //つまり このプログラムをコンパイルすると class V2 extends V1 { class L0611 { V1 obj = new V1(); C: user java>javac L0611.java L0611.java:4: final V1 からは 継 承 できません class V2 extends V1 { ^ エラー 1 個 78

練 習 12 class L { // 定 数 を 定 義 するために キーワード final を 変 数 の 修 飾 に 使 う static final double tax = 0.05; static final String taxname=" 消 費 税 "; class L0612 { 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; C: user java>java L0612 二 千 円 の 本 の 消 費 税 は 100 円 です private Person() { class L0613 { // 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 L0613 太 郎 30 79

練 習 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 { 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 80

練 習 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 { 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 81

練 習 16 class L0616 {//オブジェクトやクラスでの tostring()メソッドのオーバーライド(1) 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); C: user java>java L0616 class java.lang.integer class java.lang.string 練 習 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 { Hoge hogehoge = new Hoge(23); System.out.println(hogehoge); 練 習 18 class L0618 { // 何 が 表 示 されるでしょううか?(3) 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 L0617 Hoge: i = 7; j = 23 C: user java>java L0618 java.lang.integer java.lang.number 82

練 習 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; 83

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; // 領 域 を 宣 言 して 割 り 当 てる 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 C: user java>java L0619 ThinkPadA30null: tp123453.4モバイル インテル Celeronプロセッサ 1.20GHz IBMNetVistaA30null: dt012347.4インテル Pentium4プロセッサ 1.80 GHz ThinkPadX30null:tp123461.7モバイル インテル Pentium IIIプロセッサ 1.20GHz-M ThinkPadX30null: tp123471.7モバイル インテル Pentium IIIプロセッサ 1.20GHz-M ThinkPadA30null: tp123483.4モバイル インテル Celeronプロセッサ 1.20GHz IBMNetVistaA30null: dt012357.4インテル Pentium4プロセッサ 1.80 GHz 実 行 結 果 2 C: user java>javal0619 ThinkPadA30 : tp123453.4モバイル インテル Celeronプロセッサ 1.20GHz IBMNetVistaA30 : dt012347.4インテル Pentium4プロセッサ 1.80 GHz ThinkPadX30 : tp123461.7モバイル インテル Pentium IIIプロセッサ 1.20GHz-M ThinkPadX30 : tp123471.7モバイル インテル Pentium IIIプロセッサ 1.20GHz-M ThinkPadA30 : tp123483.4モバイル インテル Celeronプロセッサ 1.20GHz IBMNetVistaA30 : dt012357.4インテル Pentium4プロセッサ 1.80 GHz 84

7.インターフェースとパッケージ インタフェース 宣 言 は,メンバを 定 数 及 び 抽 象 メソッドとする 新 しい 参 照 型 を 導 入 する この 型 は 実 装 をもたないが, 関 係 ないクラスがその 抽 象 メソッドに 実 装 を 提 供 することで, そのインタフェースを 実 装 できる Java プログラムは,パッケージの 集 合 で 構 成 する 各 パッケージは, 型 に 対 する 名 前 の 独 自 の 集 合 をもつが,これが 名 前 の 衝 突 を 防 ぐのを 支 援 する 型 は,public と 宣 言 した 場 合 に 限 り,それを 宣 言 しているパッケージの 外 部 からアクセス 可 能 とする パッケージの 名 前 付 けの 構 造 は 階 層 的 とする 一 つのコンパイル 単 位 は, 次 の 三 つの 部 分 からなる それぞれは 省 略 可 能 とする packag e 宣 言 コンパイル 単 位 が 属 するパッケージの 完 全 限 定 名 を 与 える impor t 宣 言 他 のパッケージの 型 を 単 純 名 で 参 照 可 能 とする クラス 及 びインタフェース 型 の 型 宣 言 小 規 模 なプログラム 及 び 暫 定 的 な 開 発 では,パッケージに 名 前 を 付 けなかったり, 単 純 名 を 用 いることもできるが,Javaコードを 広 く 配 布 する 場 合 は, 一 意 なパッケージ 名 を 選 択 することが 望 ましい これによって, 二 つの 開 発 グループが 偶 然 同 じパッケージ 名 を 使 用 し,それらのパッケージを 後 に 一 つのプログラムで 使 用 する 場 合 に 発 生 する 名 前 の 衝 突 を 防 ぐことができる 85

練 習 1 import java.text.decimalformat; class L0701 { 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))); C: user java>java L0701 1.72 85.0 体 重 =85.00 身 長 =1.72 肥 満 度 =28.7 練 習 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; 86

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 { 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 のインスタンスです 87

練 習 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 { 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); // 同 一 クラス 以 外 不 可 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 // コンパイルは pの 親 フォルダで javac p *.java とコマンドを 入 れる // 実 行 は 同 じ 位 置 で java p/c とコマンドを 入 れる java p C は 駄 目! 88

練 習 4 // pフォルダの 兄 弟 としてqフォルダを 作 成 し そこに 以 下 のプログラムを 格 納 する ------------------------------PackageImport.java----------------------------- package q; import p.*; class L0704 extends A { 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 89

パッケージの 参 考 情 報 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 円 持 っている 90

------------------------------------------------------------------- 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 円 持 っている 91

=================================================================== //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()+" 円 持 っている"); 92

8. 例 外 Javaプログラムが,Java 言 語 の 意 味 制 約 に 違 反 するとき,Java 仮 想 計 算 機 は,このエラ ーを 例 外 (exception )としてプログラムに 知 らせる それらの 違 反 の 例 として, 配 列 境 界 の 外 でのインデクス 付 けがある あるプログラミング 言 語 及 びその 処 理 系 には,プログラム を 強 制 的 に 終 了 することによって,それらのエラーに 対 応 するものがある 他 のプログラ ム 言 語 では, 処 理 系 が 任 意 又 は 予 測 不 能 な 方 法 で 対 応 することを 許 しているものもある これらの 方 法 のいずれも,Javaの 設 計 目 標, 移 植 性 及 び 頑 健 性 とは 適 合 しない 代 わりに, Javaは, 意 味 制 約 に 違 反 したとき, 例 外 を 投 げ, 例 外 が 発 生 した 点 からプログラマが 指 定 可 能 な 点 への 非 局 所 的 な 制 御 の 移 動 を 引 き 起 こすことを 規 定 している 例 外 は,それが 発 生 した 点 から 投 げられる(thrown )と 言 い, 制 御 が 移 動 する 点 で 捕 捉 される(caught )と 言 う Javaプログラムは,thro w 文 を 使 用 して, 明 示 的 に 例 外 を 投 げることもできる これは, 普 通 なら 負 の 値 を 期 待 しないところで 整 数 値 -1のような 予 期 しない 値 を 返 し,エラー 条 件 を 処 理 する 古 風 な 方 式 の 代 替 手 段 を 提 供 する 経 験 的 に,その 予 期 しない 値 は, 呼 び 出 し 元 で 無 視 されるか 又 は 検 査 されないことが 多 いことが 知 られており, 頑 健 的 でない 若 しく は 望 ましくない 振 舞 い 又 はその 両 方 をプログラムにもたらす すべての 例 外 は,クラス Throwabl eのインスタンス 又 はそのサブクラスの 一 つによって 表 現 される それらのオブジェクトは, 例 外 が 発 生 する 点 からそれを 捕 捉 するハンドラへと 情 報 を 運 ぶために 使 用 される ハンドラは,try 文 の catc h 節 によって 構 築 される 例 外 を 投 げる 過 程 において,Java 仮 想 計 算 機 は, 現 在 のスレッド 内 で 開 始 はしたが 完 了 してい ない, 任 意 の 式, 文,メソッド 及 びコンストラクタ 呼 出 し, 静 的 初 期 化 子 並 びにフィール ド 初 期 化 式 を, 一 つずつ 中 途 完 了 する この 処 理 は,その 例 外 のクラス 又 はその 例 外 のク ラスのスーパクラスの 名 前 を 指 定 することによってその 特 定 の 例 外 を 扱 うことを 示 すハン ドラを 見 つけるまで 続 けられる 例 外 の 原 因 例 外 は, 次 の 三 つの 理 由 (reasons )の 内 の 一 つによって 投 げられる 異 常 な 実 行 状 態 が,Java 仮 想 計 算 機 によって 同 期 的 に 検 出 された その 条 件 は, 次 の 理 由 で 発 生 する o 式 の 評 価 が,Java 言 語 の 正 常 な 意 味 規 則 に 違 反 した 例 えば,ゼロによ る 除 算 など o Javaプログラムのロード 又 はリンクの 部 分 で,エラーが 発 生 した o 資 源 の 限 界 を 超 過 した 例 えば,あまりにも 多 くのメモリを 使 用 したなど 93

Javaコードが,thro w 文 を 実 行 した 非 同 期 な 例 外 が, 次 のいずれかの 理 由 で 発 生 した o o クラス Threa dのメソッド stopを 呼 び 出 した 仮 想 計 算 機 内 で 内 部 エラーが 発 生 した 例 外 は,クラス Throwabl eのインスタンス 及 びそのサブクラスのインスタンスによって 表 現 される これらのクラスをまとめて, 例 外 クラス(exception es)とする class パッケージ java.lan gの 標 準 実 行 時 例 外 定 義 ArithmeticExceptio n: 除 数 ゼロでの 整 数 除 算 演 算 などの 例 外 的 な 計 算 状 況 が 発 生 した ArrayStoreExceptio n: 配 列 の 要 素 の 型 と 代 入 互 換 でないクラスの 値 を 配 列 要 素 に 格 納 しようとした ClassCastExceptio n:オブジェクトへの 参 照 を 不 適 切 な 型 へキャストしようとした IllegalArgumentExceptio n:メソッドに, 不 当 若 しくは 不 適 切 な 引 数 が 渡 された, 又 はメソッドが 不 適 切 なオブジェクトで 呼 び 出 された このクラスは 次 のサブクラ スを 含 む o o IllegalThreadStateExceptio n: 要 求 された 操 作 に 対 してスレッドが 適 切 な 状 態 になかった NumberFormatExceptio n:strin gを 数 値 型 の 値 へ 変 換 しようとしたが,そ の Strin gが 適 切 な 形 式 をもっていなかった IllegalMonitorStateExceptio n:スレッドが,ロックされていないオブジェクトを 待 機 している 他 のスレッドを, 待 機, 又 は 通 知 しようとした IndexOutOfBoundsExce ption:( 配 列, 文 字 列 若 しくはベクトルを 参 照 する)ある 種 のインデクス, 又 は 二 つのインデクス 値 若 しくは 一 つのインデクス 及 び 一 つの 長 さ のいずれかで 規 定 される 範 囲 が, 領 域 を 越 えた NegativeArraySizeExceptio n: 負 の 長 さで 配 列 を 生 成 しようとした NullPointerExceptio n:オブジェクト 参 照 を 要 求 されるところで, 空 参 照 をしよう とした SecurityExceptio n:セキュリティ 違 反 を 検 出 した パッケージ java.uti lの 付 加 的 な 標 準 非 検 査 実 行 時 例 外 定 義 java.util.emptystackexceptio n: 空 スタックの 要 素 にアクセスしようとした java.util.nosuchelementexceptio n: 空 ベクトルの 要 素 にアクセスしようとした 94

練 習 1 class L0801 { // 何 が 起 こるか 行 番 号 の 表 示 のされかたを 確 認 すること 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); 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) 練 習 2 class L0802 { 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 C: user java>java L0802 10 2 3.java L0802 10 a Before Division 4.java L0802 10 5 5.java L0802 aa After Division 6.java L0802 Finally block 95

練 習 3 class L0803 { 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 { 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 例 外 処 理 後 これが 動 く 96

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 97

練 習 5 class L0805 { // 二 重 に 例 外 処 理 が 重 なった 場 合 の 動 きを 確 認 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"); 98

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"); 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 練 習 6 class L0806 { //コンパイル 時 に 引 っかかるハズ 何 故 か?どうすれば 良 いか? try { System.out.println("Try Block"); catch (Exception e) { System.out.println("Exception"); catch (ArithmeticException e) { System.out.println("ArithmeticException"); C: user java>javac L0806.java L0806.java:9: 例 外 java.lang.arithmeticexception はすでにキャッチされています catch (ArithmeticException e) { ^ エラー 1 個 99

練 習 7 class L0807 { // throw で 自 分 から 例 外 を 発 生 させることができる 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"); 100

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 101

練 習 8 class L0808 { // 自 分 で 例 外 を 発 生 させる finally が 動 くか 確 認 すること 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 102

練 習 9 class L0809 { 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 103

練 習 10 import java.util.*; class L0810 { // 自 分 で 独 自 の 例 外 を 作 成 することが 出 来 る! 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) 104

9.マルチスレッドプログラミング これまでの 記 述 の 大 半 は, 文 又 は 式 を, 一 度 に 一 つ,つまり 一 つの スレッド(thread )で 実 行 する Javaコードの 振 舞 いだけに 関 係 していたが,Java 仮 想 計 算 機 は, 一 度 に 多 数 の スレッドを 実 行 することができる これらのスレッドは, 共 有 主 メモリに 存 在 する Java の 値 及 びオブジェクトを 操 作 する Javaコードを 独 立 して 実 行 する 複 数 のスレッドは, 複 数 のハードウェアプロセッサを 搭 載 したり, 一 つのハードウェアプロセッサを 時 分 割 した り, 又 は 複 数 のハードウェアプロセッサを 時 分 割 することによって, 実 現 してもよい Javaは,スレッドの 並 行 活 動 を 同 期 化 する(synchronizing ) 機 構 を 提 供 することによっ て, 並 行 的 だが 決 定 論 的 な 振 舞 いを 示 すプログラムを 支 援 する スレッドを 同 期 化 するた めに,Javaでは,モニタ(monitor )を 使 用 する モニタは,モニタが 保 護 するコード 領 域 を 一 度 にただ 一 つのスレッドだけが 実 行 可 能 にするための 高 度 な 機 構 とする モニタの 振 舞 いは,ロック(lock )によって 表 現 する 各 オブジェクトには, 一 つのロックが 存 在 する synchronize d 文 は,マルチスレッド 操 作 にだけ 関 係 する 次 の 二 つの 特 別 な 動 作 を 実 行 する オブジェクトへの 参 照 の 計 算 後 及 びその 本 体 の 実 行 前 に,そのオブジェクトに 関 連 する ロック 設 定 をする オブジェクト 本 体 の 実 行 が 正 常 完 了 又 は 中 途 完 了 した 後,そのロックの ロック 解 除 (unlock )をする 便 宜 上,メソッドを synchronize d 宣 言 してよい このようなメソッドは,その 本 体 が synchronize d 文 に 含 まれているかのように 動 作 する クラス Objec tのメソッド wait, notif y, 及 び notifyal lは, 一 つのスレッドから 他 の スレッドへの 効 率 的 な 制 御 の 転 送 を 提 供 する スレッドは, 計 算 に 手 間 のかかる, 単 なる スピン ( 内 部 状 態 の 変 化 の 有 無 を 知 るために,オブジェクトのロック 設 定 とロック 解 除 を 繰 り 返 すこと)ではなく,むしろ 他 のスレッドが notif yを 使 って 目 覚 めさせるとき まで waitでそれ 自 体 を 一 時 停 止 させることができる これは,スレッドが( 共 通 の 資 源 を 共 有 するとき 競 合 しないようにする) 相 互 排 他 関 係 よりもむしろ,( 共 通 の 目 標 につい て 積 極 的 に 協 力 する) 生 産 者 - 消 費 者 関 係 をもつ 状 況 に, 特 に 適 している スレッドは,コードを 実 行 する 際 に 一 連 の 動 作 を 実 行 する スレッドは, 変 数 の 値 を 使 用 (use )したり, 又 は 変 数 に 新 しい 値 を 代 入 (assign )してよい (その 他 の 動 作 として, 算 術 演 算, 条 件 検 査, 及 びメソッド 呼 出 しを 含 むが,これらは, 直 接 には 変 数 に 関 係 しな い ) 複 数 の 並 行 スレッドが, 一 つの 共 有 変 数 に 関 して 動 作 すれば,その 変 数 への 動 作 が タイミング 依 存 な 結 果 となることがある このタイミング 依 存 性 は, 並 行 プログラミング 105

固 有 のもので,Javaにおいて,この 規 格 だけではプログラムの 実 行 結 果 が 決 定 できない 数 少 ない 部 分 の 一 つとなる 各 スレッドは, 作 業 メモリをもち,その 中 に,すべてのスレッドが 共 有 する 主 メモリ 上 の 変 数 値 の 複 製 を 保 持 してもよい 共 有 変 数 にアクセスするためには,スレッドは, 通 常 ま ずロックを 取 得 し,その 作 業 メモリをフラッシュする これは, 共 有 値 が 共 有 主 メモリか らスレッドの 作 業 メモリにロードされることを 保 証 する スレッドがロックを 解 除 すると き, 作 業 メモリに 保 持 された 値 が 主 メモリに 書 き 込 まれることを 保 証 する ここでは, 特 定 の 低 水 準 の 動 作 に 関 する,スレッドの 主 メモリとの 相 互 作 用, 及 びスレッ ド 同 志 の 相 互 作 用 について 規 定 する これらの 動 作 が 発 生 してもよい 順 序 についての 規 則 が 存 在 する これらの 規 則 は,Javaの 任 意 の 実 装 への 制 約 を 与 え,Javaプログラマは, 規 則 に 依 存 することで 並 行 Jav aプログラムの 可 能 な 動 作 を 予 測 できる しかしながら, 規 則 では, 意 図 的 に 開 発 者 へ 自 由 裁 量 を 与 えている その 意 図 は, 並 行 コードの 実 行 速 度 及 び 効 率 の 大 幅 向 上 を 可 能 とする 標 準 的 なハードウェア 及 びソフトウェア 技 術 を 受 け 入 れる ためである 規 則 の 要 点 を 次 に 示 す 同 期 化 の 構 文 を 正 しく 使 用 することが, 一 つのスレッドから 他 のスレッドへの, 共 有 変 数 を 介 する 値 の 転 送 又 は 値 の 設 定 を 信 頼 できるものにする スレッドが 変 数 の 値 を 使 用 する 場 合,それが 取 得 する 値 は, 実 際 にそのスレッド 又 は 他 のスレッドによって 変 数 に 記 憶 した 値 とする そのプログラムが, 適 正 な 同 期 化 コードを 含 まないとしてもこれは 成 り 立 つ 例 えば, 二 つのスレッドが 異 なるオ ブジェクトへの 参 照 を 同 じ 変 数 に 記 憶 した 場 合, 結 果 として,その 変 数 は,いずれ かのオブジェクトへの 参 照 を 含 み, 他 のオブジェクトの 参 照 又 は 壊 れた 参 照 値 を 含 むことはない (long 値 及 び doubl e 値 には, 特 別 な 例 外 が 存 在 する を 参 照 す ること ) 明 示 的 な 同 期 化 処 理 がない 場 合,Java 処 理 系 は, 予 期 しない 順 序 で 主 メモリを 更 新 してもよい したがって, 予 想 に 反 する 動 作 を 回 避 したいプログラマは, 明 示 的 な 同 期 化 を 使 用 しなければならない 106

練 習 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 { ThreadX tx = new ThreadX(); tx.start(); C: user java>java L0901 Threadの 実 験 sleep=1000 Thread の 実 験 sleep=2000 Thread の 実 験 sleep=3000 練 習 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{ RunnableY ry = new RunnableY(); Thread t = new Thread(ry); t.start(); C: user java>java L0902 Runnable の 実 装 sleep=1000 Runnable の 実 装 sleep=2000 Runnable の 実 装 sleep=3000 107

練 習 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 { 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 108

練 習 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; 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 109

練 習 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 { 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 110

付 録 練 習 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(); 111

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(""); 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 { Queue queue = new Queue(); new Producer(queue).start(); new Consumer("ConsumerA", queue).start(); new Consumer("ConsumerB", queue).start(); new Consumer("ConsumerC", queue).start(); 112

C: user java>java L0906 ----------sleep--- count=0, r=1 ConsumerA: 0 ----------sleep--- count=0, r=2 ConsumerB: 1 ----------sleep--- count=0, r=3 ConsumerC: 2 ----------sleep--- ----------sleep--- count=0, r=4 ConsumerA: 3 count=0, r=5 ConsumerA: 4 ----------sleep--- count=0, r=6 ConsumerB: 5 ----------sleep--- count=0, r=7 ----------sleep--- ConsumerC: 6 ----------sleep--- count=0, r=8 ConsumerA: 7 ----------sleep--- count=0, r=9 ConsumerA: 8 ----------sleep--- count=0, r=0 ConsumerB: 9 ----------sleep--- count=0, r=1 ConsumerC: 10 ----------sleep--- count=0, r=2 ConsumerA: 11 ----------sleep--- count=0, r=3 ConsumerB: 12 C: user java>java L090 ----------sleep--- ----------sleep--- count=0, r=1 ConsumerA: 0 ----------sleep--- count=0, r=2 ConsumerA: 1 ----------sleep--- count=0, r=3 ConsumerB: 2 ----------sleep--- count=0, r=4 ConsumerB: 3 ----------sleep--- count=0, r=5 ConsumerC: 4 count=0, r=6 ----------sleep--- ConsumerA: 5 ----------sleep--- count=0, r=7 ConsumerB: 6 ----------sleep--- count=0, r=8 ConsumerC: 7 ----------sleep--- count=0, r=9 ConsumerA: 8 ----------sleep--- count=0, r=0 ConsumerB: 9 count=0, r=1 ----------sleep--- ConsumerC: 10 ----------sleep--- count=0, r=2 ConsumerA: 11 ----------sleep--- count=0, r=3 ConsumerB: 12 113

補 足 1:GUI プログラミング 1. 実 行 結 果 2.コンパイルと 実 行 操 作 課 題 2 章 の 練 習 5(L0205)の 下 に 書 かれている 課 題 を この 画 面 にも 表 示 するよ うにしましょう 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); 114

ボタン と 背 景 色 と ラベルのテキスト 内 容 変 更 1. 実 行 結 果 2.コンパイルと 実 行 操 作 ラベルのテキ スト 書 き 換 え の 前 準 備 二 個 のボタ ンの 識 別 ラベルの テキスト 入 れ 替 え 背 景 色 の 識 別 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); 注 :container.xxx は getcontentpane().xxx と 書 ける 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); 課 題 背 景 色 の 初 期 値 は 白 とする ボタン 押 下 時 に 以 下 のよう に 背 景 を 変 更 する 1. 白 なら 黄 色 に 変 える 2. 黄 色 なら 青 に 変 える 3. 青 なら 赤 に 変 える 4. 赤 なら 黄 色 に 変 える 115