社会人学習講座 「Javaプログラミング概論」 第02回 前半 (2008年09月13日) 1 今日の教材 http://flute.u-shizuoka-ken.ac.jp/~sokubo/class/java08/ にあります。 上記URLは、ご自宅でもアクセス可能です。 分量が沢山ありますが、全部やらなくて大丈夫です。 課題らしい課題もありません。 ソースを見て、分からないところ等ありましたら、お呼び 下さい。 2/33 今日の内容 先週の復習とJavaの基本的な部分 前回の復習1(コンパイルと実行) 前回の復習2(クラスとは) static なメソッド 前回の復習3 (クラスの継承) abstract クラス・インターフェース Javaで書くGUI JavaアプレットとSwing 3/33 Javaのコンパイルと実行 1. テキストエディタでソースファイルを記述する。 たとえば、Hello.javaを書く。 2. コンパイルの方法 コンソール上で javac Hello.java と入力する。 3. 実行の方法 コンソール上で java Hello と入力する。 4/33 オブジェクト指向プログラミング と クラス 5/33 オブジェクト指向プログラミング データをやり取りするオブジェクト(インスタンス)の 集合として構成されるプログラム インスタンス間で データをやりとりする。 それぞれのインスタンスが 処理を行う。 インスタンスA main 関数のように 使えるクラス インスタンスB インスタンスC 6/33 クラスとは? いわば、インスタンスの設計図。 インスタンスが、 どの様な変数を持っているか どの様なメソッド(関数)を持っているか が記述してある。 あくまでも『設計図』なので、使用するためには、クラ スに基づいたインスタンスを生成する必要がある。 7/33 オブジェクトって何? 直感編 概念とか設計図の世界 実物(オブジェクト)の世界 缶A 缶 できること • 中身を出す • 中身を入れる 中身 = ?? 何も言われないと 空である できること • 中身を出す • 中身を入れる 中身 = オレンジ色の液体 缶B 中身 = 水色の液体 できること • 中身を出す • 中身を入れる 8/33 オブジェクトって何? 直感とJava編 概念とか設計図の世界 変数 缶 コンストラクタ できること • 中身を出す • 中身を入れる クラス 実物(オブジェクト)の世界 缶A メソッド 中身 = オレンジ色の液体 できること • 中身を出す • 中身を入れる 中身 = ?? 何も言われないと 空である Javaだと インスタンス と呼ぶ 缶B 中身 = 水色の液体 できること • 中身を出す • 中身を入れる インスタンス インスタンス 9/33 オブジェクトって何? Java編 概念とか設計図の世界 変数 Test コンストラクタ int contents; contests=0; メソッド • pushContents(); • popContests(); クラス メソッド Javaだと インスタンス と呼ぶ 実物(オブジェクト)の世界 Data1 contents = 10; メソッド • pushContents(); • popContests(); Data2 contents = 20; メソッド • pushContents(); • popContests(); インスタンス インスタンス 10/33 サンプルプログラム クラスTestの詳細 Test test01=2; multiple(); class Test{ int test01=2; public void multiple(int test03){ System.out.println(test01 * test03); クラスTestの } インスタンスdtを生成 } dt test01=2; public class Sample03a{ multiple(); public static void main(String[] args){ Test dt = new Test(); メソッドを、引数100 dt.multiple(100); を渡して実行 dt.test01=5; dt test01=5; dt.multiple(100); multiple(); インスタンスdtの変数 } } test01に代入 static 12/33 クラスメンバとインスタンスメンバ 変数やメソッドには、static をつけることができます。 staticがついているものをクラスメンバ、ついていないも のをインスタンスメンバと呼びます。 staticがついている変数やメソッドに関しては、すべての インスタンスが、同じモノを使うようになります。 クラスメンバは、インスタンスを生成しなくても利用する ことができます。 クラスメンバには、 クラス名.メンバ名 のようにアクセスします。 13/33 直感的な図 概念とか設計図の世界 int contents; Test static int st_cont; • pushContents(); • static cont(); Test.st_cont=10; • Test. cont(); 実物(オブジェクト)の世界 static と書かれたメンバが居 ることに注目! インスタンスを生成しなくても、 アクセス可能。 クラス名.メンバ名でアクセスする。 今回は、Test.st_cont の様にする。 14/33 直感的な図 概念とか設計図の世界 int contents; Test 実物(オブジェクト)の世界 Data1 contents = 10; static int st_cont; st_cont; • pushContents(); • pushContents(); • static cont(); • cont(); Data2 contents = 20; Test.st_cont=10; st_cont; • • pushContents(); • cont(); Test. cont(); 15/33 直感的な図 概念とか設計図の世界 int contents; Test 実物(オブジェクト)の世界 Data1 contents = 10; static int st_cont; st_cont; • pushContents(); • pushContents(); • static cont(); • cont(); 同じものを利用。 Data2 contents = 20; Test.st_cont=10; st_cont; • • pushContents(); • cont(); Test.cont(); 16/33 直感的な図 概念とか設計図の世界 int contents; Test 実物(オブジェクト)の世界 Data1 contents = 10; static int st_cont; st_cont; • pushContents(); • pushContents(); • static cont(); Test.st_cont=15とすれば、 Data1.st_cont も15に。 • cont(); Data2 contents = 20; Test.st_cont=15; st_cont; • • pushContents(); • cont(); Test.cont(); 17/33 直感的な図 概念とか設計図の世界 Data1 contents = 10; int contents; Test ここに値を代入! Data1.st_count=20 実物(オブジェクト)の世界 static int st_cont; st_cont; • pushContents(); • pushContents(); • static cont(); • cont(); Data2 contents = 20; Test.st_cont=20; st_cont; • • Test.cont(); pushContents(); ここに代入と同じ結果 • cont(); 18/33 クラスの書き方の例 class Test{ static int st_data; int data; static と書くだけです public void test_func01(){ System.out.println(data); } public static void test_func02(){ System.out.println(st_data); } } public class Sample04a{ public static void main(String[] args){ Test.st_data=10; Test.test_func02(); インスタンスを生成しなくて } も使える } 19/33 継承 20/33 継承とは あるクラスが存在しているとき、それを流用して、違うク ラスを記述することができる!。 Test01 int data01; Test02 int data01; int data02; • test_func01(); • test_func01(); もとのクラスをスーパークラス、新しくできたクラスをサ ブクラスと呼びます。 新しくできたサブクラスは、普通のクラスと同様の方法 21/33 でインスタンスを生成し、使えます。 サブクラスの書き方 もとのクラスを拡張(extends)する形で書きます。 class サブクラス名 extends スーパークラス名 { 拡張したい内容を書く。 } 直感的には、以下のような感じ。 Test02 サブ クラス Test01 int data01; スーパー クラス int data02; 拡張された 部分 • test_func01(); 22/33 サブクラスの書き方例 class Test01{ int data01; void test_func01(){中略} スーパークラス } class Test02 extends Test01{ int data02; } Test02 サブクラス 拡張された内容 Test01 int data01; int data02; • test_func01(); 23/33 生成されたインスタンス class Test01{ int data01; void test_func01(){中略} } dt02.test_func01()のように、 普通にアクセス class Test02 extends Test01{ int data02; dt02.data01のように、 } 普通にアクセス public class Sample04d{ public static void main(String[] args){ Test02 dt02 = new Test02(); 以下略 dt02 普通に生成 data01; data02; • test_func01(); 24/33 メソッドのオーバーライド class Test01{ int data01; void test_func01(){中略} } サブクラスの方で、 スーパークラスと同じ名前・引数の メソッドを定義した場合、 サブクラスで書いた方が有効に class Test02 extends Test01{ int data02; void test_func01(){中略} } dt01(生成されたインスタンス) メソッドのオーバーライド Test01 data01; data02; • test_func01(); dt01.test_func01()として、 こちらが使われる。 • test_func01(); こちらは使われない 25/33 アブストラクトクラス と アブストラクトメソッド 26/33 アブストラクトとは クラスを書く際に、拡張されることを前提に、クラスを書 くことができる。 アブストラクトクラス アブストラクトクラスは、拡張されることが前提なので、 それ自身をクラスにするインスタンスは作れない。 アブストラクトクラスの中では、拡張時にオーバーライド されることを前提に、メソッドを書くことができる。 アブストラクトメソッド アブストラクトメソッドは、サブクラス内でオーバーライ ドしないと、コンパイル時にエラーが出る。 27/33 アブストラクトクラス 拡張されることを前提としたクラス 書式:通常のクラスの書き方に abstract とつける。 abstract 修飾子 class クラス名{ クラスと同じように、 変数の宣言 コンストラクタ メソッド 等を書く } 28/33 アブストラクトクラスの例 abstract class Test01{ void test01(){ System.out.println("Test 01"); } } class Test02 extends Test01{ void test02(){ System.out.println("Test 02"); } } アブストラクトクラス Test01をスーパークラスと するサブクラスTest02 public class Sample06a{ public static void main(String[] args){ インスタンスを生成。 Test02 dt01 = new Test02(); } Test01 dt01 = new Test01();はできない。 } 29/33 アブストラクトメソッド サブクラスで、オーバーライドされる前提のメソッド。 サブクラス内でオーバーライドされないと、コンパイル時 にエラーが出る。 書式:メソッドに abstract とつける。 abstract 修飾子 class クラス名{ 略 abstract 修飾子 返値の型 メソッド名(引数); } 必ずオーバーライドされるため、 実際に行う内容は、ここには書かない 30/33 アブストラクトメソッドの例 abstract class Test01{ void test01(){ System.out.println("Test 01"); } abstract void test02(); アブストラクト } メソッド class Test02 extends Test01{ void test02(){ System.out.println("Test 02"); } } アブストラクト クラス Test01を スーパークラス とする サブクラスTest02 必ずオーバーライド public class Sample06b{ public static void main(String[] args){ Test02 dt01 = new Test02(); } 31/33 } インターフェース 32/33 インターフェースとは アブストラクトメソッドだけを宣言するための機能。 インターフェース内には、定数とアブストラクトメソッド のみを記述できる。 インターフェースに基づいたクラスを書くことができる。 このことをインターフェースを実装するという。 データのやり取りの方法を強制するので、インター フェースと呼ばれる。 クラスと異なり、2つのインターフェースを、1つのクラ スに同時に実装できる。 33/33 インターフェースの書き方 書式: interface interface名{ 記号定数の宣言 アブストラクトメソッド } interfaceの中では、記号定数の宣言とアブストラクト メソッドしか書くことができません。 34/33 クラスの書き方 その1 このインターフェースに基づいたクラスを書くことを、 インターフェースを実装すると言います。 インターフェースを実装するには、次のように書きます。 書式: class クラス名 implements interface名{ 省略 } アブストラクトメソッドは、クラス内でオーバーライドする 必要があります。 35/33 クラスの書き方 その2 2つ以上のインターフェースを同時に実装できます。 書式: class クラス名 implements interface名,interface名{ 省略 } , で区切って、インターフェース名を実装したいだけ繋げ ます。 36/33 クラスの書き方 その3 クラスを継承し、さらにインターフェース実装できます。 書式: class クラス名 extends クラス名 implements interface名{ 省略 } 37/33 クラスの拡張とインターフェース クラスを拡張するとき、スーパークラスとして利用できる のは、ただ1つだけ。 インターフェースは、複数を同時に利用できる。 普通の拡張 クラス その1 クラス その2 クラス クラス クラス インターフェース その1 インターフェース その2 クラス クラス 2つのスーパークラス は持てない インターフェースと スーパークラスは同時 にもてる インターフェースは 2つ同時でもOK 38/33 インターフェースの例 interface InterTest01{ double root_2 = 1.41421356; void test01(double ddt); } class Test02 implements InterTest01{ public void test01(double ddt){ System.out.println(ddt*root_2); } } public class Sample07a{ public static void main(String[] args){ Test02 dt01 = new Test02(); dt01.test01(100.0); } } インターフェース インターフェースを 実装したクラス インスタンスを生成。 メソッドを実行。 39/33
© Copyright 2024 ExpyDoc