プログラミング言語2

社会人学習講座
「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