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