Lecture

マルチメディアプログラミング実習 2016年10月27日

第6章 クラスの基礎

クラスとインスタンスの説明をしました。復習しましょう。

http://gyazo.com/bbdd3587977a172f7fa7f00c4f5787e0.png

クラスメソッド、クラス変数は、クラスに聞きます。

インスタンスメソッド、インスタンス変数は、インスタンスに聞きます。

例えば、上の例で、クラス名がTaiyakiでインスタンスがtaiyaki1, taiyaku2,...だとすると、 クラスメソッド、変数は、

Taiyaki.yaku();

とか

Taiyaki.seizousuu

とかしてアクセスします。

インスタンスメソッド、変数は、

taiyaki1.taberu()

とか

taiyaki2.ondo

とかしてアクセスします。

第7章 クラスとオブジェクトの操作

7.1 オーバーロード

先週、説明しました。教科書pp.101--104を読んで復習してください。 (10分)

他の点との距離を返すメソッドの例を使ってオーバーロードを説明しました。

	double distance ( int ptx, int pty ) {
		int dx = ptx - this.x;
		int dy = pty - this.y;
		return  Math.sqrt(dx * dx + dy * dy);
	}
	
	double distance ( Point p ) {
		return this.distance(p.getx(), p.gety());
	}

distanceという名前は同じでも、引数の違いで、異なる動作をさせることができます。

7.2 コンストラクタ

今まではnew Point()と言うようにしてインスタンスを作っていました。 Point()と言うメソッドは、クラスメソッドの特別なものです。 インスタンスを作るときに、他にやってほしい仕事をコンストラクタに書くことができます。

教科書のpp.104--107を読んでください。(10分)

前回作ったPoint3Dクラスに、new Point(10,20,30)をするとx,y,z=10,20,30の点を作ってくれるコンストラクタを書いてみてください。

7.3 インスタンスの参照

pp.107--109を読んでください。(10分) インスタンスを指している変数を理解してください。Cで言う所のポインターになっています。

7.4 ガーベージコレクション、ファイナライザ

7.4節を読んでください(5分)

Cではmalloc()して得たメモリーは、いつかは、free()してあげないと、どんどんメモリーを消費してしまうプログラムになってしまいます。 メモリーを要求するだけで返却しないプログラムが、メモリーをどんどん浪費していく現象は、 メモリーリークとも呼ばれます。 一見動いていても、長時間動かしていると落ちてしまうタチの悪いバグです。

Javaでは使わなくなった(参照されなくなった)インスタンスが使うメモリーを、自動的に返却する機能、ガーベージコレクション(ゴミ集め)があります。 なので、free()に相当することをやらなくて良いのです。

インスタンスが破棄される直前に、何かの処理をしたい場合は、finarize()メソッドを定義しておきます。

7.5 インスタンスのメンバとクラスのメンバ

7.5節を読んでください。プログラム7.4も読んでください(15分)

メンバというのは変数とメソッドの総称です。

staticなメンバとは、クラス変数、クラスメソッドのことです。

staticではないメンバが、インスタンス変数、インスタンスメソッドになります。

7.6 ファイナル変数

7.6節を読んでください(5分)

C言語では#define文で定数を定義することがありました。 Javaにはそういう仕組みがありません。 定数を定義したいときには予約語finalを使います。 これはこの後変更されない変数になります。

7.7 アクセス制御

7.7節を読んでください(5分)

publicとprivateは知っておくと良いです。

本日の課題

ここまで教科書を読んだら、次のOsaifuプログラムを書いてください。

Osaifuクラスを作ってみよう

このOsaifuクラスを作ってください。 mainに、以下のテストプログラムを書いてください。

	public static void main(String argv[]) {
		Osaifu saifu1 = new Osaifu();
		Osaifu saifu2 = new Osaifu();
		saifu1.in(1000);
		saifu2.in(500);
		saifu1.print();
		saifu2.print();
		saifu2.in(saifu1.out(200));
		saifu1.print();
		saifu2.print();
	}

すると結果は以下になるはずです。

http://gyazo.com/c618901458edc1ba338cab87d2810157.png

解答編(簡易版)

public class Osaifu {
	int okane;	
	public void in (int x) { okane += x; }
	public int out(int x) { okane -= x; return x; }
	public void print() {
		System.out.println( "okane = " + okane +" yen");
	}
	
	public static void main(String argv[]) {
		Osaifu saifu1 = new Osaifu();
		Osaifu saifu2 = new Osaifu();
		saifu1.in(1000);
		saifu2.in(500);
		saifu1.print();
		saifu2.print();
		saifu2.in(saifu1.out(200));
		saifu1.print();
		saifu2.print();
	}
}
	public int out(int x) {
		if(x < okane ) {
			okane = okane -x;
			return x;
		} else {
			int nokori = okane;
			okane =0;
			return nokori;
		}
	}	

つぎにOsaifuクラスにコンストラクタを追加してみよう

ことができるコンストラクタを作ろう。

これをmainから呼んで、上記のプログラムと同じことをするためには、

		Osaifu saifu1 = new Osaifu(1000);//インスタンスを作る
		//最初の保持金額を1000円にする
		Osaifu saifu2 = new Osaifu(500);//インスタンスを作る
		//最初の保持金額を500円にする

とすることになる。mainを書き換えて確かめてください。

コンストラクタ解答編

以下のコンストラクタを作ることになる。

	Osaifu() { okane = 0; }
	Osaifu(int x) { okane = x; }

これは以下のように書いても良い。

	Osaifu() { this(0); }
	Osaifu(int x) { okane = x; }

課題提出

最終的に作ったOsaifu.java, Osaifu.classをいつものように提出してください。


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2020-11-18 (水) 20:51:52