Microsoft PowerPoint - lec06 [互換モード]

Similar documents
Microsoft PowerPoint Java基本技術PrintOut.ppt [互換モード]

Microsoft PowerPoint - prog03.ppt

JavaプログラミングⅠ

Javaプログラムの実行手順

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

メディプロ1 Javaプログラミング補足資料.ppt

Java 基礎問題ドリル ~ メソッドを理解する ~ 次のプログラムコードに 各設問の条件にあうメソッドを追加しなさい その後 そのメソッドが正しく動作することを検証するためのプログラムコードを main メソッドの中に追加しなさい public class Practice { // ここに各設問

Javaの作成の前に

JavaプログラミングⅠ

Microsoft PowerPoint - prog04.ppt

Microsoft PowerPoint ppt

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション

た場合クラスを用いて 以下のように書くことが出来る ( 教科書 p.270) プログラム例 2( ソースファイル名 :Chap08/AccountTester.java) // 銀行口座クラスとそれをテストするクラス第 1 版 // 銀行口座クラス class Account String name

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション

Microsoft PowerPoint - 11.pptx

Microsoft PowerPoint - chap10_OOP.ppt

Prog2_12th

PowerPoint プレゼンテーション

JAVA入門

GEC-Java

(1) プログラムの開始場所はいつでも main( ) メソッドから始まる 順番に実行され add( a,b) が実行される これは メソッドを呼び出す ともいう (2)add( ) メソッドに実行が移る この際 add( ) メソッド呼び出し時の a と b の値がそれぞれ add( ) メソッド

Microsoft Word - CompA-Ex doc

JavaプログラミングⅠ

Prog1_6th

I java A

CプログラミングI

PowerPoint プレゼンテーション

解答上の注意 1 解答は 解答 紙の問題番号に対応した解答欄にマークしなさい 2 選択肢は 問ごとに 意されています 問 1の選択肢は 問 2で使 しません 3 選択肢は量が多いため 探しやすさの観点よりグループ分けされています グループ分けに合わせて解答欄が区切られていますが 横 1 列で問題 1

基本情報STEP UP演習Java対策

JavaプログラミングⅠ

(Microsoft PowerPoint - \223\306\217KJAVA\221\346\202R\224\ ppt)

デジタル表現論・第4回

Prog2_9th

オブジェクト指向プログラミング・同演習 5月21日演習課題

PowerPoint プレゼンテーション

問 次の Fortran プログラムの説明及びプログラムを読んで、設問に答えよ。

スライド 1

Prog1_10th

Java講座

人工知能入門

Javaセキュアコーディングセミナー2013東京第1回 演習の解説

プログラミング入門1

PowerPoint プレゼンテーション

Java言語 第1回

プログラミング入門1

プログラミング入門1

Prog2_10th

Prog1_3rd

できるプログラマーを本気で育てる Java 超 Webプログラマーへの第 歩 第 2 回オブジェクト指向 テクノロジックアート 瀬 嘉秀

問題1 以下に示すプログラムは、次の処理をするプログラムである

Microsoft PowerPoint - 06.pptx

プログラミング入門1

ToDo: 今回のタイトル

IT プロジェクト

Microsoft Word - NonGenList.doc

Java知識テスト問題

Prog2_9th

DVIOUT-exer

第2回

1

メソッドのまとめ

Java言語 第1回


プログラミング入門1

JavaプログラミングⅠ

2004/11/23 オブジェクト指向プログラミング - モデル図とシーケンス図の表現方法 - オブジェクト指向プログラミング (OOP:ObjectOrientedPrograming) オブジェクト指向プログラミング言語 (OOPL) Java,C++,Delphi(Pascal),Visual

第 3 回 Java 講座 今回の内容 今週の Java 講座はコレクション 拡張 for 文, ガベージコレクションについて扱う. 今週の Java 講座は一番内容が薄いも のになるだろう. コレクション コレクションとは大きさが決まっていない配列だと考えればよい. コレクションには List 先

Method(C 言語では関数と呼ぶ ) メソッドを使うと 処理を纏めて管理することができる 処理 ( メソッド ) の再実行 ( 再利用 ) が簡単にできる y 元々はC 言語の関数であり 入力値に対する値を 定義するもの 数学では F(x) = 2x + 1 など F(x)=2x+1 入力値 (

12.1 インターネットアドレス インターネットアドレス インターネットアドレス 32 ビットの長さを持つインターネットに接続されたマシンを識別するのに使う インターネットアドレスは ピリオドで区切られたトークンの並びで表現されることもある インターネットアドレス

Microsoft PowerPoint ppt

2

Prog1_15th

< F2D E E6A7464>

メソッドのまとめ

Microsoft PowerPoint - OOP.pptx

3,, となって欲しいのだが 実際の出力結果を確認すると両方の配列とも 10, 2, 3,, となってしまっている この結果は代入後の配列 a と b は同じものになっていることを示している つまり 代入演算子 = によるの代入は全要素のコピーではなく 先をコピーする ため 代入後の a と b は

Javaセキュアコーディングセミナー東京 第2回 数値データの取扱いと入力値の検証 演習解説

情報処理Ⅰ演習

デジタル表現論・第6回

JavaプログラミングⅠ

<4D F736F F F696E74202D AC C8899E D834F E >

問題1 以下に示すプログラムは、次の処理をするプログラムである

JAVA入門

ただし 無作為にスレッドを複数実行すると 結果不正やデッドロックが起きる可能性がある 複数のスレッド ( マルチスレッド ) を安全に実行する ( スレッドセーフにする ) ためには 同期処理を用いるこ とが必要になる 同期処理は 予約語 synchronized で行うことができる ここでは sy

<4D F736F F D2091E F196E291E889F090E C4816A82CC838C E646F6378>

情報実習Ⅱ

プログラミング実習I

グラフの探索 JAVA での実装

JavaプログラミングⅠ

ガイダンス

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

ガイダンス

Javaによるアルゴリズムとデータ構造

Java プログラミング Ⅰ 7 回目 switch 文と論理演算子 条件判断文 3 switch 文 switch 文式が case の値と一致した場合 そこから直後の break; までを処理し どれにも一致しない場合 default; から直後の break; までを処理する 但し 式や値 1

Java プログラミング Ⅰ 3 回目変数 変数 変 数 一時的に値を記憶させておく機能型 ( データ型 ) と識別子をもつ 2 型 ( データ型 ) 変数の種類型に応じて記憶できる値の種類や範囲が決まる 型 値の種類 値の範囲 boolean 真偽値 true / false char 2バイト文

2006年10月5日(木)実施

文字列操作と正規表現

Microsoft Word - problem3.doc

Transcription:

内 容 Ⅶ. クラスの定義 クラス定義の基本 フィールドの定義 メソッド定義 例題 : 円クラスのフィールドとメソッドの定義 コンストラクタ 例題 :Circle2を使ったアプレット 1 2 クラス定義の基本 オブジェクト指向のプログラム プログラム実行時に登場するオブジェクトの性質や挙動を記述する オブジェクトの性質や挙動を記述したものが クラス である Java プログラムを書くとはクラスを定義すること クラス定義の書式 class クラス名 { メンバ定義 メンバ定義 クラス定義の基本 クラス定義の書式例 class クラス名 { フィールド 1 フィールド 2 メソッド 1 メソッド 2 メソッド 3 2 つのフィールドと 3 つのメソッドを持つ メンバ定義 フィールド定義 ( 性質 ) またはメソッド定義 ( 挙動 ) 3 4 フィールドの定義 フィールドの定義 フィールド定義の書式アクセス制御修飾子型名フィールド名 ; 型名フィールド名 ; までは C 言語と同じ アクセス制御修飾子とは オブジェクトのメンバに対するアクセスを制御するもの アクセスの種類アクセス制御修飾子そのメンバにアクセス可能なもの Public public どのクラスからでも Private private そのクラスのメンバ Protected protected そのクラスおよびサブクラス Package なしそのクラスを含むパッケージ 5 6

フィールドの定義 フィールドの定義 ( 注意点 ) private はカプセル化の実現のため必要 オブジェクト 1 オブジェクト 2 private int x; public メソッド 1{ x の値を変更するメソッド X このオブジェクトからはオブジェクト 1 の x は変更できない x の値を変更するにはメソッド 1 にお願いする class Test{ private int x; public method1( ){ int i; フィールド ローカル変数フィールドではない カプセル化 7 8 メソッドの定義 クラス定義の例 メソッド定義の書式アクセス制御修飾子戻り値の型メソッド名 ( 引数 ){ メソッド本体 C 言語の関数定義と同じようなもの 円を表すクラスの定義 中心の x 座標 y 座標 半径 r の状態を持つクラスの定義 class Circle1{ public int x; public int y; public int r; 9 10 クラス定義の例 class Circle1 { public int x; public int y; public int r; class CircleTest1 { public static void main(string args[]) { Circle1 a = new Circle1(); a.x = 30; a.y = 50; a.r = 10; System.out.println(a.x + + a.y + + a.r); オブジェクトの生成 クラスからオブジェクトを生成して使用する手順 オブジェクトへの参照を格納する 参照型変数 を定義 new 演算子を用いてオブジェクトを生成し その参照を参照型変数に代入する オブジェクトに対する操作は 参照型変数を介して行う例 Circle1 a; a = new Circle1(); = Circle1 a = new Circle1(); Circle1クラスのオブジェクトを指す参照変数 aの定義 Circle1クラスのオブジェクトを生成 11 12

オブジェクトのメンバーに対するアクセス オブジェクトのメンバーにアクセスするには 参照変数名とメンバー名をピリオド. でつなぐ a.x フィールドの場合 a.draw() メソッドの場合 (Circle1 にはメソッドが無いのであくまでも例 ) Circle1 クラスの各フィールドの代入は以下のようにして行う a.x = 30; a a.y = 50; a.r = 10; Circle1 オブジェクト x y r 30 50 10 UML a : Circle1 x = 30 y = 50 r = 10 13 UML のクラス図で表現 Circle2 円の中心 x 円の中心 y 半径 r Circle2(int xp, int yp, int radius) moveto(int newx, int newy) draw(graphics g) 14 円クラス (Circle2) import java.awt.*; class Circle2 { private int x; private int y; private int r; public Circle2(int xposition, int yposition, int radius) { x = xposition; y = yposition; r = radius; public void moveto(int newx, int newy) { x = newx; y = newy; public void draw(graphics g) { g.drawoval(x r, y r, 2 * r, 2 * r); 15 16 プログラムの解説 3 つのメソッド public Circle2(int xposition, int yposition, int radius) 円オブジェクトを初期化する コンストラクタ と呼ばれる特殊なメソッド ( 後述 ) public void moveto(int newx, int newy) 円の中心を (newx, newy) に移動するメソッド public void draw(graphics g) 円を描画するメソッド privateフィールド private int x; private int y; private int r; フィールドがprivateで定義された場合は そのクラス内のメソッドからのみアクセス可能 この場合 3つのメソッド (Circle2, moveto, draw) からのみアクセスできる 他のクラスのメソッドからはx, y, rの値は変更できない ( カプセル化 ) 他のクラスのメソッドから値を変更するには 3つのメソッド (publicなので) に引数を渡して変更してもらう 17 18

movetoメソッド public void moveto(int newx, int newy) { x = newx; y = newy; 円の中心の位置を変更するメソッド 引数 (newxとnewy) として与えられた値をフィールドxとフィールドyに代入しているだけ 19 drawメソッド public void draw(graphics g) { g.drawoval(x r, y r, 2 * r, 2 * r); 左上の座標幅高さ 円を描画するメソッド (x-r, y-r) 楕円を含む長方形の左上の座標 y-r x-r 2 * r ( 長方形の幅 ) x 軸 2 * r( 長方形の高さ ) 中心 (x,y) y 軸 g.drawovalは長方形に内接する楕円を描く 20 コンストラクタ オブジェクトが生成されるとき フィールドの初期状態を定めるためのもの コンストラクタの定義例 public Circle2(int xposition, int yposition, int radius) { x = xposition; y = yposition; r = radius; コンストラクタとクラスの名前は同じ この例では 対応する引数を受け取り フィールド x, y, r を初期化している 21 コンストラクタの書式アクセス制御修飾子クラス名 ( 引数リスト ){ コンストラクタ本体 コンストラクタの名前とクラス名は同じ コンストラクタは戻り値がない コンストラクタを使ったオブジェクトの初期化 Circle2 a = new Circle2(20, 30, 10); 参照変数 a には Circle2 オブジェクトへの参照が入る コンストラクタは渡された引数とコンストラクタの定義に従って オブジェクトのフィールドを初期設定する この場合 オブジェクトの初期状態は 中心のx 座標が20 y 座標が30 半径が10 となる 22 コンストラクタのオーバーロード 一つのクラス内で 引数の個数あるいは型の異なるコンストラクタを複数定義できる機能のこと 例えばCircle2クラスで以下のようなものを追加できる public Circle2(int radius){ x = y = 100; r = radius; このコンストラクタは 円の半径を引数とし中心の座標を (100,100) とする コンストラクタが追加されたCircle2では Circle2 a = new Circle2(20, 30, 10); としてオブジェクトが生成された場合には Circle2( int xposition, int yposition, int radius) のコンストラクタが呼ばれる Circle2 b = new Circle2(30); としてオブジェクトが生成された場合には Circle2(int radius) のコンストラクタが呼ばれる new 演算子によってオブジェクトが生成されるとき どのコンストラクタが呼ばれるかはコンストラクタに渡す引数の個数と型によって決定される 23 24

例題 :Circle2 を使ったアプレット c:circle2 UMLのオブジェクト図で表現 x=20 y=50 Circle2 c = r=20 CircleApplet2 new Circle2(20, 50, 20) Circle2(xP,yP,ra) moveto(nx,ny) draw(g) paint(graphics g) c.draw(g) c.moveto(80,50) c.draw(g) c:circle2 x=80 y=50 r=20 Circle2(xP,yP,ra) moveto(nx,ny) draw(g) 例題 :Circle2を使ったアプレット UMLのオブジェクト図で表現 CircleApplet2 c.moveto(140,50) paint(graphics g) c.draw(g) c:circle2 x=140 y=50 r=20 Circle2(xP,yP,ra) moveto(nx,ny) draw(g) 次のスライドに続く 25 26 例題 :Circle2 を使ったアプレット import java.applet.applet; import java.awt.*; public class CircleApplet2 extends Applet { public void paint(graphics g) { Circle2 c = new Circle2(20, 50, 20); 例題 :Circle2 を使ったアプレット 実行結果 c.draw(g); c.moveto(80, 50); c.draw(g); c.moveto(140, 50); c.draw(g); 27 28 例題 :Circle2 を使ったアプレット プログラムの説明 CircleApplet2 クラスは Circle2 クラスを使って 3 個の円を描画するアプレット new Circle2(20, 50, 20) という形で Circle2 オブジェクトを生成する ( 中心座標 (20,50) で半径 20) draw メソッドを呼んで円を描画 ( 左の円 ) moveto メソッドを使って 円を移動する ( 中心 (80,50)) 再度 draw メソッドを使って円を描画する ( 真ん中の円 ) もう一度円の移動と描画を繰り返す ( 右の円 ) 29 スタックとは 複数の関連したデータを格納することのできるデータ構造の一種 データを取り出すときは 入れた順序と逆の順序で取り出される (Last-IN First-OUT) 例本を箱に入れる (Book1 Book2 Book3 の順 ) 箱 Book3 Book2 Book1 Book2 Book1 本を箱から取り出す (Book3 Book2 Book1 の順 ) Book3 Book1 Book2 Book3 30

スタックに対する基本操作 ( メソッド名 ) プッシュ : スタックにデータを入れる (push) ポップ : スタックからデータを取り出す (pop) スタックに対するその他の操作 スタックが空かどうか調べる (isempty) スタックが一杯かどうか調べる (isfull) スタックの中にある データ の個数を調べる (number) スタックの容量を調べる (capacity) 31 配列要素番号 スタックの実現方法 配列を使う 底 A,B というデータが格納されている状態 スタックの本体を配列として表現する どこまでデータを格納したかを表すために スタックポインタ と呼ぶ変数を用意する スタックポインタには次にデータが格納される配列要素番号が格納される 0 1 2 3 4 5 6 7 A B 2 スタックポインタ スタック上 32 UML のクラス図で表現 IntStack スタック stack[] スタックポインタ sp IntStack() IntStack(int size) push(int n) pop() isempty() isfull() number() capacity() 33 スタッククラスの定義 int 型データだけを格納できるIntStackクラスの定義 // Stack class class IntStack { private int stack[]; private int sp; public IntStack() { stack = new int[100]; sp = 0; 34 public IntStack(int size) { stack = new int[size]; sp = 0; public void push(int n) { if(!isfull()) { stack[sp] = n; sp++; 35 public int pop() { if(!isempty()) { sp--; return stack[sp]; else { return 0; public boolean isempty() { return sp <= 0; 36

public boolean isfull() { return sp >= stack.length; public int number() { return sp; public int capacity(){ return stack.length; 37 プログラムの解説 フィールド定義 private int stack[]; private int sp; int 型の配列 stackとint 型の変数 spを定義する アクセス制御修飾子は private なのでこのクラス内のメソッドからのみアクセス可能 ( カプセル化 ) Java でクラスを定義する際 フィールドは private で定義するのが基本 38 コンストラクタ public IntStack() { stack = new int[100]; sp = 0; public IntStack(int size) { stack = new int[size]; sp = 0; コンストラクタを 2 個持つ 上は引数のないコンストラクタで下はスタックの容量を引数とするもの ( 両方とも配列 stack と sp の初期化を行う ) 39 push メソッド public void push(int n) { if(!isfull()) { stack[sp] = n; sp++; スタックにデータを格納するためのメソッド スタックポインタ sp は次にデータを格納する配列要素番号を示す 引数に与えられたデータを配列 ( この場合 stack) に格納した後 sp を 1 増やす isfull メソッドは配列が満杯かどうか調べるためのメソッド もし配列が満杯ならこの処理は行われない 40 pop メソッド public int pop() { if(!isempty()) { sp--; return stack[sp]; else { return 0; スタックからデータを取り出すためのメソッド スタックが空でないことをisEmpty() メソッドで確認してからスタックポインタspの値を1 減らして その後データを取り出している スタックが空のときは0を返す 41 isempty メソッド public boolean isempty() { return sp <= 0; スタックが空であるかどうかを調べるメソッド スタックポインタの値が 0 以下なら true それ以外は false isfull メソッド public boolean isfull() { return sp >= stack.length; スタックが満杯であるかどうかを調べるメソッド スタックポインタの値と配列の大きさ stack.length を比較している sp の値が stack.length 以上なら true それ以外は false 42

numberメソッド public int number() { return sp; スタック内に格納されているデータの個数を返すメソッド スタックポインタspの値がデータの個数になる capacity メソッド public int capacity(){ return stack.length; スタックに格納可能なデータの個数を返すメソッド 配列の大きさ stack.length を返している 43 コマンドライン引数から整数を読み込み それを IntStack 型のオブジェクトに入れてから取り出すプログラム class StackTest { public static void main(string args[]) { IntStack s = new IntStack(3); System.out.println( capacity = + s.capacity()); System.out.println( number = + s.number()); System.out.println(); for(int i = 0; i < args.length; i++) { s.push(integer.parseint(args[i])); 44 System.out.println( number = + s.number()); System.out.println( isfull? + s.isfull()); System.out.println(); while(!s.isempty()) { System.out.print(s.pop() + ); System.out.println(); System.out.println( number = + s.number()); System.out.println( isempty? + s.isempty()); System.out.println(); 45 実行結果 > java StackTest 1 2 capacity = 3 number = 0 number = 2 isfull? false 2 1 number = 0 isempty? true データが格納された直後のオブジェクト図 s:intstack stack[]=1,2 sp=2 IntStack() IntStack(int size) push(int n) pop() isempty() isfull() number() capacity() 46 実行結果 > java StackTest 1 2 3 4 5 capacity = 3 number = 0 number = 3 isfull? true 3 2 1 number = 0 isempty? true データが格納された直後のオブジェクト図 s:intstack stack[]=1,2,3 sp=3 IntStack() IntStack(int size) push(int n) pop() isempty() isfull() number() capacity() 47 プログラムの説明 new IntStack(3) でIntStack 型のオブジェクトを生成している スタックの容量は3 その後スタックに関する情報 ( 容量と格納されているデータの個数 ) を表示 コマンドライン引数をスタックに格納 スタックの状態を表示 スタックが空になるまでスタックからデータを取り出し表示する スタックが空になったらもう一度スタックの状態を表示する 48

補足 : キュー ( 待ち行列 ) クラス キューの実現方法 キューの本体を配列として表現する どこまでデータを格納したかを表すための キューポインタ 1(qp1) とどこまで読み込んだかを表すための キューポインタ 2(qp2) と呼ぶ変数を用意する qp1 には次にデータが格納される配列要素番号が格納され,qp2 にはこれから読み込むデータの配列要素番号が格納される 補足 : キュー ( 待ち行列 ) クラス 配列要素番号 qp2 0 1 2 3 4 5 6 7 A B C 0 3 qp1 キュー A,B,C というデータが格納されている状態 配列要素番号 0 1 2 3 4 5 6 7 キュー 配列要素番号 0 1 2 3 4 5 6 7 キュー qp2 0 0 qp1 初期状態 A qp2 B 1 C 3 qp1 A が読み込まれた状態 49 50 問題 1 問題 2 例を参考にして Circle1 オブジェクトの各フィールドに x=100,y=200,r=300 を代入するクラスを定義せよ 長方形を描画する Rectangle クラス円クラス Circle2 を参考にして, 長方形を描画する Rectangle クラスを定義せよ. 51 52 演習問題 6(1) Circle2 を使ったアプレット中心座標が (100,100) で半径 50 の円を描くアプレットを作成せよ また その円の中心を (200,200),(300,300) に移動した円を描画する部分も追加せよ なお クラスの名前やオブジェクトの参照変数は例題と同じものを使用せよ 演習問題 6(2) StringStack クラス例題の IntStack クラスは,int 型のデータをスタックに格納することができるクラスであった. このクラスを改良して, スタックの中に文字列データを格納することができる StringStack クラスを定義せよ 53 54