計算機プログラミングI 第8回 2002年12月5日(木) メソッドとクラス (教科書6章) クイズ インスタンスメソッド インスタンス変数

Slides:



Advertisements
Similar presentations
アルゴリズムとプログラミン グ (Algorithms and Programming) 第6回:クラスとインスタンス クラスの宣言 アクセス修飾子 インスタンスの生成 (new キーワード) this キーワード フィールドとメソッドの実際の定義と使い 方 クラスの宣言 アクセス修飾子 インスタンスの生成.
Advertisements

オブジェクト指向 言語 論 第八回 知能情報学部 新田直也. 多相性(最も単純な例) class A { void m() { System.out.println( “ this is class A ” ); } } class A1 extends A { void m() { System.out.println(
独習JAVA Chapter 6 6.6 クラスの修飾子 6.7 変数の修飾子 結城 隆. 6.6 クラスの修飾 abstract インスタンス化できないクラス。1つまたは複数のサブクラスで 実装してはじめてインスタンス化できる。 final 継承されたくないことを明示する。これ以上機能拡張 / 変更でき.
復習ー I (General Review I) クラスとオブジェクトの概念 Concepts of class and object クラスの宣言とオブジェクトの生成 Definition of a class and creation of an object コンストラクタとメソッドのオーバーロー.
AIプログラミング Java とオブジェクト指向プログラミングの基 礎 認知システム論 情報工学コース コンピュータサイエンスコース 生体情報コース.
6.4継承とメソッド 6.5継承とコンストラクタ 11月28日 時田 陽一
Applet 岡部 祐典 鈴木 敬幸.
~手続き指向からオブジェクト指向へ(Ⅰ)~
プログラミング基礎I(再) 山元進.
アルゴリズムとデータ構造1 2007年6月12日
アルゴリズムとプログラミング (Algorithms and Programming)
第2回:Javaの変数と型の宣言 プログラミングII 2007年10月2日.
アルゴリズムとプログラミング (Algorithms and Programming)
計算機プログラミングI 第12回 2003年1月23日(木) インターフェース スレッド 最後に お知らせ クイズ 授業アンケート
プログラミングIII演習 第1回目.
社会人学習講座 「Javaプログラミング概論」
第2章 Eclipseと簡単なオブジェクト 指向プログラミング
インタフェース プログラミング 第14回 インタフェース プログラミング第14回.
オブジェクト指向入門.
第6回独習Javaゼミ 第6章 セクション4~6 発表者 直江 宗紀.
コンパイラの解析 (2) GCJのデータ構造 - 1.
~手続き指向からオブジェクト指向へ[Ⅱ]~
オブジェクト指向 プログラミング 第十四回 知能情報学部 新田直也.
ソフトウェア工学 知能情報学部 新田直也.
JAVA入門後期⑩ 情報処理試験例題解説.
アルゴリズムとプログラミング (Algorithms and Programming)
オブジェクト指向 プログラミング 第八回 知能情報学部 新田直也.
独習JAVA 6.8 コンストラクタの修飾子 6.9 メソッドの修飾子 6.10 ObjectクラスとClassクラス 11月28日(金)
オブジェクト指向 プログラミング 第十一回 知能情報学部 新田直也.
計算機プログラミングI 第10回 データ構造とクラスの設計 例題: 話題: 複素数 図形要素 Morphing 複雑な値を一つにまとめる
オブジェクト指向 プログラミング 第十三回 知能情報学部 新田直也.
第11週:super/subクラス、継承性、メソッド再定義
オブジェクト指向 プログラミング 第十四回 知能情報学部 新田直也.
11 ソフトウェア工学 Software Engineering デザインパターン DESIGN PATTERNS.
計算機プログラミングI 第11回 再帰 再帰的なメソッド定義 帰納的定義 再帰的なデータ構造 計算機プログラミングI (増原) 2003年度.
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
オブジェクト指向 プログラミング 第十ニ回 知能情報学部 新田直也.
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
計算機プログラミングI 第5回 配列 文字列(Stringクラス) mainの引数 配列の利用例
オブジェクト・プログラミング 第8回.
計算機プログラミングI 第8回 素数を見つけるアルゴリズム 継承とインスタンスメソッド クラスの設計 オブジェクトに機能を加える
計算機プログラミングI 第12回 スレッド インターフェース 授業アンケート 計算機プログラミングI (増原) 2003年度.
第8回放送授業.
オブジェクト プログラミング 第2回 プログラムの基本.
プログラムのコメント.
アルゴリズムとプログラミング (Algorithms and Programming)
オブジェクト指向 プログラミング 第九回 知能情報学部 新田直也.
プログラミング言語論 第十三回 理工学部 情報システム工学科 新田直也.
オブジェクト指向 プログラミング 第八回 知能情報学部 新田直也.
プログラミング言語論 第十一回 理工学部 情報システム工学科 新田直也.
アルゴリズムとデータ構造 2012年7月2日
C#プログラミング実習 第3回.
計算機プログラミングI 木曜日 1時限・5時限 担当: 増原英彦 第1回 2002年10月10日(木)
計算機プログラミングI 第3回 プリミティブ値 クラスメソッド クラス変数 式と演算 変数の利用
アルゴリズムとデータ構造 2011年6月28日
計算機プログラミングI 第4回 2002年10月31日(木) 問題解決とアルゴリズム クラスメソッドと手続きの抽象化 最大公約数
アルゴリズムとデータ構造 2013年7月2日
Chapter 5 5.5 thisキーワード 5.6 インスタンス変数とインスタンスメソッド 結城 隆
JAVA入門⑥ クラスとインスタンス.
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
cp-2. 属性,アクセサ (C++ オブジェクト指向プログラミング入門)
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
オブジェクト指向言語論 第十回 知能情報学部 新田直也.
計算機プログラミングI 第2回 2002年10月17日(木) 履習登録 複習 ライブラリの利用 (2.6-7) 式・値・代入 (2.6-8)
計算機プログラミングI 第10回 2002年12月19日(木) メソッドの再定義と動的結合 クイズ メソッドの再定義 (オーバーライド)
プログラミングの原理 データ構造とプログラミング (第4回).
計算機プログラミングI 第5回 2002年11月7日(木) 配列: 沢山のデータをまとめたデータ どんなものか どうやって使うのか
Presentation transcript:

計算機プログラミングI 第8回 2002年12月5日(木) メソッドとクラス (教科書6章) クイズ インスタンスメソッド インスタンス変数 メソッドとクラス (教科書6章) インスタンスメソッド インスタンス変数 コンストラクタ 多重定義 クイズ

例題: タートルでn角形を描く いままでTurtleは前進(fd)・回転(lt)等の指示を 受けることができた 《監督》がfd, lt などのメソッドを順に呼出す(e.g., m.fd(10);) Turtleオブジェクトは言われた通りに動く もしタートルが「n角形を描く」という指示を 受けられるなら 《監督》は1回メソッドを呼出す (e.g., m.polygon(10,5);) 亀が適当な順に動いてn角形を描く メソッド呼出し

例題: タートルでn角形を描く 亀に「n角形を描く」という指示を 受けられるようにする → インスタンスメソッドを定義 「n角形を描」ける亀を簡単に作る → Turtle クラスを拡張

n角形の描き方を知っている タートルがいたら・・・ public class T61 { public static void main(String[] args){ TurtleFrame f = new TurtleFrame( ); House m = new House( ); int s = 50; f.add(m); m.house(s); m.up( ); m.fd(s * 2); m.down( ); m.polygon(3, s / 2); m.up( ); m.fd(s); m.down( ); m.polygon(10, s / 5); } House・・・Turtleのかわりのクラス名 Turtleオブジェクトと 同じように使える Turtleにはない メソッドもある

n角形の描き方を知っている タートルの定義 public class House extends Turtle { public void polygon(int n, int s){ int a = 360/n; for(int j = 0; j < n; j++){ fd(s); rt(a); } public void house(int s){ polygon(4,s); rt(30); polygon(3,s); lt(30); bk(s); Turtleに機能を追加したクラスを作ると宣言 追加される機能 (メソッド) 自分自身を使って n角形を描く 自分自身を使って 家の形を描く

n角形の描き方を知っている タートルの定義 public class House extends Turtle { public void polygon(int n, int s){ int a = 360/n; for(int j = 0; j < n; j++){ fd(s); rt(a); } public void house(int s){ polygon(4,s); rt(30); polygon(3,s); lt(30); bk(s); 例:m.polygon(50,3)を実行 →mに対して「多角形を描け」 → このメソッドが実行 自分自身(=m)に対する メソッドの実行 →m.fd(s)と同じ → mが前進 自分自身(=m)に対する メソッドの実行 追加したメソッドも実行可

クラスの親子関係とメソッドの継承 親クラス 子クラスは親クラスにある全てのメソッドを継承 (インスタンス変数も) 同じ メソッドが ある class House extends Turtle { ... House:子クラス or サブクラス Turtle: 親クラス or スーパークラス 子クラスは親クラスにある全てのメソッドを継承 (インスタンス変数も) (APIページ) Turtle fd : 前進 rt : 右回転 ... 同じ メソッドが ある 子クラス House fd : 前進 rt : 右回転 ... polygon: 多角形 house: 家の形 追加された メソッド

練習 6.2 MyTurtle.javaにメソッド追加 「n角形のまわりにm角形が 1辺の長さsで配置」 T611.javaを変更 準備*: House.javaとT61.javaを コンパイル・実行 6.1* Houseクラスを拡張したMyTurtle クラスを作る (ヒント: Turtleクラスを拡張したのがHouseクラス) 「MyTurtleはメソッドhouses(n,s,w)をもつ」 cf.Houseクラスはメソッドhouseをもつ n回の繰り返し 自身のhouseメソッドで家を描く 右へs+wだけ移動 (ペン上げ ・右回転・前進・左回転・ペン下げ) テスト: T61.javaをもとに T611.javaを作る House→MyTurtle m.house(s)→m.houses(3,s,10) 6.2 MyTurtle.javaにメソッド追加 「n角形のまわりにm角形が 1辺の長さsで配置」 n回のくり返し m角形を描く(polygon) sだけ前進 360/n右回転 T611.javaを変更 polygon(3,s/2) →ppolygon(3,4,s/2) polygon(10,s/3) →ppolygon(10,3,s/2)

6.2 多重定義(オーバーロード) public class T61 { public static void main(String[] args){ TurtleFrame f = new TurtleFrame( ); House m = new House( ); int s = 50; f.add(m); ... 継承と値の型 子クラスのオブジェクトは 親クラスのオブジェクトのかわりとして使える ← 子クラスは機能を追加しただけ 例: TurtleFrame クラスのaddメソッド 引数はTurtle型 (see API) つまりf.add(m)のように使うときmはTurtleオブジェクト 実際にはTurtleの子クラスHouseのオブジェクトでもよい 型  値の集合 とすると、 子クラスは親クラスの部分集合 Turtle House

6.2 多重定義(オーバーロード) 多重定義 シグネチャ 例 同じ名前で違うメソッド定義を用意すること 引数の数や型が違っていることが必要 引数の数と型で選ばれる シグネチャ メソッドの名前+引数の型 例 houseメソッドの多重定義 void house(int) void house(int,int,int) public class House extends Turtle { public void house(int s){ polygon(4,s); fd(s); rt(30); polygon(3,s); lt(30); bk(s); } public void house(int x, int y, int s) { up(); moveTo(x,y,0); down(); house(s);

6.3 値を返すメソッド (説明済み)

例題: n角形を分割して描く亀 「分割して描く」とは: 自分がいま を覚える必要がある → インスタンス変数を使う (実演) 自分がいま 何角形を描いているのか 1辺の長さ 何番目の辺を描いているのか を覚える必要がある → インスタンス変数を使う 次に「進め」と言われたら まだ進むべきか? 何度曲がるか? 何歩進むか?

6.4 インスタンス変数 インスタンス 変数の宣言 public class Stepper extends Turtle{ public int n; public int size; private int j = 0; public static final int ALREADY_FIN = 0; public static final int JUST_FIN = 1; public static final int NOT_FIN = 2; public int step() { if(j >= n) return ALREADY_FIN; fd(size); rt(360/n); if(++j == n) return JUST_FIN; return NOT_FIN; } public void reset() { j = 0; } 自分がいま 何角形を描いているのか 1辺の長さ 何番目の辺を描いているのか を覚える ローカル変数と同様に 値をとり出す 値をしまう ことができる オブジェクトごとに用意される → 前回のメソッド実行時に しまわれた値が そのまま残っている j=j+1; if(j==n) ... と同じ

6.4 インスタンス変数 public class Stepper extends Turtle{ public int n; 自分がいま public int size; private int j = 0; public static final int ALREADY_FIN = 0; public static final int JUST_FIN = 1; public static final int NOT_FIN = 2; public int step() { if(j >= n) return ALREADY_FIN; fd(size); rt(360/n); if(++j == n) return JUST_FIN; return NOT_FIN; } public void reset() { j = 0; } public class T62{ public static void main(String[] args){ TurtleFrame f = new TurtleFrame(); Stepper m1 = new Stepper(); f.add(m1); Stepper m2 = new Stepper(); f.add(m2); m1.n = 4; m1.size = 100; m2.n = 3; m2.size = 100; ... 自分がいま 何角形を描いているのか 1辺の長さ 何番目の辺を描いているのか を覚える ローカル変数と同様に 値をとり出す 値をしまう ことができる オブジェクトごとに用意される → 前回のメソッド実行時に しまわれた値が そのまま残っている j=j+1; if(j==n) ... と同じ

6.5 コンストラクタ オブジェクトが作られたときに実行されるメソッド オブジェクトのインスタンス変数を初期化などを定義しておく 多重定義がよく使われる 文法 クラス名(引数の型 引数の名前, ...) { ... } コンストラクタの中から他のコンストラクタを実行できる 親クラスのコンストラクタを実行する式 super(引数, 引数, ...); 自身の別のコンストラクタを実行する式 this(引数, 引数, ...);

... new Turtle(x,y,angle) のときと同様 コンストラクタの実例 コンストラクタの 定義 public class Stepper extends Turtle{ public int n; public int size; private int j = 0; Stepper(int x, int y, int angle, int n, int size) { super(x, y, angle); this.n = n; this.size = size; } ... public int step() { if(j >= n) return ALREADY_FIN; 親クラスの コンストラクタを実行 ... new Turtle(x,y,angle) のときと同様 Stepper[] hm = new Stepper[10]; for(int i = 0 ; i < 10; i++){ hm[i] = new Stepper(i * 50 + 25,150,0, n[i], size[i]); hm[i].setColor(c[i % c.length]); f.add(hm[i]); } 1. Stepperオブジェクトが作られる 2. コンストラクタが実行される

プログラムの構造 プログラムはクラス定義の 集まり 1クラス=1ファイル { } が1つのまとまり クラス定義の中に 変数・メソッド等の定義 import java.awt.Color; public class Stepper extends Turtle { public int n; public int size; private int j = 0; public static final int ALREADY_FIN = 0; public static final int JUST_FIN = 1; public static final int NOT_FIN = 2; /** x, y という座標に angle の角度の Stepper を生成 */ Stepper(int x, int y, int angle, int n, int size) { super(x, y, angle); this.n = n; this.size = size; } /** n = 4, size = 100 の Stepper を作成 */ Stepper(int x, int y, int angle) { this(x, y, angle, 4, 100); public int step() { if(j >= n) return ALREADY_FIN; fd(size); rt(360/n); if(++j == n) return JUST_FIN; return NOT_FIN; プログラムの構造 インスタンス変数 クラス変数 コンストラクタ インスタンスメソッド プログラムはクラス定義の 集まり 1クラス=1ファイル { } が1つのまとまり クラス定義の中に 変数・メソッド等の定義 順番は無関係

プログラムの構造 インスタンス変数 public 型 名前 = 式; クラス変数 public static 型 名前 = 式; import java.awt.Color; public class Stepper extends Turtle { public int n; public int size; private int j = 0; public static final int ALREADY_FIN = 0; public static final int JUST_FIN = 1; public static final int NOT_FIN = 2; /** x, y という座標に angle の角度の Stepper を生成 */ Stepper(int x, int y, int angle, int n, int size) { super(x, y, angle); this.n = n; this.size = size; } /** n = 4, size = 100 の Stepper を作成 */ Stepper(int x, int y, int angle) { this(x, y, angle, 4, 100); public int step() { if(j >= n) return ALREADY_FIN; fd(size); rt(360/n); if(++j == n) return JUST_FIN; return NOT_FIN; プログラムの構造 インスタンス変数 public 型 名前 = 式; クラス変数 public static 型 名前 = 式; コンストラクタ クラス名(型 式, ...) { 文... } インスタンスメソッド public 型 名前(型 式, ...) { 文 ... } クラスメソッド public static 型 名前(型 式, ...) { 文 ... }

練習 6.3 6.4 (紙に書く) 6.5 MyTurtle.html というファイルができる 準備* T62.java および Stepper.java を読み、コンパイル、実行してみる 6.6* (see リスト6.5の2行目) 6.7 Houseクラス → 実はある MyTurtleクラスに追加: public MyTurtle(int x, int y, int a) { ... } Stepper m1 = new Stepper(); f.add(m1); Stepper m2 = new Stepper(); f.add(m2); m1.n = 4; m1.size = 100; m2.n = 3; m2.size = 100; m2.up(); m2.moveTo(100,200,0); m2.down(); ... Stepper m1 = new Stepper(); f.add(m1); Stepper m2 = new Stepper(?????); f.add(m2); ...

6.6 クラス変数・クラスメソッド (第4回で説明済み) 立場の違い: クラスメソッド: 「監督」の立場 (e.g., mainメソッド) インスタンスメソッド: 指示を受ける側の立場 「細いことは個々の オブジェクトが知っている」 「同じ指示を受けても、 オブジェクトによって 動きを変える」 メソッド=処理の中身を隠す手段 → 誰の立場で隠しているか、の違い オブジェクト指向の 本質の1つ

6.7 mainメソッド 6.8 内部クラス (略)

練習 準備: 6.9 「まとめの例題」を読む 6.8 6.9 練習問題5.6参照 6.10 上で作った void draw(int,int,int[]) を使う 6.11 draw(150,200,kameFig); などのようにする 6.12 右か左かを覚ておくインスタンス変数を1つ用意 6.13

クイズ